为添加到UIWindow的视图添加约束时,为什么无法设置自动布局约束?

时间:2013-12-07 05:04:28

标签: ios objective-c uiimageview autolayout nslayoutconstraint

要在屏幕上创建一个黑色叠加层,我将所有其他视图的视图添加到UIWindow上:

UIView *darkOverlayView = [[UIView alloc] initWithFrame:[UIScreen mainScreen].bounds];
darkOverlayView.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.85];

然后我想将UIImageView置于新的darkOverlayView中,并尝试如下:

UIImageView *imageFromLink = [[UIImageView alloc] initWithImage:responseObject];
imageFromLink.translatesAutoresizingMaskIntoConstraints = NO;
            CGFloat widerThanHeightBy = imageFromLink.bounds.size.width / imageFromLink.bounds.size.height;

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.width]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.height / widerThanHeightBy]];

但每次运行时,我都会收到错误:

  

未为约束准备视图层次结构:       添加到视图时,约束的项必须是该视图(或视图本身)的后代。如果在组装视图层次结构之前需要解析约束,则会崩溃。打破 - [UIView _viewHierarchyUnpreparedForConstraint:]进行调试。   2013-12-07 00:59:03.626 Jupiter [58008:70b]查看层次结构未准备好约束。       约束:       容器层次:   >       在容器层次结构中找不到视图:> - (空值)       该视图的超级视图:没有概述

我如何解决这个问题?或者我必须使用框架吗?

2 个答案:

答案 0 :(得分:6)

怎么说@rdelmar:

首先:你将你的imageFromLink像addSubView一样添加到superview?

Seccond: 你的约束:

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeWidth relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.width]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeHeight relatedBy:0 toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:[UIScreen mainScreen].bounds.size.height / widerThanHeightBy]];

仅设置Widthheight,那么关于xy

再添加两个约束:

[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeCenterX relatedBy:0 toItem:darkOverlayView attribute:NSLayoutAttributeCenterX multiplier:1.0f constant:0.0f]];
[darkOverlayView addConstraint:[NSLayoutConstraint constraintWithItem:imageFromLink attribute:NSLayoutAttributeCenterY relatedBy:0 toItem:darkOverlayView attribute:NSLayoutAttributeCenterY multiplier:1.0f constant:0.0f]];

它在darkOverlayView的中心设置位置。

答案 1 :(得分:2)

在视图中添加约束涉及两个视图时,一个视图必须是另一个视图的子视图,因此在添加约束之前需要将imageFromLink添加为darkOverLayView的子视图。但是,在这种情况下,在添加宽度和高度约束的情况下,应将这些约束添加到imageFromLink,而不是其超级视图。这种类型的固定宽度或高度约束不涉及任何其他视图,因此它应属于视图本身,而不是超视图。

添加高度和宽度约束并不会将其置于超级视图的中心。您需要添加(在使用imageFromLink子视图之后)将centerX和centerY约束添加到darkOverlayView。