当视图位于视图层次结构的顶部时,以编程方式使用“自动布局”在屏幕上显示UIView

时间:2014-04-21 03:31:05

标签: ios objective-c uiview autolayout nslayoutconstraint

我已经实现了一个弹出窗口UIView,我通过[[[[UIApplication sharedApplication] windows] lastObject] addSubview:popupView]将其添加到最顶层的窗口,因此它甚至会出现在键盘的顶部。我需要确保我以编程方式创建的弹出视图始终保持在屏幕中心。我试图添加自动布局约束,但它并不喜欢我尝试与最顶层窗口对齐的事实。你能告诉我怎么做到这一点吗?谢谢。

这是我实现的,它将生成一个(非常详细的)错误,指出视图层次结构没有为约束做好准备......约束的项目必须是该视图的后代和' #39;:

    [popupView setTranslatesAutoresizingMaskIntoConstraints:NO];
    NSLayoutConstraint *cn = nil;
    cn = [NSLayoutConstraint constraintWithItem:popupView
                                      attribute:NSLayoutAttributeCenterX
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:[[[UIApplication sharedApplication] windows] lastObject]
                                      attribute:NSLayoutAttributeCenterX
                                     multiplier:1.0
                                       constant:0];
    [popupView addConstraint:cn];
    cn = [NSLayoutConstraint constraintWithItem:popupView
                                      attribute:NSLayoutAttributeCenterY
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:[[[UIApplication sharedApplication] windows] lastObject]
                                      attribute:NSLayoutAttributeCenterY
                                     multiplier:1.0
                                       constant:0];
    [popupView addConstraint:cn];
    cn = [NSLayoutConstraint constraintWithItem:popupView
                                      attribute:NSLayoutAttributeHeight
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:nil
                                      attribute:NSLayoutAttributeNotAnAttribute
                                     multiplier:1
                                       constant:blockSize.height];
    [popupView addConstraint:cn];
    cn = [NSLayoutConstraint constraintWithItem:popupView
                                      attribute:NSLayoutAttributeWidth
                                      relatedBy:NSLayoutRelationEqual
                                         toItem:nil
                                      attribute:NSLayoutAttributeNotAnAttribute
                                     multiplier:1
                                       constant:blockSize.width];
    [popupView addConstraint: cn];

2 个答案:

答案 0 :(得分:2)

不要将视图粘贴到未专门设置以保存视图的窗口中。您不知道该窗口的真实所有者现在或将来的iOS版本中可能会做什么。

创建自己的窗口并将其windowLevel设置得足够高,以便位于键盘上方。为新窗口提供自己的根视图控制器(因此它将正确处理不同的方向)并将弹出视图置于根视图控制器的视图中。

您会在this question的答案中找到许多有用的信息。

答案 1 :(得分:1)

为popupView添加高度和宽度限制很好,但由于popupView是窗口的子视图,因此应该将居中约束添加到窗口,而不是popupView(并且需要添加popupView)首先作为子视图,在添加约束之前)。