具有动态高度的Autolayout

时间:2016-10-25 06:10:52

标签: ios objective-c autolayout

我正在尝试创建一个UIView的子类,它将显示一个固定大小的UIImages列表,类似于UILabel显示字母的方式。
如果所有图像都不适合一行,则图像排列在多行。

如何使用自动布局实现此目的,这样如果我将此视图放在UIStackView中,图像将被正确列出?

以下是使用固定位置进行的示例:

- (void) layoutSubviews{
    [super layoutSubviews];

    CGRect bounds = self.bounds;
    CGRect imageRect = CGRectMake(0, 0, 30, 30);
    for (UIImageView* imageView in self.imageViews){
        imageView.frame = imageRect;
        imageRect.origin.x = CGRectGetMaxX(imageRect);
        if (CGRectGetMaxX(imageRect) > CGRectGetMaxX(bounds)){
            imageRect.origin.x = 0.0;
            imageRect.origin.y = CGRectGetMaxY(imageRect);
        }
    }
}

更新: 这是一个展示问题的示例项目。 https://github.com/datinc/DATDemoImageListView

这里是ImageListView的链接 https://github.com/datinc/DATDemoImageListView/blob/master/DATDemoImageListView/DATDemoImageListView.m

1 个答案:

答案 0 :(得分:0)

您应该覆盖intrinsicContentSize,返回视图的首选内容大小。

问题在于intrinsicContentSize视图中没有它的最终界限。您可以使用内部高度约束,并覆盖updateConstraints

- (void)updateConstraints {
    CGFloat theWidth = CGRectGetWidth(self.bounds);
    NSUInteger theCount = [self.subviews count];
    CGFloat theRows = ceilf(theCount / floorf(theWidth / 30.0));

    self.heightConstraint.constant = 30.0 * theRows;
    [super updateConstraints];
}

viewDidAppear:和布局更改(例如旋转)中,您必须调用setNeedsUpdateConstraints才能获得图像视图的正确初始布局。