为啥当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗?

Posted

技术标签:

【中文标题】为啥当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗?【英文标题】:Why when I made my constraint relative to the superview's bottom did it operate from the superview's top? And is it now right?为什么当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗? 【发布时间】:2013-06-24 00:31:59 【问题描述】:

我有以下代码:

self.noArticlesView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, self.view.frame.size.height)];
UIImage *backgroundPattern = [UIImage imageNamed:@"no-articles-background.png"];
self.noArticlesView.backgroundColor = [UIColor colorWithPatternImage:backgroundPattern];

[self.view addSubview:self.noArticlesView];

UIImage *noArticlesImage = [UIImage imageNamed:@"no-articles-icon.png"];
UIImageView *noArticlesImageView = [[UIImageView alloc] initWithImage:noArticlesImage];
noArticlesImageView.translatesAutoresizingMaskIntoConstraints = NO;

[self.noArticlesView addSubview:noArticlesImageView];

NSLayoutConstraint *horizontalCenterConstraint = [NSLayoutConstraint constraintWithItem:noArticlesImageView attribute:NSLayoutAttributeCenterX relatedBy:NSLayoutRelationEqual toItem:self.noArticlesView attribute:NSLayoutAttributeCenterX multiplier:1.0 constant:0.0];
[self.noArticlesView addConstraint:horizontalCenterConstraint];

NSLayoutConstraint *verticalPlacementConstrant = [NSLayoutConstraint constraintWithItem:noArticlesImageView attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.noArticlesView attribute:NSLayoutAttributeBottom multiplier:1.0 constant:-230.0];
[self.noArticlesView addConstraint:verticalPlacementConstrant];

基本上,我在视图控制器的视图之上添加了一个视图(称为noArticlesView),该视图显示一条消息,指出当前没有添加内容(当然,在没有添加内容的情况下) .

然后,我在该视图中添加一个图像作为子视图,作为它的指示符。

但是,当我将图像上的上述约束更改为具有属性 toItem:self.view 并将其添加到 self.view 而不是 self.noArticlesView 时,它会从视图顶部而不是底部推动它(即 200 作为常量会将其从顶部推 200 像素)。

我通过设置相对于noArticlesView 而不是self.view 的图像约束来解决它,但我仍然对这种行为感到好奇(我仍在学习自动布局并想掌握它) .


另外,我现在所做的是否正确?如果我希望它位于距离底部 230 像素的位置,是否将常量设置为 -230 ?将常量设置为负坏形式还是什么?

【问题讨论】:

【参考方案1】:

我也经历过这样的奇怪事情,我怀疑这是因为超级视图(在您的情况下为 self.view)没有高度——它不会根据其超级视图调整大小。这意味着self.view 的底部等于顶部,看起来约束从顶部开始起作用。你可以尝试两件事来验证这个理论:

    检查self.view的框架(高度为0) 设置self.view.clipsToBounds = YES(您的视图,包括背景视图,不会显示,因为它们被剪裁了)

这只是(或可能)只是对正在发生的事情的解释,我不确定处理这个问题的正确方法是什么。

就您的其他问题而言:这样做是完全有效的,尽管通常有更好的方法。问自己“为什么是-230”?如果那是因为图像高 230,则使用-noArticlesImage.size.height。如果 230 恰好是使整个视图看起来最好的数字,则可以使用(尽管最佳实践要求使用常量或预处理器宏来定义 230)。

【讨论】:

找不到更好的答案。 230 确实只是一个神奇的数字,但我会记住这一点,谢谢。 :)

以上是关于为啥当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗?的主要内容,如果未能解决你的问题,请参考以下文章

相对于父视图的底部定位 UIView?

如何将约束添加到相对于父视图边距的按钮,使其显示为距上边距 30 和距右边距 30

如何添加“对齐底部到:父视图”系统约束?

子视图相对于父 UIView 的起源

IOS故事板将每个子视图限制在屏幕底部

打破父约束的子视图约束