考虑一个UIScrollView
有一个子视图。子视图是一个UIImageView
具有以下尺寸限制:
- 它的高度必须等于
UIScrollView
.
- 它的宽度必须是与图像的高度成比例缩放的图像的宽度
UIImageView
.
预计宽度UIImageView
将大于 UIScrollView 的宽度,因此需要滚动。
图像可能会在viewDidLoad
(如果已缓存)或异步。
如何使用自动布局来实现上述内容,并尽可能多地使用界面构建器?
到目前为止我做了什么
基于此answer https://stackoverflow.com/a/13548039/143378我这样配置我的笔尖:
- The
UIScrollView
固定在其超级视图的边缘。
- The
UIImageView
被固定在边缘UIScrollView
.
- The
UIImageView
有一个占位符固有大小(以避免可滚动内容大小不明确 error)
正如预期的那样,结果是UIImageView
的大小为UIImage
,以及UIScrollView
水平和垂直滚动(因为图像大于UIScrollView
).
然后我尝试了各种不起作用的方法:
- 加载图像后手动设置框架
UIImageView
.
- 为 UIImageView 的宽度添加约束,并在图像加载后修改其值。这使得图像更大(?!)。
- Set
zoomScale
图像加载后。没有明显的效果。
没有自动布局
以下代码完全按照我想要的方式执行,尽管没有自动布局或界面生成器。
- (void)viewDidLoad
{
{
UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)];
scrollView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.view addSubview:scrollView];
self.scrollView = scrollView;
}
{
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, self.scrollView.frame.size.width, self.scrollView.frame.size.height)];
imageView.contentMode = UIViewContentModeScaleAspectFit;
imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self.scrollView addSubview:imageView];
self.scrollView.contentSize = imageView.frame.size;
self.imageView = imageView;
}
}
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[self layoutStripImageView];
}
- (void)layoutStripImageView
{ // Also called when the image finishes loading
UIImage *image = self.imageView.image;
if (! image) return;
const CGSize imageSize = image.size;
const CGFloat vh = self.scrollView.frame.size.height;
const CGFloat scale = vh / imageSize.height;
const CGFloat vw = imageSize.width * scale;
CGSize imageViewSize = CGSizeMake(vw, vh);
self.imageView.frame = CGRectMake(0, 0, imageViewSize.width, imageViewSize.height);
self.scrollView.contentSize = imageViewSize;
}
我正在努力转向自动布局,但这并不容易。