我正在尝试创建一个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
答案 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
才能获得图像视图的正确初始布局。