Autolayout和UIPopoverController

Pad*_*215 4 objective-c uipopovercontroller ios nslayoutconstraint

我在其中创建了一个包含一些子视图的面板,并使用NSLayoutConstraints来实现定位.

我会把它显示在一个UIPopoverController.在设置它之前,我会调用[UIView layoutIfNeeded]命令强制它自己调整大小(整体大小基于其中可能是不同大小的图像的大小).

PhotoDisplayPanel *panel = [[PhotoDisplayPanel alloc] initWithPhoto:cell.photo isAddPhoto:cell.isAddPhoto];

DLog(@"BEFORE | panel.frame: %@", panel);

[self.view addSubview:panel];

DLog(@"MIDDLE | panel.frame: %@", panel);

[panel layoutIfNeeded];

DLog(@"AFTER | panel.frame: %@", panel);
Run Code Online (Sandbox Code Playgroud)

日志:

DEBUG | -[LoginViewController viewDidLoad] | BEFORE | panel.frame: <PhotoDisplayPanel: 0x7878a3f0; frame = (0 0; 0 0); layer = <CALayer: 0x7878a7e0>>
DEBUG | -[LoginViewController viewDidLoad] | MIDDLE | panel.frame: <PhotoDisplayPanel: 0x7878a3f0; frame = (0 0; 0 0); layer = <CALayer: 0x7878a7e0>>
DEBUG | -[LoginViewController viewDidLoad] | AFTER | panel.frame: <PhotoDisplayPanel: 0x7878a3f0; frame = (-358 -245; 578 289); layer = <CALayer: 0x7878a7e0>>
Run Code Online (Sandbox Code Playgroud)

以前,我会在将[panel layoutIfNeeded]调用添加到视图之前添加调用.这很好.但是在iOS 8.1中,他们改变了layoutIfNeeded工作方式,如果在将我的面板添加到视图之前调用它,它会吓坏并开始破坏约束以使其正常工作.

我的问题是使用a UIPopoverController,因为我无法调用layoutIfNeeded我的面板没有大小,所以它使用popover的默认大小:

在此输入图像描述

小组看起来像:

在此输入图像描述

我创建UIPopoverController,将面板设置为视图,然后将preferedContentSize属性设置为面板的大小:

UIViewController *viewController = [[UIViewController alloc] init];
viewController.view = self.currentPanel;
viewController.preferredContentSize = CGSizeMake(self.currentPanel.frame.size.width, self.currentPanel.frame.size.height + 00);
Run Code Online (Sandbox Code Playgroud)

由于面板尺寸不大,因此为(0,0).

我现在的问题是,如何根据约束强制我的面板自行调整大小?

Tan*_* G. 8

解决方案是根据您的约束计算preferredContentSize.注意:您的约束必须固定(左/上/右/下)到视图控制器视图,以便能够计算视图的总宽度/高度.

要做到这一点,请在viewWillAppear中添加以下行:

- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];

CGSize resultSize = [self.view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
self.preferredContentSize = resultSize;
}
Run Code Online (Sandbox Code Playgroud)

  • 这应该标记为答案。我测试了它,效果很好。 (2认同)