3

我有一个正确显示在 iPhone 6 屏幕上的视图,但需要在 iPhone 5 屏幕上滚动。我正在尝试更改一些自动布局约束以消除滚动后者的需要。

这是试图从视觉上解释我的情况: 在此处输入图像描述

前两张截图是 iPhone 6 和 iPhone 5 上的现有情况。第三张是我想要实现的(仅在 iPhone 5 上)。

我写了以下自动布局约束,但我在这里遗漏了一些东西:


[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=25,<=50)-[blueView]-(>=25,<=50)-[redView]-5-|"
                                                             options:0
                                                             metrics:nil
                                                               views:nameMap]];

这里应该涉及拥抱和/或抗压吗?以什么方式?


编辑以显示更多我的实际代码:

[self addSubview:loginNSignupScrollView];
[self.loginNSignupScrollView addSubview:logoImageView];
[self.loginNSignupScrollView addSubview:horizo​​ntalScrollView];
[self.loginNSignupScrollView addSubview:appVersionLabel];
[self.horizo​​ntalScrollView addSubview:loginView];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[loginNSignupScrollView]|" 选项:0 指标:无 意见:名称地图]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[loginView(==350)]" 选项:0 指标:无 意见:名称地图]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=30,<=60)-[logoImageView(==35)]-(>=25,<=50)-[horizo​​ntalScrollView]-30-[ appVersionLabel]-5-|" 选项:0 指标:无 意见:名称地图]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.horizo​​ntalScrollView 属性:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:自己 属性:NSLayoutAttributeHeight 乘数:0.0 常数:350]];

4

2 回答 2

5

如您所知,滚动视图很特殊,因为如果您在其中使用自动布局,则内容大小(可滚动内容的大小)由内而外的约束决定。因此,你不能直接做你想做的事。更好的策略是:

  • 滚动视图,固定到超级视图(主视图)

  • 滚动视图内的空白内容视图,固定到具有零常量的滚动视图

  • 其他一切,在内容视图中

设置好之后,会发生两件好事:

  • 内容视图的大小滚动视图的contentSize. 所以你所要做的就是明确地设置它。一种合理的方法可能是在代码中设置它viewDidLayoutSubviews;这是最早知道真正的最终接口尺寸的时间。

  • 内容视图的子视图的约束变成了普通的约束,它们像往常一样从外部定位,基于内容视图的大小——正如我们刚才所说,您正在显式设置。

使用这种策略,我实现了这一点(分别是 4s 和 6s 模拟器),这似乎至少是你所追求的那种东西;观察我们确实处于滚动视图中,尽管您无法从屏幕截图中看出:

在此处输入图像描述

在此处输入图像描述

它与您的屏幕截图并不完全相同,因为我不清楚您真正追求的是什么,所以我允许空白空间平等地增长/缩小,同时保持视图高度不变;可能是您希望红色视图高度在更大的屏幕上增长。但我认为这是一个小问题。

我使用的唯一代码是设置内容视图的大小,(正如我所说)与设置滚动视图的大小相同contentSize

NSLayoutConstraint.activateConstraints([
    self.contentView.widthAnchor.constraintEqualToConstant(
        self.view.bounds.size.width),
    self.contentView.heightAnchor.constraintEqualToConstant(
        self.view.bounds.size.height),
])
于 2015-11-13T15:59:43.963 回答
0

我认为您可以将底部视图与底部布局固定某个恒定值,以便底部视图始终保持与底部的恒定值的距离。

于 2015-11-13T17:47:00.383 回答