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).
我现在的问题是,如何根据约束强制我的面板自行调整大小?
解决方案是根据您的约束计算preferredContentSize.注意:您的约束必须固定(左/上/右/下)到视图控制器视图,以便能够计算视图的总宽度/高度.
要做到这一点,请在viewWillAppear中添加以下行:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
CGSize resultSize = [self.view systemLayoutSizeFittingSize:UILayoutFittingCompressedSize];
self.preferredContentSize = resultSize;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1424 次 |
| 最近记录: |