使用自动布局的 UIView 最小和最大高度

Pie*_*nan 3 iphone objective-c ios autolayout visual-format-language

我的视图可以在 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]];
Run Code Online (Sandbox Code Playgroud)

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


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

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

[self addConstraints:[NSLayoutConstraintconstraintWithVisualFormat:@"V:|[loginNSignupScrollView]|" 选项:0 指标:无 视图:nameMap]];

[self addConstraints:[NSLayoutConstraintconstraintWithVisualFormat:@"V:|[loginView(==350)]" 选项:0 指标:无 视图:nameMap]];

[self addConstraints:[NSLayoutConstraint约束WithVisualFormat:@"V:|-(>=30,<=60)-[logoImageView(==35)]-(>=25,<=50)-[horizo​​ntalScrollView]-30-[应用程序版本标签]-5-|” 选项:0 指标:无 视图:nameMap]];

[self addConstraint:[NSLayoutConstraint约束WithItem:self.horizo​​ntalScrollView 属性:NSLayoutAttributeHeight 相关者:NSLayoutRelationEqual 目标项目:自己 属性:NSLayoutAttributeHeight 乘数:0.0 常数:350]];

mat*_*att 6

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

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

  • \n
  • 滚动视图内的空白内容视图,用零常量固定到滚动视图

  • \n
  • 内容视图内的其他所有内容

  • \n
\n\n

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

\n\n
    \n
  • 内容视图的大小滚动视图的大小contentSize。所以你所要做的就是明确地设置它。一个合理的方法可能是将其设置在viewDidLayoutSubviews;中的代码中。这是已知的最早的真实最终界面尺寸。

  • \n
  • 内容视图子视图的约束成为普通约束,根据内容视图的大小 \xe2\x80\x94 像往常一样从外部定位它们,正如我们刚才所说,您正在显式设置。

  • \n
\n\n

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

\n\n

在此输入图像描述

\n\n

在此输入图像描述

\n\n

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

\n\n

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

\n\n
NSLayoutConstraint.activateConstraints([\n    self.contentView.widthAnchor.constraintEqualToConstant(\n        self.view.bounds.size.width),\n    self.contentView.heightAnchor.constraintEqualToConstant(\n        self.view.bounds.size.height),\n])\n
Run Code Online (Sandbox Code Playgroud)\n