UITableView和UICollecionView自适应

作者: FlyElephant | 来源:发表于2016-05-08 14:45 被阅读2521次

UITableView中在iOS8之前经常会遇到需要计算UITableViewCell单元格的高度,UICollectionViewCell同样会遇到这样的情况,不过在iOS8之后宽高计算就非常简单了,只需要简单设置一下即可.

UITableView自适应

简单看一下效果:


UITableViewCell.png

UITableView通用设置:
<pre><code>`
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return [self.data count];
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
BookTableViewCell *cell=[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
[cell setupModel:self.data[indexPath.row]];
return cell;
}</code></pre> 初始化数据: <pre><code>
self.tableView.estimatedRowHeight=120.0f;
self.tableView.rowHeight=UITableViewAutomaticDimension;
self.data=[NSMutableArray array];
[self.tableView registerClass:[BookTableViewCell class] forCellReuseIdentifier:CellIdentifier];

for (NSInteger i=0; i<30; i++) {
    BookModel *model=[BookModel new];
    model.imgName=@"Book";
    model.bookName=@"UITableViewCell";
    NSInteger mode=i%3;
    if (mode==0) {
        model.bookDescription=@"魏则西,男,二十一岁,生前就读于西安电子科技大学,计算机专业学生,因身患滑膜肉瘤去世。魏则西曾经的梦想是每天玩命学习,每天取得巨大的进步,大四之后去美国好好学学计算机,那会是他人生最大的幸福。";
    }else if (mode==1){
        model.bookDescription=@"滑膜肉瘤是一种恶性肿瘤,目前尚无有效治疗手段。魏则西是家中独子,父母倾尽全力为他治病。辗转北京、上海、天津、广州各大肿瘤医院,得到的都是坏消息。魏则西在百度搜索疾病信息,第一条结果是某武警医院(武警北京总队第二医院)的所谓「生物免疫疗法」。魏则西一家人在北京见到了这家武警医院的李姓主任,李主任言:这个技术不是他们的,是斯坦福研发出来的,他们是合作,有效率达到百分之八九十。看着魏则西的各种报告单,李主任对魏则西父母说:保二十年没问题。正所谓典型的套路:「病很重,能治好,得花钱」。";
    }else if(mode==2){
        model.bookDescription=@"魏则西一家人求医心切,但也会有所顾虑,这不会是骗人的吧?不过一看这的确是一家三甲医院,魏则西还专门查了一下这个医生,这个李主任还上过中央电视台,不止一次,中央电视台十套节目。会是假的吗?你看,百度、三甲医院、中央台,还是斯坦福的技术,这些应该没有问题了吧。";
    }
    [self.data addObject:model];
}

</code></pre> UITableViewCell设置预估高度: <pre><code>
self.tableView.estimatedRowHeight=120.0f;
self.tableView.rowHeight=UITableViewAutomaticDimension;</code></pre> 顺便可以设置一下删除模式: <pre><code>
-(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath{
return @"删除";
}

  • (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
    [self.data removeObjectAtIndex:indexPath.row];
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
    }else if (editingStyle==UITableViewCellEditingStyleInsert){
    NSInteger insertRow=indexPath.row+1;
    BookModel *model=[BookModel new];
    model.imgName=@"Book";
    model.bookName=@"UITableViewCell";
    model.bookDescription=[NSString stringWithFormat:@"插入成功:%ld",insertRow];
    [self.data insertObject:model atIndex:insertRow];
    [tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForItem:insertRow inSection:indexPath.section]] withRowAnimation:UITableViewRowAnimationAutomatic];
    }
    }`</code></pre>

设置插入模式:

Snip20160508_3.png
<pre><code>-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath { return UITableViewCellEditingStyleInsert; }</code></pre>

UICollectionView自适应

自适应效果图:


FlyElephant.png

UICollectionView数据初始化:

UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.estimatedItemSize = CGSizeMake(100, 100);
[self.collectionView registerClass:[BookCollectionViewCell class] forCellWithReuseIdentifier:CollectionViewIdentifier];
self.collectionView.backgroundColor      = [UIColor redColor];
self.collectionView.collectionViewLayout = layout;
self.data                                = [NSMutableArray array];

[self.data addObject:@"北京"];
[self.data addObject:@"FlyElephant"];
[self.data addObject:@"编程"];
[self.data addObject:@"加班"];
[self.data addObject:@"Objective-C"];
[self.data addObject:@"iOS"];
[self.data addObject:@"UICollectioView自适应"];

}
UICollectionView初始化:
<pre><code>`

  • (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView {
    return 1;
    }

  • (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return [self.data count];
    }

  • (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    BookCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CollectionViewIdentifier forIndexPath:indexPath];
    cell.contentLabel.text = self.data[indexPath.row];
    return cell;
    }</code></pre> 自定义BookCollectionViewCell: <pre><code>
    @implementation BookCollectionViewCell

-(instancetype)initWithFrame:(CGRect)frame{
self=[super initWithFrame:frame];
if (self) {
self=[[[NSBundle mainBundle] loadNibNamed:@"BookCollectionCell" owner:self options:nil] firstObject];
self.backgroundColor=[UIColor darkGrayColor];
self.clipsToBounds=YES;
}
return self;
}

-(void)layoutSubviews{
[super layoutSubviews];
self.clipsToBounds=YES;
self.layer.cornerRadius=self.frame.size.width/8;
}

@end`</code></pre>
iOS8之后的UITableView和UICollectionView自适应都比较简单设置高度即可,有疑问欢迎讨论~

相关文章

网友评论

  • Ko_Neko:求博主给个ios 8以后自适应高度的demo。感谢
  • angelen:是不是写漏了什么?按照你这样写的话,根本没有根据文字宽度自适应的,能提供一下源代码吗?
    angelen:@ARedDandelion soga😮
    a5c2ca6e1953: 作者在nib中设置了约束,这个前提作者没说。。。
  • Hero_Guo:能解释一下下面这行代码吗?
    self=[[[NSBundle mainBundle] loadNibNamed:@"BookCollectionCell" owner:self options:nil] firstObject];

    为什么我运行的时候会 crash. 报错的是这行代码
    CoderFM:@Hero_Guo 没看懂作者的意图,代码加载里又从Nib里加载,那一句代码就是从Nib加载
  • Rchongg:谢谢

本文标题:UITableView和UICollecionView自适应

本文链接:https://www.haomeiwen.com/subject/dppsrttx.html