自动布局无法按预期工作

时间:2013-02-06 16:21:12

标签: iphone ios autolayout

鉴于:

  

'徽标'(uiimageview,垂直空间> =超级视图顶部10),徽标和持有者视图之间的“登录”和垂直空间为< = 31

目标:

  

在lanscape模式下,由于屏幕尺寸的变化,徽标将向上移动到顶部,持有者视图也应该移动。

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

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

详细信息:

+图片1是肖像模式,其中包含有关约束的一些细节

enter image description here

+图片2是lanscape模式,但有一些错误。

enter image description here

已修改:就像我设置的方式一样,我希望徽标的垂直空间可以缩小,但是从主视图的顶部始终> gt = = 10

2 个答案:

答案 0 :(得分: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];
}

通过一起使用乘数和常数,您可以调整旋转后的移动方式。我在这里选择的数字对我来说看起来很不错,但是你可以把它们搞得一团糟看看他们做了什么。您可以将乘数视为灵敏度因子 - 该分数越小,距离顶部的距离变化越小。如果需要精确值,可以使用小代数计算乘数和常数的值。

答案 1 :(得分:0)

您需要找到一种以声明方式表达关系的方法 - 理想情况下,这种方式适用于两种情况。

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

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