0

我有以下代码:

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 作为常量将它从顶部推动 200px)。

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


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

4

1 回答 1

1

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

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

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

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

于 2013-06-24T00:46:46.547 回答