为什么iPhone 6 Plus Landscape不使用preferredContentSize?

时间:2015-07-07 17:11:04

标签: ios uiviewcontroller iphone-6-plus

在我的iOS 8应用中,除了iPhone 6 Plus风景外,所有方向的所有设备上都能正确显示此popover segue:

Good popover

这就是它在iPhone 6 Plus环境中的外观(它几乎从上到下延伸): Bad popover

当它显示为这样时,点击视图外部并不会忽略它(尽管取消确实有效)。旋转回肖像使其恢复正常。

UIViewController中的所有约束都安装在所有大小的类上。

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验证要求不能与{{UIAlertController一起使用1}}。)

编辑以包含我的popover代码:

此代码位于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定义: enter image description here

1 个答案:

答案 0 :(得分:18)

你所看到的不是一个弹出窗口。这是一个正常的呈现视图。默认情况下,弹出窗口在iPad上显示为弹出框,但作为iPhone上的呈现视图 - 包括iPhone 6 plus。在其他iPhone上,这个呈现的视图是全屏的 - 它涵盖了一切。但是iPhone 6很宽,以至于它们没有这样做,因此它以标准宽度(较小的iPhone的宽度)出现在屏幕中间。

因此,优选的内容大小没有效果。这不是一个弹出窗口。呈现的视图控制器视图具有标准大小,并且这个视图也不例外。

但是,您可以在iPhone上将popover显示为作为popover 。为此:

  • 在呈现之前为popover视图控制器的popoverPresentationController 设置委托。

  • 在代理中,实施adaptivePresentationStyleForPresentationController:并返回.None

然而,这显然不适用于横向模式的iPhone 6 Plus; popover不是“适应”。我会把它描述为一个错误!

编辑在iOS 9中,问题已解决!实施新的委托方法adaptivePresentationStyleForPresentationController:traitCollection:以返回.None,您将获得在任何情况下都可以使用popover,包括横向的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
}

enter image description here