暑假总结
文章目录
- 暑假总结
- 前言
- 自动无限轮播图
- UITableView
- 给不同组设置独立的cell
- 设置cell宽度
- 设置组间距
- 折叠cell
- CALayer的简单使用
- CALayer实现一个视图裁剪
- CALayer的contentGravity的属性
- CALayer设置背景图
- 自定义UIColor
- 网络请求
- 正则表达式
- 小结
前言
笔者在暑假通过几个项目学习了一些iOS开发入门的相关知识,这里笔者对于大部分内容进行一个总结。
自动无限轮播图
第一个项目中用到的自动无限轮播图,可以说是项目的开始,无限轮播图的思路主要还是设置需要图片数量+2张的图片。
下面是有关图片的实现:
图片选自无限轮播图
我们可以通过设置UIScrollview的相关协议函数以及设置定时器的方式来实现一个无限轮播的效果。下面主要给出一下相关的实现代码。
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
CGFloat contentOffsetX = scrollView.contentOffset.x;
CGFloat width = [UIScreen mainScreen].bounds.size.width;
CGFloat contentWidth = scrollView.contentSize.width;
if (contentOffsetX >= contentWidth - width) { // 滑到倒数第一张图片时候,调整到倒数第二张照片的位置
[scrollView setContentOffset:CGPointMake(width, 0) animated:NO];
} else if (contentOffsetX <= 0) { // 滑动到第一张图片的时候在进行一个特判,调整到第一张照片的位置
[scrollView setContentOffset:CGPointMake(contentWidth - 2 * width, 0) animated:NO];
} else {
self.page.currentPage = (contentOffsetX / width) - 1;
}
}
UITableView
整个暑假中最重要的还是如何使用UITableView,虽然笔者在之前学习有关内容,但是还是过于浅显,这里在重新讲一下暑假中对于自UITableVIew的一些使用。
给不同组设置独立的cell
我们可以定义不同的标识符,然后通过判别一下有关不同的组来返回我们不同的cell。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
homeTableViewCell *cell02 = [self.mainTableView dequeueReusableCellWithIdentifier:@"button"];
homeTableViewCell *cell01 = [self.mainTableView dequeueReusableCellWithIdentifier:@"advertise"];
homeTableViewCell *cell03 = [self.mainTableView dequeueReusableCellWithIdentifier:@"music"];
homeTableViewCell *cell04 = [self.mainTableView dequeueReusableCellWithIdentifier:@"myself"];
homeTableViewCell *cell05 = [self.mainTableView dequeueReusableCellWithIdentifier:@"recommend"];
if (indexPath.section == 0) {
return cell01;
} else if (indexPath.section == 1) {
return cell02;
} else if (indexPath.section == 2){
return cell03;
} else if (indexPath.section == 3){
return cell04;
} else if (indexPath.section == 4){
return cell05;
} else {
return nil;
}
}
设置cell宽度
在实际开发中我们,可能需要设置cell与我们的手机边缘留有空隙,所以我们这里需要设置一下UITableView的setFrame的方法,
我们可以通过这个方法来设置相应的cell的宽度。
- (void)setFrame:(CGRect)frame {
}
设置组间距
在之前对于cell的学习中没有涉及到有关组间距的方法,但在实际开发中我们又会用到设计组间距的方式。
实际上,我们可以通过给设置空白VIew的方式来给我们的UITableView设置组间距。
-(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
if(section == 0) {
return 0.001;
} else {
return 12;
}
}
-(CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section{
return 12;
}
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView;
if (section == 0) {
headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 0.001)];
} else {
headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 12)];
}
return headerView;
}
折叠cell
在仿写的过程中,学习了一个简单的折叠cell,下面主要给出相关的代码,其实思路就是通过点击按钮,来修改我们UITableView的一个frame从而可以展示不同的内容。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
NSString* str = _ary[indexPath.section];
[_ary removeObjectAtIndex:indexPath.section];//删除这个位置的字符串
[_ary insertObject:str atIndex:0];//插入在首位
[tableView reloadData]; //记得刷新单元格
[self press:_btn]; //显示所有内容
}
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell* cell = [tableView dequeueReusableCellWithIdentifier:@"id"];
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
cell.textLabel.text = self.ary[indexPath.section];
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 30;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 4;
}
-(void)press:(UIButton*)btn {
btn.selected = !btn.selected;
if (btn.selected) {
self.tableView.frame = CGRectMake(240, 180, 120, 120);
} else {
self.tableView.frame = CGRectMake(240, 180, 120, 30);
}
}
CALayer的简单使用
CALayer在暑假期间我简单进行了一下学习,自己也写了一篇博客简单总结了一下CALayer这里不介绍原理,简单的讲解一下有关的一些方法。
CALayer实现一个视图裁剪
我们可以通过这种方式来实现一个视图的裁剪。
self.Podfilebutton.layer.masksToBounds = YES;
self.Podfilebutton.layer.cornerRadius = self.Podfilebutton.frame.size.width / 2;
CALayer的contentGravity的属性
在实践中我们可能会遇到一些图片被拉伸的问题,这时候,我们最好的方法是把contentMode属性设置成更合适的值,这样可以让我们的图片不被拉伸。
view.contentMode = UIViewContentModeScaleAspectFit;
CALayer设置背景图
这样可以给我们的图片设置背景图片。
layer.contents = (__bridge id)image.CGImage;
自定义UIColor
在iOS的实际开发中我们经常需要使用自定义color。这里简单讲解一下有关UIColor的内容,我们可以使用mac上的颜色选择器得到相应颜色,然后将这几个值写到下面的方法中就可以了。
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
网络请求
网络请求笔者在天气预报中已经进行了一个简单的讲解,这里就不多赘述。
正则表达式
在很多项目中间,我们需要限制输入的字符种类,不可以输入除了英文和数字其他的字符,这时候,我们就需要用到OC中的正则表达式的相关内容,来实现一个限制字符的效果。
笔者只会一个简单的使用,这里简单介绍一下相关的方法和对应的类别。
在OC这个语言中我们最主要还是运用NSPredicate
这个类别。
这里笔者引用一段别人的文字来介绍一下NSPredicate
:
NSPredicate类是用来定义逻辑条件约束的获取或内存中的过滤搜索,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配。使用NSPredicate可以有效地过滤和查询数据,提高数据处理的效率和灵活性。在Core Data中,NSPredicate常用于构建Fetch请求,从数据库中检索符合特定条件的数据。同时,在使用集合类(如NSArray、NSDictionary)时,NSPredicate也可以用来对数据进行过滤和排序。
所以我们需要对于这个类别的一些方法进行一个简单的了解。
predicateWithFormat:
创建一个谓词。
+ (id)predicateWithFormat:(NSString *)format...;
笔者仅仅简单了解了部分内容,仅仅知道通过MATCHES来让左侧表达式来匹配右侧的表达式
这里给出一些相关谓词:
evaluateWithObject:
接受对象,根据指定的对象计算自身的值。
-(BOOL)evaluateWithObject:(id)value;//通过这个方法来判断是否符合左侧表达式是否符合右侧表达式。
- (BOOL)classInputShouldNumber:(UITextField*)textfield {
NSString *regex = @"^[\u4e00-\u9fa5]{2,4}\\d{4}$";//限制前面的字符为中文字符个数为2-4,后面限制的数字个数永远为4
NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];//创建一个谓词
if (![pred evaluateWithObject:textfield.text]) {
return NO;
}
return YES;
}
通过这里的方式,我就可以实现一个简单的限制字符的输入以及设置文字的相关格式的效果。
笔者这里简单介绍一下相关用法,如果想详细了解相关内容,可以看「OC」NSPredicate —— 使用谓词过滤元素
小结
这就是笔者对于暑假学习内容的一个简单的总结,暑假学习的内容很多还需要多多沉淀与复习。