iOS项目重构周记

2. Cell中对Layer的处理

骨子里cell中应制止任何对Layer的处理,包涵圆角,阴影,甚至不应当包括别的透明View,因为那种渲染对系统的付出相当大,众多的Cell将使页面变的分外卡,在选取Layer时,也理应使用如下的办法收缩以体系的开支。

self.layer.shouldRasterize = YES;
self.layer.rasterizationScale = [UIScreen mainScreen].scale;
CGPathRef path = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
[self.layer setShadowPath:path];
  • 本篇涵盖UITableView、UICollectionView的缓存、总结、动画等.

继承上一篇,本周的重构重点是UI部分代码的优化。

1.动用UITableView+FDTemplateLayoutCell中度缓存以及落到实处公文实行全文和接到功效
2.当UICollectionView遇上动画拖动效果、圆形放大、书籍播放
3.落到实处collectionViewCell的位移(长按恐怕直接拖拽)
4.详细分享UICollectionView的自定义布局(瀑布流, 线性,
圆形…)

5.iOS
UICollectionView高级用法(长按私下运动cell)-新

6.iOS 即时聊天界面优化心得
7.tableview品质优化之coreText
8.《iOS UITableView 优化》
直播笔记

9.UITableViewCell图片自适应填坑之旅
10.iOS开发仿【喵播】之迅捷集成tableView尾部缩放视图+视图为模糊效果
11.论坛类使用双Tableview翻页效果完成
12.超炫的tableview缩放展开效果封装
13.iOS:根据剧情动态计算中度的UITableViewCell
14.iOS开发–创造一个能够四面滑动的表格
15.iOS
仿热门话题界面(tableView)

16.UITableView自动总计cell中度并缓存,再也不用管高度啦
17.iOS八个 TableView 联合浮动.
思路简单明了,无bug!

18.WWDC2016 Session笔记 – iOS 10
UICollectionView新特性

19.iOS
达成微信朋友圈评论回复功用(二)

20.UITabView卡顿题材与优化
21.1个ViewController中多个tableView(childViewController相关运用)
22.TableView
多图片下载(二十三八线程)缓存难点

23.iOS10中优雅地贯彻可折叠UITableView的思绪
24.【阿峥教你兑现UITableView循环利用】
|那个人追的干货

25.collectionView非整屏滚动(卡片式效果)
26.iOS控件-UICollectionView基本使用详解(OC)
27.一行代码让你的TableView动起来-iOS动画
28.iOS
UITableView体现广大据界面(基于KVO)
———一行代码完毕“空TableView占位视图”管理—-UITableView完结无数据占位图片UITableView没数据时用户提醒如何是好?CYEmptySet:iOS列表占位处理零行代码为App添加万分加载占位图iOS开发造轮子
| 通用占位图
iOS开发 |
UITableView的许多据占位图在类型中的实际行使
包装七个对此无互连网、无内容时体现的库,进来看一下动图秒懂
29.iOS tableViewCell
同时安装圆角和阴影

30.tableView中有个别常用的艺术以及一些科学普及难题
31.什么样让UITableHeaderView的冲天自适应
32.【iOS开发】UITableView优化
33.iOS开发 |
几行代码实现tableView下拉放大表头图片

34.基础好?UITableView的根底你明白多少?
35.cell不复用导致内部存款和储蓄器暴涨的题材:
内部存款和储蓄器从100多MB到700多MB

36.iOS自适应cell行高的那一点破事儿
37.iOS
scrollView嵌套tableView的手势争持化解方案

38.TableView加载图片的优化逻辑
39.Masonry 布局
cell中度适应的一种方案(完成类似朋友圈简单布局)

40.UITableViewCell的测度机制与中度总计
41.将UITableView封装到极致
42.自适应TableViewCell(纯代码)
43.tableView列表联动
44.「翻译」进阶技巧:UITableViewCell的content异步加载的不利化解方案
45.iOS完成七个可变cell复杂界面的制作
46.贯彻外卖选餐时两级tableView联动效果
47.iOS_UI进阶【拖拽排序】的落到实处
48.UICollectionView Cell
任意拖拽重排

49.UICollectionView(一)——全部总括
50.iOS
Cell异步图片加载优化,缓存机制详解。

51.可拖拽重排的CollectionView
52.iOS开发-仿QQ好友列表展开/关闭
53.CollectionView 移动动画
54.UIScrollView的用法
55.控制器瘦身及tableView相关
56.【iOS开发】UITableView和UICollectionView六连串型cell处理,更好地组织代码
57.关于tableview的优化
58.iOS品质优化—tableView懒加载图片
59.iOS
Cell嵌套UIWebView(内附UIWebView详解)

60.【iOS 开发】UICollectionView
集合视图使用汇总

61.iOS
tableview的编写,全选,删除功效

62.TableView优化之迅捷滑动下的忽视加载
63.UITableView+FDTemplateLayoutCell计算行高级中学一年级些缺点的缓解方法
64.怎么写一个向左滑动的UICollectionView?
65.3个简单易行的可进展和收缩的tableview
66.iOS
完结优酷摄像的评头品足回复功用

67.iOS UITableView 表头、表尾、段头、段尾
的坑(二)

68.UICollectionView添加头视图
69.UICollectionViewLayout
属性和章程

70.iOS开发TableView
图片优化

71.UICollectionView多cell样式布局
72.年年有余不难瀑布流布局(一)
73.机动布局4-UITableViewCell自动中度与中度变化
74.iOS开发-达成UIScrollView自定义翻页宽度(每便滑动半页)
75.怎样贯彻手指滑动一屏,scrollVIew滚动半屏或更小
76.iOS
完毕UIScrollView分页滑动宽度自定义

77.TableViewCell的裁减展开与动态中度
78.分明你会使用UICollectionView?四个案列颠覆你的体味
79.代码优化-更不难的tableView,抽离tableView DataSource
Delegate

80.框架结构篇-谈谈怎样写个人基本那类页面(静态tableView页面包车型大巴编写)
81.应用AutoLayout对UITableView的Header和Footer实行布局
82.UITableView之局地刷新的正确行使姿势
83.【一行代码飞速集成tableView底部缩放视图】
84.tableview
多层进行与吸纳demo

85.UITableView
行高自适应+缓存优化

86.http://www.jianshu.com/p/01f61359b30d
87.VVeboTableView源码解析
88.UITableView的Cell复用原理和源码分析
89.怎么优雅地消除tableView上有三种cell
90.CollectionView自定义布局
91.iOS-Autolayout自动总括itemSize的UICollectionViewLayout瀑布流布局
92.iOS
嵌套UIScrollview的滑动争执另一种缓解方案

93.UITableView品质调优
94.UITableView嵌套WKWebView的那个坑
95.# iOS回想笔记(09) —
Cell的拉长、删除、更新、批量操作

96.iOS实现较复杂的瀑布流布局效果

1. AutoLayout及Masonry

AutoLayout是苹果在IOS6中出产的一种新的UI营造方式,目的在于缓解不相同显示屏分辨率之间的适配难题。相信大多数人只怕跟自家同样,对那种方式是又爱又恨,因为AutoLayout中确实存在重重坑。可是随着iOS设备尺寸更加多,仍旧值得去学习精晓AudoLayout的。
这一次重构中在UITableViewCell中央银行使AutoLayout上碰见了1个坑,不奇怪意况下在cell中动用AutoLayout需安装约束上下左右都为-8才能铺满全体Cell。但发今后iOS6中从未难题,但在iOS7之上,左右束缚需安装为-15才能铺满。笔者的消除方案是在cell.contentView上再添加一层父View,针对区别的系统做了3个适配。但难题的根本原因近年来还并未找到,有待继续观望。
除此以外,对于手写约束来说,使用苹果原生的API大概会很惨痛,因为约束代码将又臭又长,例如:

[self.view addConstraint: [NSLayoutConstraint constraintWithItem:AView
attribute:NSLayoutAttributeLeft
relatedBy:NSLayoutRelationEqual
toItem:BView
attribute:NSLayoutAttributeLeft
multiplier:1
constant:0]];

仅代表AView的左边距离BView的左边一个单位,所以有须要引入一些第贰方工具。
Masonry是四个轻量级的布局框架 拥有自身的描述语法
选取更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时扶助iOS 和 马克斯 OS X。
地方那句使用Mansory可以简单为:

[AView mas_makeConstraints:^(MASConstraintMaker *make) {
    make.left.equalTo(BView.left).with.offset(1);
}];

一个View的三个约束能够在同贰个Block中贯彻,并且代码书写方式令人更便于精晓。
越多应用技术请戳:Masonry

小摩丝.jpg

3. UITableViewCell中嵌套UITableView

看看网上有人说应该幸免在UITableViewCell中央银行使UITableView,笔者觉得能够视须要的两样做区别的处理。对于三个模子结构相当复杂的TabeView,嵌套TableView能够下落代码的耦合,将差异的业务模型分散处理。只是须要小心的是,子TableView和父TableView的贯彻不应有在同二个文件中处理,也正是说delegate和dateSource不该针对同三个对象,能够将子TableView封装成2个Cell,delegate和dataSource都交由这几个Cell处理,那样才能有效下跌代码的耦合,并且精简原来的小说件的逻辑和尺寸。

图片 1

4. UITableView中间层模型的包裹

深信不疑广大人会Cell的展示逻辑直接放到TableView的delegate中拍卖,例如:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if (A) {
        if(B){ 
            return BHeight;
        }
        return AHeight;
    }else if (C) {
        if(B){ 
            return BHeight;
        }
        return CHeight;
    }
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(A){
        if(B) {
            return 2;
        }
        return 1;
    }else if(C) {
        if(B){ 
            return 2;
        }
        return 1;
    }
    return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(A) {
        if(B) {
            return BCell;
        }
        return ACell;
    }else if(C) {
        if(B){ 
            return BCell;
        }
        return CCell;
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(A) {
        if(B) {
            doB();
        }
        doA();
    }else if(C) {
        if(B){ 
            doB();
        }
        doC();
    }
}

怀有代理中的逻辑都不能够分裂,而且同样的点子要写多次,例如地点的B。使用那样的主意,当蒙受逻辑非凡复杂的TableView时将使我们苦不堪言。TableView的代办应该只承担去营造Cell,而不该来拍卖逻辑判断。所以,大家相应营造1个中路的模型层,在TableView
reloadData的时候加载这些模型层,例如:

- (void)setupTableModel
{
    if(A) {
        if(B) {
            [arrayModel addObject:BModel];
        }
        [arrayModel addObject:AModel];
    }else if(C) {
        if(B){ 
            [arrayModel addObject:BModel];
        }
        [arrayModel addObject:CModel];
    }
}

- (void)reloadTable
{
    [self setupTableModel];
    [tableView reloadData];
}

此时:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[array objectAtIndex:row] isEqual:AModel]) {
        return AHeight;
    }else if ([[array objectAtIndex:row] isEqual:BModel]) {
        return BHeight;
    }else if ([[array objectAtIndex:row] isEqual:CModel]) {
        return CHeight;
    }
    return 0;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return arrayModel.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[array objectAtIndex:row] isEqual:AModel]) {
        return ACell;
    }else if ([[array objectAtIndex:row] isEqual:BModel]) {
        return BCell;
    }else if ([[array objectAtIndex:row] isEqual:CModel]) {
        return CCell;
    }
    return nil;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    if ([[array objectAtIndex:row] isEqual:AModel]) {
        doA();
    }else if ([[array objectAtIndex:row] isEqual:BModel]) {
        doA();
    }else if ([[array objectAtIndex:row] isEqual:CModel]) {
        doA();
    }
}

此时的delegate中只关心tableView的Cell构建和Cell行为,并不关切其余营造顺序等逻辑判断。