为什么iPhone 6 Plus Landscape不使用preferredContentSize?
在我的iOS 8应用程序中,除了iPhone 6 Plus横向外,所有方向的所有设备上都能正确显示此popover segue:
这就是它在iPhone 6 Plus环境中的外观(它几乎从上到下延伸):
当它显示如下时,单击视图外部并不会忽略它(虽然取消确实有效)。 旋转回肖像使其恢复正常。
此UIViewController
中的所有约束都安装在所有大小的类上。
在viewDidAppear:
调试值时viewDidAppear:
我看到以下内容:
- po self.view:frame =(0 0; 250 394)
- po self.preferredContentSize(width = 250,height = 160)
是什么导致视图的高度跳到394?
我实际上也遇到了与iPhone 6 Plus版本中另一个popover segue相同的问题。 (如果有好奇心,我在这里使用的是VC而不是’UIAlertController’,因为显示的UITextField
的validation要求与UIAlertController
不UIAlertController
。)
编辑以包含我的popover代码:
此代码可在prepareForSegue:
找到prepareForSegue:
FavoriteNameViewController *nameVC = segue.destinationViewController; UIPopoverPresentationController *popPC = nameVC.popoverPresentationController; popPC.delegate = self; nameVC.delegate = self; nameVC.view.center = self.originalContentView.center;
然后是委托方法:
- (UIModalPresentationStyle)adaptivePresentationStyleForPresentationController:(UIPresentationController *)controller { return UIModalPresentationNone; }
这是Xcode中的segue定义:
你所看到的不是一个弹出窗口。 这是一个正常的呈现视图。 默认情况下,弹出窗口在iPad上显示为弹出框,但作为iPhone上的呈现视图 – 包括iPhone 6 plus。 在其他iPhone上,这个呈现的视图是全屏的 – 它涵盖了一切。 但iPhone 6是如此之宽,以至于它们不会这样做,所以它以标准宽度(较小的iPhone的宽度)出现在屏幕中间。
因此,优选的内容大小没有效果。 这不是一个弹出窗口。 呈现的视图控制器视图具有标准大小,并且这个视图也不例外。
但是,您可以将弹出窗口显示为 iPhone上的弹出窗口 。 为此:
-
在呈现之前为
popoverPresentationController
视图控制器的popoverPresentationController
设置委托。 -
在委托中,实现
adaptivePresentationStyleForPresentationController:
并返回.None
。
但是,这显然不适用于横向模式的iPhone 6 Plus; popover不是“适应”。 我会把这描述为一个错误!
编辑在iOS 9中, 问题解决了! 实现新的委托方法adaptivePresentationStyleForPresentationController:traitCollection:
返回.None
,你将在所有情况下得到一个弹出窗口,包括横向的iPhone 6 Plus。 这是一个完整的工作示例,其中创建弹出窗口并在代码中召唤以响应按钮点击:
@IBAction func doButton(sender: AnyObject) { let vc = MyViewController() vc.preferredContentSize = CGSizeMake(400,500) vc.modalPresentationStyle = .Popover if let pres = vc.presentationController { pres.delegate = self } self.presentViewController(vc, animated: true, completion: nil) if let pop = vc.popoverPresentationController { pop.sourceView = (sender as! UIView) pop.sourceRect = (sender as! UIView).bounds } } func adaptivePresentationStyleForPresentationController( controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle { return .None }