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

Vit*_*aly 20 objective-c uiscrollview uiimageview autolayout ios6

我正在尝试使用具有自动布局的新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
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,图像不会滚动.关闭自动布局(使用支柱和弹簧)完成所有操作后,我正在进行滚动操作.我猜问题是限制.请问有人帮帮我吗?

小智 52

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

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

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

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

  • 虽然在scrollView中缩放imageView还有另一个问题. (2认同)

jac*_*ash 27

Autolayout起初可能非常混乱.您实际上不希望在任何地方设置scrollview的contentSize.使用纯自动布局方法,scrollview设置自己的内容大小.参见自动版式和部分UIScrollViewiOS 6的发布说明:

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

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

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

** nothing at all!!! **
Run Code Online (Sandbox Code Playgroud)

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

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

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

快乐编码......

  • 这应该是公认的答案.约翰的答案主要是黑客,可以打破你的限制. (2认同)