【问题标题】:How do I use UIScrollView with AutoLayout (iOS6)?如何将 UIScrollView 与 AutoLayout (iOS6) 一起使用?
【发布时间】:2012-11-30 16:42:52
【问题描述】:

我正在尝试构建一个具有多个不同控件的视图,但我希望该视图仅在垂直方向上滚动。我正在使用自动布局,因此我不想手动指定大小(我知道我可以这样做,但根据UIScrollView 上的发行说明,我理解你不应该这样做)。

因此,如果我创建一个简单的视图控制器(没有 .xib 文件)并简单地将以下内容添加到 init 方法中,我希望我的标签会换行(他们会这样做)并且我的视图会垂直滚动,但事实并非如此:

- (id)init {
    self = [super init];
    if (self) {

        UIScrollView *_scrollView = [UIScrollView new];
        [_scrollView setTranslatesAutoresizingMaskIntoConstraints:NO];

        UILabel *label1 = [UILabel new];
        UILabel *label2 = [UILabel new];

        [label1 setTranslatesAutoresizingMaskIntoConstraints:NO];
        [label2 setTranslatesAutoresizingMaskIntoConstraints:NO];

        [label1 setNumberOfLines:0];
        [label2 setNumberOfLines:0];

        [label1 setPreferredMaxLayoutWidth:240];
        [label2 setPreferredMaxLayoutWidth:240];

        NSString *sampleText = @"Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.";
        [label1 setText:sampleText];
        [label2 setText:sampleText];

        [self.view addSubview:_scrollView];
        [_scrollView addSubview:label1];
        [_scrollView addSubview:label2];

        NSArray *constraints;
        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)];
        [self.view addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|[_scrollView]|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(_scrollView)];
        [self.view addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label1]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1)];
        [_scrollView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label2)];
        [_scrollView addConstraints:constraints];

        constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
        [_scrollView addConstraints:constraints];
    }

    return self;
}

我认为这段代码有几个结果很奇怪。如果您在 viewDidLayoutSubviews 方法(在 super 调用之后)中记录 scrollviewheight,这是应该应用所有约束的地方,那么高度报告为 0。同样奇怪的是宽度报告的数字与我预期的不同.由于第一个约束,我希望它报告超级视图的宽度(我什至尝试强制该约束内的宽度具有据称需要的优先级,但它仍然不起作用)。

据我了解,UIScrollView 的内容大小应由其内容的固有大小设置,但这似乎没有发生。

那么,有人知道缺少什么吗?

【问题讨论】:

  • +1 代表 lorem ipsum 来源)

标签: uiscrollview ios6 autolayout


【解决方案1】:

我已联系 Apple 的支持人员以获取有关我的问题的答案。代码的问题在于 UIScrollView 中包含的对象必须垂直固定到顶部和底部,才能确定其内在内容大小。所以下面这行代码

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
[_scrollView addConstraints:constraints];

应改为:

constraints = [NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label1]-[label2]-|" options:0 metrics:nil views:NSDictionaryOfVariableBindings(label1, label2)];
[_scrollView addConstraints:constraints];

他们还指出,我在几个基本“init”不是指定初始化程序的对象上使用了“new”关键字。虽然这与我的具体问题无关,但他们确实指出您应该避免这样做,因为您的对象可能处于无效状态。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-04
相关资源
最近更新 更多