为什么iPhone 6 Plus横屏模式下不使用preferredContentSize?

11
在我的iOS 8应用程序中,这个弹出视图转场在所有设备的所有方向上都显示正确,除了iPhone 6 Plus横屏模式: 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横屏模式下,我还遇到了另一个弹出视图转场的相同问题。(以防有好奇心,我在这里使用VC而不是'UIAlertController',因为显示的UITextField的验证要求与UIAlertController不兼容。)
编辑以包括我的弹出代码:
此代码位于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个回答

20
您看到的不是一个弹出窗口,而是一个普通的展示视图。默认情况下,iPad上的弹出窗口呈现为弹出窗口,但在iPhone上(包括iPhone 6 Plus),它呈现为展示视图。在其他iPhone上,这个展示视图是全屏的 - 它覆盖了所有内容。但是,iPhone 6非常宽,所以它不会覆盖所有内容,而是以标准宽度(较小iPhone的宽度)在屏幕中央出现。
因此,首选内容大小没有影响。这不是一个弹出窗口。呈现视图控制器的视图具有标准大小,这个视图也不例外。
但是,您确实可以使弹出窗口在iPhone上呈现为弹出窗口。要做到这一点:
- 在呈现弹出窗口之前,为弹出窗口视图控制器设置一个 popoverPresentationController 委托。 - 在委托中,实现 adaptivePresentationStyleForPresentationController: 方法,并返回 .None。
然而,在iPhone 6 Plus横屏模式下,这似乎无效。弹出窗口没有“适应”。我认为这是一个 bug!
编辑:在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
}

在此输入图片描述


是的。我刚在调试中确认了它。 - Kurt Anderson
我明白问题了。检查箭头方向复选框之一?(试试看是否有帮助...) - matt
1
我做了很多测试,我认为你发现了一个 bug。如果你太忙不能向苹果报告它,请告诉我;如果你愿意,我可以替你报告。 - matt
我感谢您对此进行了调查。如果您不介意,请报告这个错误。您能提供错误报告的链接吗(如果它是公开的)?我不熟悉错误报告流程。 - Kurt Anderson
7
仔细 阅读我所说的内容。 请 仔细 查看我的代码。 请注意,我所说的解决问题的方法 adaptivePresentationStyleForPresentationController:traitCollection: 和你之前实现的旧方法 adaptivePresentationStyleForPresentationController: 是 _不同 的。 它们的行为完全不同。 它能够解决问题,而我的屏幕截图证明了这一点。 - matt
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接