在iOS 6上使用Auto Layout在ScrollView中嵌入ImageView

时间:2012-09-27 10:57:36

标签: objective-c uiscrollview uiimageview ios6 autolayout

我正在尝试使用具有自动布局的新iOS 6 SDK制作非常简单的元素。 我有一个ImageView并将其嵌入ScrollView中。 (一切都使用Interface Builder构建)。 .png文件已设置,imageView模式设置为“左上角”。

实现:

#import "ImaginariumViewController.h"

@interface ImaginariumViewController ()
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@end

@implementation ImaginariumViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.scrollView.contentSize = self.imageView.image.size;
    self.imageView.frame =
    CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height);
}

@end

运行应用程序时,图像不会滚动。关闭自动布局(使用支柱和弹簧)做同样的事情,我有工作滚动。 我猜问题是限制。请问有人帮帮我吗?

2 个答案:

答案 0 :(得分:52)

我刚刚在我正在更新的教程中遇到了同样的问题。我试图以编程方式删除约束,诅咒,并将我的头撞在墙上 - 没有运气。

然而,大约5分钟前,我尝试了一些修复了我遇到的问题的事情,并且,ta da! UIScrollView再次运行!解决方案是将设置UIScrollView contentSize属性的旧代码移动到viewDidAppear的实现中,而不是viewDidLoad:

- (void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    self.theScroller.contentSize=CGSizeMake(200.0,2000.0);
}

我希望这可以帮助其他人遇到Auto Layout中出现的一些令人头疼的问题。

答案 1 :(得分:27)

首先,Autolayout可能会非常混乱。您实际上不希望在任何地方设置scrollview的contentSize。使用纯自动布局方法,scrollview设置自己的内容大小。请参阅iOS 6 release notes中的自动布局和UIScrollView部分:

  

滚动视图子视图的约束必须导致a   要填充的大小,然后将其解释为内容大小   滚动视图。 (这不应该与...混淆   用于自动布局的intrinsicContentSize方法。)

请注意,这意味着对scrollview子视图的约束必须设置显式宽度和高度,而不是使用根据scrollview方面而有所不同的宽度。

此处的第二个错误是您将UIImageView的帧设置为图像的大小。使用自动布局时,这也是不必要的。 UIImageView实际上有一个intrinsicContentSize,它是底层图像的大小。 (要更改此设置,您应该使用高优先级设置宽度和高度的约束)这意味着使用自动布局将图像放置在滚动视图中并使其滚动正确的代码应该如下:

** nothing at all!!! **

但是仍然需要注意的是,这可能会导致您的图像看起来不会滚动,并且提示位于前面提到的发行说明中:

  

请注意,您可以使滚动视图的子视图显示为浮动   (不滚动)通过创建约束来覆盖其他滚动内容   在视图和滚动视图的子树之外的视图之间,例如   滚动视图的超级视图。

即。如果在界面构建器中设置约束并将图像视图约束到层次结构中滚动视图上方的视图,则会影响视图的滚动方式。狂!

快乐编码......