考虑UIScrollView
具有单个子视图的 a。子视图UIImageView
具有以下大小约束:
- 它的高度必须等于 的高度
UIScrollView
。 - 它的宽度必须是与
UIImageView
.
预计宽度UIImageView
会大于 UIScrollView 的宽度,因此需要滚动。
图像可能在viewDidLoad
(如果缓存)期间或异步设置。
您如何使用自动布局实现上述功能,尽可能多地使用界面生成器?
到目前为止我所做的
基于这个答案,我这样配置我的笔尖:
- 被
UIScrollView
固定在其父视图的边缘。 - 被
UIImageView
固定到 的边缘UIScrollView
。 - 具有
UIImageView
占位符固有大小(以避免Scrollable Content Size Ambiguity错误)
正如预期的那样,结果是 的UIImageView
大小与 的大小相同UIImage
,并且UIScrollView
水平和垂直滚动(因为图像大于UIScrollView
)。
然后我尝试了各种不起作用的东西:
- 加载图像后手动设置框架
UIImageView
。 - 为 UIImageView 的宽度添加一个约束,并在加载图像后修改其值。这使得图像更大(?!)。
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;
}
我正在努力转向自动布局,但这并不容易。