在上周, 我们已经通过Ps将Lifestyle页面给设计出来了, 本周我们就可以按照设计图纸进行开工啦, 今天我们就按部就班的完成LifestyleViewController的第一个功能无限轮播图!!
无限轮播图, 这种简单的功能没什么技术含量, 实现的方式也各种各样, 技术含量较高的分为:
1) UIScrollView二图流
(就是两张图之间来回切换) 这个对算法的要求比较高, 一般不推荐自己写, 使用网上现成封装好的就好啦.
2) UICollectionViewLayout布局流
(使用自定义Layout布局) 这种对算法要求极高, 不过一劳永逸, 使用方便快捷低耦合.
还有其他的实现的方法我也不一一列举, 在SQExtension中也有封装好的SQInfiniteCell可以使用, 今天我推荐的方法是投机流
那什么是投机流呢, 且听我娓娓道来. 先回到我们的项目, 经过设计图分析,首先我们先将导航栏进行隐藏, 隐藏的方式各种各样, 可以直接setHidden
但是为了我们之后的功能, 先按如下设置:
隐藏导航栏
1 2 3 4 5 6 |
- (void)loadView { [super loadView]; [self.navigationItem setTitleView:[UIView new]]; [self.navigationController.navigationBar setBackgroundImage:[UIImage imageWithColor:[UIColor clearColor]] forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar setShadowImage:[UIImage imageWithColor:[UIColor clearColor]]]; } |
隐藏导航栏 我选择的方式是将导航栏填充透明背景色而不是将其隐藏. setTitleView
是因为之前的框架有KVO属性, 接下来我们将tableView向上偏移64 _tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0);
1 2 3 4 5 6 7 8 9 10 11 |
- (UITableView *)tableView { if (!_tableView) { _tableView = [UITableView new]; _tableView.frame = self.view.bounds; _tableView.dataSource = self; _tableView.delegate = self; _tableView.contentInset = UIEdgeInsetsMake(-64, 0, 0, 0); } return _tableView; } |
这样我们几步简单的操作, 就将导航栏给隐藏了, 接下来我们需要自定义Cell.
自定义cell
自定义Cell 的方式也是各有不同, 写法也大不一样, xib, 代码流等等, 我是属于纯代码流的, 并不是说我不会用AutoLayout, 而是我觉得用xib写自定义控件的效率和可维护性 还是比较低下的, 但这是今后的趋势Apple的开发这种可见即可得的出发点就是让我们不用关心展示层, 而更加关心业务逻辑.
扯远了… 我们现在使用纯代码, 之前我有讲过代码库这个功能, 就不过多赘述, 我们使用代码库在.h文件和.m文件中添加:
.h
1 2 3 |
+ (instancetype)cellWithTableView:(UITableView *)tableView; + (CGFloat)cellHeight; |
.m
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
+ (instancetype)cellWithTableView:(UITableView *)tableView { NSString * identifier = NSStringFromClass([<#class#> class]); <#class#> * cell = [tableView dequeueReusableCellWithIdentifier:identifier]; if (!cell) { cell = [[<#class#> alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; } return cell; } - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { [self setupSubviews]; } return self; } - (void)setupSubviews { } - (void)layoutSubviews { [super layoutSubviews]; } + (CGFloat)cellHeight { return <#cellHeight#>; } |
接着我们在tableView的
cellForRow
和heightForRow
代理方法中添加: