iOS-设置UITableViewCell之间的间距, 从xib中加载另一个xib,一个cell用到普通的view上

网上找到了一个奇技淫巧 . 不过管用 省事  好使 .https://blog.csdn.net/u014220518/article/details/51995989

重新设置的UITableViewCell的 frame。

代码如下:


#import "NewsCell.h"

@implementation NewsCell

- (void)awakeFromNib {
    [super awakeFromNib];
    // Initialization code
}



- (void)setFrame:(CGRect)frame{
    
    frame.origin.y += 10;
    frame.size.height -= 10;
    
    [super setFrame:frame];
    
}



@end

效果如下:

 


看小伙伴的代码,发现一个写的很好的东西 , 先说场景 , 我自己封好了一个显示9宫格图片的View (NineImageView),并且使用了xib来设置了约束 ,NineImageView.xib中的UIView关联为NineImageView ,  现在想在cell中也需要使用这个9宫格的view . 

方法1 : 在cell中添加一个普通的UIView 取名 为midView , 然后在cell的awakeFormNib中,使用 self.midView addSubView的方式添加9宫格view . 

方法2 : 直接在cell中设置一个view为NineImageView, 然后取消NineImageView.xib中UIView与NineImageView的关联, 在NineImageView.m中重写initWithCoder方法 , 完成加载 . 注意 , 类的关联只能有一个 , 比如在cell中的一个view关联为NineImageView,那么NineImageView.xib的View关联一定要取消掉,同时存在2个关联会出错的. 

还有在NineImageView.xib中设置下 file's Owner 为NineImageView , 不然从NineImageView.xib中是无法拖出线的

https://github.com/guochaoshun/customUIButton_xibLoadFromAnotherNib


在A页面上有一个UITableView已经写好了一个自定义的cell,运行非常完美. 突然产品说B页面也需要这个视图,view的样子和cell是一样的.
额,这时候想到了2种方式, 一种是在来一个自定义的view,然后加到B页面上,但是后期前面改的话,后面也需要跟着改,有点麻烦.
第二种方式, 把这个cell当做一个普通的view加到B页面上,一套代码,改样式的话非常方便.


cell的高度动态计算, 方法很多(比如 tableView.estimatedRowHeight), 这里在加一个. 

首先, 在Cell对应的xib文件中建立完整的约束,cell高度的不一样,大多数都是由于cell中label文字的不确定造成的,才产生了cell高度自适应这个问题。因此,label是关键。

以前解决cell高度问题,是根据label内容先计算label,然后再加上其他的固定高度,返回给代理方法,或者首先计算完所有高度,放到一个数组里,然后直接返回,总共计算一次就行了。不用没返回一次计算一次。这种办法没啥大问题。不过既然系统给了cell高度的计算办法,肯定比自己主动计算效率高。

这个方法就是systemLayoutSizeFittingSize。我的理解就是通过autolayout使用这个方法自动计算出cell的高度,

[cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize]

一定是cell.contentView,不能用cell。

注意:systemLayoutSizeFittingSize这个方法是cell.contentView调动,返回的contentView的size,所以最后+1,分割线的高度。
并且必须有实例对象调用,所以做一个全局变量self.temCell,不用每次调用都新建cell对象, 也可以从复用池中取值. 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    
//    模拟的数据
    if (indexPath.row % 2) {
        
        self.temCell.contentLab.text = @"我们睡觉族自然也没闲着,每天早晨从中午开始,当一天和尚撞一天钟或者干脆连钟都不撞。上厕所、吃饭,看NBA、打篮球,上网、约会;各有各的一份事做。天天如此,日子也就在这些单调无聊的事情中被消耗。回过头来看看强哥,那才真叫一个收获满满。拿到了国家英语四六级证书,计算机二级证书,普通话一级乙等证书等各类证书,国家奖学金,以及保送研究生的资格。";
    }else{
        self.temCell.contentLab.text = @"除了这些能看得到的收获,强哥还有一件更牛逼的本领,那就是精通计算机。组装,修理,装系统,制作表格,处理照片,以及各类软件,均不在话下。因此,他想找份工作,易如反掌因此";
    }
    
//    先确定label的最大宽度,根据自己需求确定宽度
    CGFloat preMaxWaith = SCREENWIDTH - 96;
    [self.temCell.contentLab setPreferredMaxLayoutWidth:preMaxWaith];
    
//    直接返回cellsize,最后+1,是cell分割线的高度
    CGSize cellSize = [self.temCell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
    return cellSize.height + 1;
}


Plain, 分区头是悬浮状态 sectionHeight 默认是0
Grouped 分区头是随着tableView滑动会滑出窗口外, sectionHeight 默认有一定的高度
如果不想有间隔设置_tableView.sectionFooterHeight = 0;
_tableView.sectionHeaderHeight = 0;

UITableView 的StyleGrouped样式,与顶部有差不多35 的间距:
在第一个cell顶部的无非是2种情况, tableHeaderView和sectionHeader, 需要设置tableHeaderView,这样才有效,把tableHeaderView = [UIView new],也是没有用。

tableHeaderView需要创建一个view实例,且frame不能设置为CGRectZero。
self.tableView.tableHeaderView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, kScreenWidth, CGFLOAT_MIN)];

这样顶部的高度就消失了, 如果还有高度就在检查下tableView的sectionHeader高度是不是0;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值