具有自动布局的 UIView 最小和最大高度
UIView min and max height with Auto Layout
我有一个视图可以在 iPhone 6 屏幕上正确显示,但需要在 iPhone 5 屏幕上滚动。我正在尝试更改一些自动布局约束以消除在后者上滚动的需要。
这里试图直观地解释我的情况:
前两张截图是iPhone6和iPhone5的现有情况。
第三个是我想要实现的(仅在 iPhone 5 上)。
我写了以下自动布局约束,但我在这里遗漏了一些东西:
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=25,<=50)-[blueView]-(>=25,<=50)-[redView]-5-|"
options:0
metrics:nil
views:nameMap]];
</pre>
Hugging and/or Compression Resistance 应该包括在这里吗?什么方式?
编辑以显示更多我的实际代码:
[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]];
如您所知,滚动视图的特殊之处在于,如果您在其中使用自动布局,则内容大小(可滚动内容的大小)由内而外的约束决定。因此,你不能直接做你想做的事。更好的策略是:
滚动视图,固定到父视图(主视图)
滚动视图内的空白内容视图,固定到具有零常量的滚动视图
内容视图中的其他内容
设置完成后,会发生两件好事:
内容视图的大小是滚动视图的contentSize
。所以你所要做的就是明确地设置它。一个合理的方法可能是在 viewDidLayoutSubviews
中的代码中设置它;那是最早知道真正的最终接口尺寸的。
内容视图的子视图的约束变为普通约束,根据内容视图的大小像往常一样从外向内定位它们——我们刚才说了,你是在显式设置。
使用那种策略,我实现了这个(分别是 4s 和 6s 模拟器),这似乎至少是你所追求的那种东西;观察我们确实处于滚动视图中,尽管您无法从屏幕截图中看出:
它与您的屏幕截图并不完全相同,因为我不清楚您真正想要的是什么,所以我允许空白区域 grow/shrink 均等,同时保持视图高度不变;可能是您希望红色视图高度在更大的屏幕上增长。但我认为这是一个小问题。
我使用的唯一代码是设置内容视图的大小,这(正如我所说)与设置滚动视图的相同 contentSize
:
NSLayoutConstraint.activateConstraints([
self.contentView.widthAnchor.constraintEqualToConstant(
self.view.bounds.size.width),
self.contentView.heightAnchor.constraintEqualToConstant(
self.view.bounds.size.height),
])
我认为您可以通过某个常数值将底部视图与底部布局固定在一起,这样底部视图将始终与底部保持该常数值的距离。
我有一个视图可以在 iPhone 6 屏幕上正确显示,但需要在 iPhone 5 屏幕上滚动。我正在尝试更改一些自动布局约束以消除在后者上滚动的需要。
这里试图直观地解释我的情况:
前两张截图是iPhone6和iPhone5的现有情况。 第三个是我想要实现的(仅在 iPhone 5 上)。
我写了以下自动布局约束,但我在这里遗漏了一些东西:
[self addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-(>=25,<=50)-[blueView]-(>=25,<=50)-[redView]-5-|" options:0 metrics:nil views:nameMap]]; </pre>
Hugging and/or Compression Resistance 应该包括在这里吗?什么方式?
编辑以显示更多我的实际代码:[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]];
如您所知,滚动视图的特殊之处在于,如果您在其中使用自动布局,则内容大小(可滚动内容的大小)由内而外的约束决定。因此,你不能直接做你想做的事。更好的策略是:
滚动视图,固定到父视图(主视图)
滚动视图内的空白内容视图,固定到具有零常量的滚动视图
内容视图中的其他内容
设置完成后,会发生两件好事:
内容视图的大小是滚动视图的
contentSize
。所以你所要做的就是明确地设置它。一个合理的方法可能是在viewDidLayoutSubviews
中的代码中设置它;那是最早知道真正的最终接口尺寸的。内容视图的子视图的约束变为普通约束,根据内容视图的大小像往常一样从外向内定位它们——我们刚才说了,你是在显式设置。
使用那种策略,我实现了这个(分别是 4s 和 6s 模拟器),这似乎至少是你所追求的那种东西;观察我们确实处于滚动视图中,尽管您无法从屏幕截图中看出:
它与您的屏幕截图并不完全相同,因为我不清楚您真正想要的是什么,所以我允许空白区域 grow/shrink 均等,同时保持视图高度不变;可能是您希望红色视图高度在更大的屏幕上增长。但我认为这是一个小问题。
我使用的唯一代码是设置内容视图的大小,这(正如我所说)与设置滚动视图的相同 contentSize
:
NSLayoutConstraint.activateConstraints([
self.contentView.widthAnchor.constraintEqualToConstant(
self.view.bounds.size.width),
self.contentView.heightAnchor.constraintEqualToConstant(
self.view.bounds.size.height),
])
我认为您可以通过某个常数值将底部视图与底部布局固定在一起,这样底部视图将始终与底部保持该常数值的距离。