网上找到了一个奇技淫巧 . 不过管用 省事 好使 .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;