我已经实现了一个弹出窗口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];
答案 0 :(得分:2)
不要将视图粘贴到未专门设置以保存视图的窗口中。您不知道该窗口的真实所有者现在或将来的iOS版本中可能会做什么。
创建自己的窗口并将其windowLevel
设置得足够高,以便位于键盘上方。为新窗口提供自己的根视图控制器(因此它将正确处理不同的方向)并将弹出视图置于根视图控制器的视图中。
您会在this question的答案中找到许多有用的信息。
答案 1 :(得分:1)
为popupView添加高度和宽度限制很好,但由于popupView是窗口的子视图,因此应该将居中约束添加到窗口,而不是popupView(并且需要添加popupView)首先作为子视图,在添加约束之前)。