20

我正在尝试使用具有自动布局的新 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

当我运行应用程序时,图像不会滚动。在关闭自动布局(使用支柱和弹簧)的情况下做同样的事情,我正在滚动。我想问题出在约束上。有人可以帮我吗?

4

2 回答 2

52

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

然而,大约 5 分钟前,我尝试了一些解决了我遇到的另一个问题的方法,并且,ta da!UIScrollView 又开始工作了!解决方案是将设置 UIScrollView contentSize 属性的旧代码移动到 viewDidAppear 的实现中,而不是 viewDidLoad:

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

我希望这可以帮助其他人遇到自动布局出现的一些头痛问题。

于 2012-09-29T12:41:38.220 回答
27

自动布局一开始可能会让人很困惑。您实际上不想在任何地方设置滚动视图的 contentSize 。使用纯自动布局方法,滚动视图设置自己的内容大小。请参阅有关自动布局的部分和UIScrollViewiOS 6 发行说明

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

请注意,这意味着对滚动视图的子视图的约束必须设置明确的宽度和高度,并且不能使用根据滚动视图的各个方面而变化的宽度。

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

** nothing at all!!! **

但是您仍然需要注意一些事情,这可能会导致您的图像看起来不滚动,并且提示在上述发布说明中:

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

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

快乐的编码...

于 2012-11-13T22:32:26.233 回答