使用包含带有UITableViewAutomaticDimension的图像视图单元格的自定义UITableView

时间:2015-07-31 02:44:07

标签: ios objective-c uitableview autolayout

在我的新应用中,我试图在整个过程中采用AutoLayout。在我的一个表视图中,我有一个图像视图和一个标签。如果我在我的控制器viewDidLoad:方法

中执行此操作
self.tableView.rowHeight = UITableViewAutomaticDimension;

行不够高,无法容纳图像。 (我在图像视图中添加了固定宽度和高度限制。)

如果我删除该语句,则单元格的高度是IB中设置的高度。

我必须在我的UITableCell课程中实现一种方法来告诉AutoLayout系统我的最低身高要求吗?或者我做错了什么?

enter image description here

1 个答案:

答案 0 :(得分:0)

好吧,我永远无法用IB来解决这个问题。但是,我确实手动添加了约束,所以我认为值得分享我的完整解决方案。 (请记住:图像视图,标签,动态文本)。无论内容有多大,我希望我的图像始终为80 x 80。

享受。

-(id)initWithCoder:(NSCoder *)aDecoder {
    if ( !(self = [super initWithCoder:aDecoder]) ) return nil;

    // TODO: Add an imageview and populate it
    _titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(0,0,300,20)];
    _titleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
    _titleLabel.numberOfLines = 0;
    [self.contentView addSubview:_titleLabel];

    _albumArtImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 80, 80)];
    [_albumArtImageView setTranslatesAutoresizingMaskIntoConstraints:NO];

    [self.contentView addSubview:_albumArtImageView];

    NSMutableArray* constraints = [NSMutableArray new];
    UIView* contentView = self.contentView;

    [_titleLabel setTranslatesAutoresizingMaskIntoConstraints:NO];

    // _titleLabel to contentView
    [constraints addObject:[NSLayoutConstraint
                            constraintWithItem:_titleLabel
                            attribute:NSLayoutAttributeFirstBaseline
                            relatedBy:NSLayoutRelationEqual
                            toItem:contentView
                            attribute:NSLayoutAttributeTop
                            // as font grow, space from top grows
                            multiplier:1.8
                            constant:30]];

    // similarly for bottom
    [constraints addObject:[NSLayoutConstraint
                            constraintWithItem:contentView
                            attribute:NSLayoutAttributeBottom
                            relatedBy:NSLayoutRelationGreaterThanOrEqual
                            toItem:_titleLabel
                            attribute:NSLayoutAttributeLastBaseline
                            multiplier:1.3
                            constant:8]];


    [constraints addObject:[NSLayoutConstraint
                            constraintWithItem:contentView
                            attribute:NSLayoutAttributeHeight
                            relatedBy:NSLayoutRelationGreaterThanOrEqual
                            toItem:nil
                            attribute:0
                            multiplier:1.0
                            constant:80]];


    // Now the imageView
    [constraints addObject:[NSLayoutConstraint
                            constraintWithItem:_albumArtImageView
                            attribute:NSLayoutAttributeHeight
                            relatedBy:NSLayoutRelationEqual
                            toItem:nil
                            attribute:0
                            multiplier:1.0
                            constant:80]];

    [constraints addObject:[NSLayoutConstraint
                            constraintWithItem:_albumArtImageView
                            attribute:NSLayoutAttributeWidth
                            relatedBy:NSLayoutRelationEqual
                            toItem:nil
                            attribute:0
                            multiplier:1.0
                            constant:80]];

    // for horizontal
    [constraints addObjectsFromArray:
            [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-2-[_albumArtImageView]-5-[_titleLabel]-15-|"
            options:0 metrics:nil views:NSDictionaryOfVariableBindings(_titleLabel,_albumArtImageView) ]];



    [self.contentView addConstraints:constraints];

    return self;
}