自动布局无法按预期工作

Posted

技术标签:

【中文标题】自动布局无法按预期工作【英文标题】:Auto Layout doesn't work as expected 【发布时间】:2013-02-06 16:21:11 【问题描述】:

鉴于:

一个'logo'(从超级视图顶部垂直空间>= 10的uiimageview)和一个'log in',并且logo和持有者视图之间的垂直空间是

目标:

在横向模式下,由于屏幕尺寸的变化,徽标将向上移动,并且持有人视图也应该移动。

但是,当我从纵向旋转到横向时,我得到的是垂直约束仍然保持在 81(不知何故我无法从 xcode 中删除此值)。此外,“主视图”和“登录”之间的垂直空间也不能删除。我知道我在这里做错了什么。

如果您对此问题有任何建议,请提供帮助。

详情:

+图片1是纵向模式,有一些关于约束的细节

+图片2是横向模式,有一些错误。

已编辑:像我设置的方式一样,我希望徽标的垂直空间可以缩小,但它始终>= 10 距离主视图的顶部

【问题讨论】:

【参考方案1】:

我不知道这是否可以在 IB 中完成——如果可以,我还没有弄清楚。我已经在代码中完成了,如下所示。我从图像视图顶部到具有固定值的主视图顶部的约束以及图像视图和登录视图之间的约束开始。这应该足以满足系统的要求,您可以删除主视图顶部或底部的任何其他约束(我在测试中使用了具有固有高度的按钮,所以我不需要设置它。如果你视图没有设置内在或特定的高度,您也必须这样做)。然后,在代码中,我将该约束移除到顶部(IBOutlet conTop),并将其重新设置到底部:

@implementation ViewController 
    IBOutlet NSLayoutConstraint *conTop;
    IBOutlet UIButton *button;


- (void)viewDidAppear:(BOOL)animated  
    [super viewDidAppear:animated];
    [self.view removeConstraint:conTop];
    conTop = [NSLayoutConstraint constraintWithItem:button attribute:NSLayoutAttributeTop relatedBy:0 toItem:self.view attribute:NSLayoutAttributeBottom multiplier:.5 constant:-120];
    [self.view addConstraint:conTop];
    [self.view layoutSubviews];

通过同时使用乘数和常数,您可以调整它在旋转后的移动方式。我在这里选择的数字对我来说看起来很不错,但你可以把它们弄乱,看看它们做了什么。您可以将乘数视为一个敏感因子——分数越小,旋转时与顶部的距离变化越小。如果您需要精确的值,可以使用一些代数来计算乘数和常数的值。

【讨论】:

代码中的 IBOutLet 'conTop' 是什么。它是从图像顶部到主视图的约束还是其他? @ttran,是的,这是从图像视图顶部到主视图顶部的约束。我本可以把它放到主视图的底部。这真的没关系——我只需要它来满足系统,这样我就可以移除顶部或底部的任何其他约束。 我有点困惑,因为 conTop 是从图像顶部到主视图顶部的约束。但是,您将其用作按钮和超级视图的视觉格式。 @ttran,它最初在 IB 中,但我在代码中将其删除,然后将其重新定义为底部的约束。如果要使用乘数,则必须将约束设置到底部或右侧,因为顶部和左侧的值为0,因此乘以它对您没有任何好处。【参考方案2】:

您需要找到一种以声明方式表达关系的方法——最好是同时适用于这两种情况。

您还没有完全说出您希望在横向模式下发生什么。顶部的标志,但离顶部多远?您希望持有人视图在哪里?

WWDC video 对于了解自动布局的工作原理至关重要。你有机会看了吗?

【讨论】:

我确实看过并尝试申请但仍然卡住。现在的风景对我有好处。请查看编辑后的 ​​OP 不等式是不够的。你想要它离顶部多远?

以上是关于自动布局无法按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

自动布局未按预期工作

在运行时更改自动布局

自动布局约束未按预期工作

带有自动布局的 uiscrollview 的动态内容未按预期工作

SnapKit 的自动布局未按预期响应

自动布局隐藏第一次启动的图像