UIView最小和最大高度与自动布局

时间:2015-11-13 15:49:13

标签: ios objective-c iphone autolayout visual-format-language

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

以下是尝试直观地解释我的情况: enter image description here

前两个屏幕截图是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:horizontalScrollView];
[self.loginNSignupScrollView addSubview:appVersionLabel];
[self.horizontalScrollView addSubview:loginView];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[loginNSignupScrollView]|" options:0 metrics:nil views:nameMap]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[loginView(==350)]" options:0 metrics:nil views:nameMap]];

[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=30,<=60)-[logoImageView(==35)]-(>=25,<=50)-[horizontalScrollView]-30-[appVersionLabel]-5-|" options:0 metrics:nil views:nameMap]];

[self addConstraint:[NSLayoutConstraint constraintWithItem:self.horizontalScrollView attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:self attribute:NSLayoutAttributeHeight multiplier:0.0 constant:350]];

2 个答案:

答案 0 :(得分:4)

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

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

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

  • 内容视图中的其他内容

一旦你做好了准备,就会发生两件好事:

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

  • 内容视图的子视图的约束变为普通约束,根据内容视图的大小,像往常一样从外部定位它们 - 正如我们刚才所说,你是明确设定。

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

enter image description here

enter image description here

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

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

NSLayoutConstraint.activateConstraints([
    self.contentView.widthAnchor.constraintEqualToConstant(
        self.view.bounds.size.width),
    self.contentView.heightAnchor.constraintEqualToConstant(
        self.view.bounds.size.height),
])

答案 1 :(得分:0)

我认为您可以使用底部布局将底部视图固定为某个常量值,以便底部视图始终保持从底部开始的恒定值。

相关问题