swift UIPopoverPresentationControllerDelegate协议的2种自适应呈现样式方法之间的差异

rn0zuynd  于 2023-02-03  发布在  Swift
关注(0)|答案(2)|浏览(167)

我使用的弹出窗口视图控制器不希望弹出窗口覆盖整个屏幕(iOS 13)。我尝试用途:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
        return .none
}

方法被调用,但弹出窗口显示总是全屏,即使指定了较小的首选内容大小。经过大量的时间尝试许多不同的事情,我发现有另一个方法,其中有2个参数,并使用它:

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
        return .none
}

使用这个方法可以使弹出窗口屏幕达到指定的大小。有人知道为什么第二个可以工作而第一个不行吗?我有几个其他的应用程序,我使用第一个没有问题,什么给?!!

6mw9ycah

6mw9ycah1#

由于文件:从iOS 8.3我们应该使用
adaptivePresentationStyle(for:traitCollection:)
来处理所有的性状变化。在哪里
UITraitCollection-iOS界面环境,由水平和垂直大小类别、显示比例和用户界面习惯等特征定义。
如果不在委托中实现此方法,UIKit将调用
adaptivePresentationStyle(for:)
方法。
因此,我猜您在应用中尝试创建自适应界面,并使用UITraitCollection horizontalSizeClass、verticalSizeClass、displayScale和userInterfaceIdiom属性访问特定的trait值。这就是您应该实现***adaptivePresentationStyle(for:traitCollection:)***的原因。

pkln4tw6

pkln4tw62#

为了支持这个答案,我使用了:

func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
    return .none
}

在iPad(iPadOS 16)上可以正确弹出,但在iPhone(iOS 16. 2)上可以全屏显示
然后我又改成:

func adaptivePresentationStyle(for controller: UIPresentationController, traitCollection: UITraitCollection) -> UIModalPresentationStyle {
    return .none
}

在两个站台上都能看到。
从文档中并不清楚为什么它会像它所说的那样工作,即如果您不在代理中实现***adaptivePresentationStyle(for:traitCollection:)***,它将默认为在代理中调用***adaptivePresentationStyle(for:)***。

相关问题