码迷,mamicode.com
首页 > 其他好文 > 详细

AutoLayout UITableViewCell 动态高度

时间:2015-07-23 23:29:21      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:

 

从这里http://www.cnblogs.com/liandwufan/p/4516956.html?utm_source=tuicool 转载过来的

 

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

    //

    static NSString * cellid = @"PayMentTableViewCell";

    

    PayMentTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:cellid];

    

    if( !cell )

    {

        cell = [[[NSBundle mainBundle] loadNibNamed:cellid owner:self options:nil] lastObject];

 

    }

    

    [cell refresh:[eventArray objectAtIndex:indexPath.row]];

    

    

    [cell setNeedsUpdateConstraints];

    [cell updateConstraintsIfNeeded];

    

    return cell;

}

 

#pragma mark -

#pragma mark table view delegate methods

 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    // 判断indexPath对应cell的重用标示符,

    static NSString *reuseIdentifier =@"PayMentTableViewCell";

    

    // cell字典中取出重用标示符对应的cell。如果没有,就创建一个新的然后存储在字典里面。

    // 警告:不要调用table viewdequeueReusableCellWithIdentifier:方法,因为这会导致cell被创建了但是又未曾被tableView:cellForRowAtIndexPath:方法返回,会造成内存泄露!

    PayMentTableViewCell *cell = [offscreenCells objectForKey:reuseIdentifier];

    

    if (!cell)

    {

        cell = [[[NSBundle mainBundle] loadNibNamed:reuseIdentifier owner:self options:nil] lastObject];

        

        [offscreenCells setObject:cell forKey:reuseIdentifier];

        

        [cell refresh:[eventArray objectAtIndex:indexPath.row]];

    }

    

    

    

    // indexPath对应的数据内容来配置cell,例如:

    // cell.textLabel.text = someTextForThisCell;

    // ...

    

    // 确保cell的布局约束被设置好了,因为它可能刚刚才被创建好。

    // 使用下面两行代码,前提是假设你已经在cellupdateConstraints方法中设置好了约束:

    [cell setNeedsUpdateConstraints];

    [cell updateConstraintsIfNeeded];

    

    // cell的宽度设置为和tableView的宽度一样宽。

    // 这点很重要。

    // 如果cell的高度取决于table view的宽度(例如,多行的UILabel通过单词换行等方式),

    // 那么这使得对于不同宽度的table view,我们都可以基于其宽度而得到cell的正确高度。

    // 但是,我们不需要在-[tableView:cellForRowAtIndexPath]方法中做相同的处理,

    // 因为,cell被用到table view中时,这是自动完成的。

    // 也要注意,一些情况下,cell的最终宽度可能不等于table view的宽度。

    // 例如当table view的右边显示了section index的时候,必须要减去这个宽度。

    cell.bounds = CGRectMake(0.0f, 0.0f, CGRectGetWidth(tableView.bounds), CGRectGetHeight(cell.bounds));

    

    // 触发cell的布局过程,会基于布局约束计算所有视图的frame

    // (注意,你必须要在cell-[layoutSubviews]方法中给多行的UILabel设置好preferredMaxLayoutWidth值;

    // 或者在下面2行代码前手动设置!)

    [cell setNeedsLayout];

    [cell layoutIfNeeded];

    

    // 得到cellcontentView需要的真实高度

    CGFloat height = [cell.contentView systemLayoutSizeFittingSize:UILayoutFittingCompressedSize].height;

    

    // 要为cell的分割线加上额外的1pt高度。因为分隔线是被加在cell底边和contentView底边之间的。

    height += 1.0f;

    

    return height;

}

 

// 注意:除非行高极端变化并且你已经明显的觉察到了滚动时滚动条的跳跃现象,你才需要实现此方法;否则,直接用tableViewestimatedRowHeight属性即可。

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

{

    // 以必需的最小计算量,返回一个实际高度数量级之内的估算行高。

    // 例如:

    return 200;

}

 

//在自定义UITableViewCell 类中 添加函数

- (void)layoutSubviews

{

    [super layoutSubviews];

    _remarkLab.preferredMaxLayoutWidth = self.contentView.frame.size.width - (10+40+2+34+(25+15));

    _placeLab.preferredMaxLayoutWidth = _remarkLab.preferredMaxLayoutWidth;

    [super layoutSubviews];

}

 

preferredMaxLayoutWidth的值网上的方法都是不对的,我这里用了自己的方法来实现。

 

 

AutoLayout UITableViewCell 动态高度

标签:

原文地址:http://www.cnblogs.com/rollrock/p/4671914.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!