swift UISheetPresentationController在不同电话上显示不同

kmbjn2e3  于 2023-02-11  发布在  Swift
关注(0)|答案(1)|浏览(97)

我创建了一个UistoryBoardSegue来制作一个“底片Segue”。我们的设计师在他的手机上分享了一张应用程序的截图,底片的显示方式不同,尽管事实上我们都在同一个iOS版本上。
在我和我的模拟器上,当底部表单打开时,它会使源代码视图变亮,然后将其缩小一点,因此它几乎就出现在底部表单的后面

在Designer设备的同一屏幕上,它会使背景变暗并保留源代码视图的完整大小,同时显示导航栏中按钮的顶部

我注意到苹果Map的底部工作表和设计师的一样,没有缩小背景视图。但是我看不到任何会影响这个的设置。我怎么才能阻止工作表调整我的源视图的大小,并像它应该的那样工作呢?
下面是我的代码:

import UIKit

public class BottomSheetLargeSegue: UIStoryboardSegue {
    
    override public func perform() {
        guard let dest = destination.presentationController as? UISheetPresentationController else {
            return
        }
        
        dest.detents = [.large()]
        dest.prefersGrabberVisible = true
        dest.preferredCornerRadius = 30
        
        source.present(destination, animated: true)
    }
}
xxhby3vn

xxhby3vn1#

找到了一个黑客,迫使它永远不会最小化源代码视图,至少,不是真的我想要的,但保持它的一致性。假设,.large()总是应该最小化源代码视图,你可以避免在iOS 16中创建一个自定义的制动器,只是比大的小一点点,像这样:

let customId = UISheetPresentationController.Detent.Identifier("large-minus-background-effect")
let customDetent = UISheetPresentationController.Detent.custom(identifier: customId) { context in
    return context.maximumDetentValue - 0.1
}
dest.detents = [customDetent]

另外,我发现了一种控制底部表单覆盖层变暗的方法。presentationController上有一个containerView属性,但在segue中尝试访问它时,该属性为空。如果强制代码在主线程上运行,则在调用present之后,可以访问containerView并设置自己的颜色/颜色动画
例如:

...
    ...
    source.present(destination, animated: true)

    DispatchQueue.main.async {
        dest.containerView?.backgroundColor = .white
    }

相关问题