Kullback-Leibler

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];

事先记下来,今天赶上Kullback-Leibler
measure,在网上寻找了瞬间,找到了Kullback-Leibler
距离,即KL距离,Kullback-Leibler
Divergence,地址是https://www.cnblogs.com/ywl925/archive/2014/02/18/3554502.html,就先记下来吧,过几天有时间再来整理。

3. UITableViewCell中嵌套UITableView

看看网上有人说应该避免在UITableViewCell中采用UITableView,我以为可以见到需求的不比做不同之处理。对于一个模型结构非常复杂的TabeView,嵌套TableView可以下降代码的耦合,将不同之工作模型分散处理。只是用注意的凡,子TableView同父TableView的兑现不该当与一个文书被处理,也就是说delegate和dateSource不应有针对同一个对象,可以用子TableView封装成一个Cell,delegate和dataSource都到由是Cell处理,这样才会有效降低代码的耦合,并且精简原文件之逻辑与分寸。

延续之牵线反至:http://www.cnblogs.com/mmgf/p/8039884.html

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,而未应来处理逻辑判断。所以,我们理应构建一个中路的模型层,在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行为,并无关注其他构建顺序等逻辑判断。

此起彼伏上同一首,本周之重构重点是UI部分代码的优化。

1. AutoLayout及Masonry

AutoLayout是苹果于IOS6遭遇出的平种新的UI构建方式,旨在缓解不同屏幕分辨率之间的适配问题。相信大部分人口或跟我一样,对这种艺术是同时容易又怨,因为AutoLayout中真的有诸多坑。不过随着iOS设备尺寸越来越多,还是值得去学习掌握AudoLayout的。
此次重构中于UITableViewCell中使AutoLayout上相见了一个坑,正常状态下以cell中使用AutoLayout需安装约上下左右还也-8才能够铺满所有Cell。但意识以iOS6遭遇从不问题,但每当iOS7之上,左右约需安装也-15才能够铺满。我之解决方案是在cell.contentView上再度续加相同交汇父View,针对不同之体系召开了一个适配。但问题之根本原因目前尚没有找到,有待继续观察。
另外,对于手写约束来说,使用苹果原生的API可能会见大痛苦,因为约代码用又臭又长,例如:

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

独代表AView的左侧距BView的左一个单位,所以发生必要引入一些老三正值工具。
Masonry是一个轻量级的布局框架 拥有自己之叙说语法
采用重新优雅的链式语法封装自动布局 简洁明了 并兼有高但读性 而且同时支持
iOS 和 Max OS X。
点那句以Mansory可以简单为:

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

一个View的大半单框好于同一个Block中实现,并且代码书写方式为人另行便于了解。
重新多用技巧请戳:Masonry