【发布时间】:2013-11-07 04:03:27
【问题描述】:
考虑一个带有单个子视图的UIScrollView。子视图是UIImageView,具有以下大小限制:
- 它的高度必须等于
UIScrollView的高度。 - 其宽度必须是与
UIImageView的高度成比例缩放的图像宽度。
预计UIImageView的宽度会大于UIScrollView的宽度,因此需要滚动。
图像可能在viewDidLoad 期间设置(如果已缓存)或异步设置。
您如何使用自动布局实现上述功能,并尽可能多地使用 Interface builder?
到目前为止我做了什么
基于answer,我这样配置我的笔尖:
-
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;
}
我非常努力地转向自动布局,但这并不容易。
【问题讨论】:
标签: ios uiscrollview uiimageview interface-builder autolayout