为啥当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗?
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 确实只是一个神奇的数字,但我会记住这一点,谢谢。 :)以上是关于为啥当我相对于父视图的底部进行约束时,它是从父视图的顶部操作的?现在是对的吗?的主要内容,如果未能解决你的问题,请参考以下文章