【问题标题】:UISheetPresentationController displaying differently on different phonesUISheetPresentationController 在不同手机上显示不同
【发布时间】:2023-02-08 19:25:14
【问题描述】:

我创建了一个 UIStoryboardSegue 来制作“Bottom Sheet segue”。我们的设计师在他的手机上分享了该应用程序的屏幕截图,尽管我们使用的是相同的 iOS 版本,但底部表单显示不同

在我的和我的模拟器上,当底部工作表打开时,它会使源视图变亮,然后将其缩小一点,因此它几乎出现在底部工作表后面

在设计师设备的同一屏幕上,它使背景变暗并使源视图保持全尺寸,显示导航栏中按钮的顶部

我注意到 apple maps bottom sheet 的行为就像设计师一样,没有缩小背景视图。但我看不到任何会影响这一点的设置。我怎样才能阻止工作表调整我的源视图的大小并像它应该的那样工作

这是我的代码:

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)
    }
}

【问题讨论】:

    标签: ios swift storyboard bottom-sheet uisheetpresentationcontroller


    【解决方案1】:

    找到了一个 hack 来强制它至少从不最小化源视图,这不是我真正想要的,但保持一致。据推测,.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 中尝试访问它时它是 nil。如果你强制代码在主线程上运行,在调用 present 之后,你可以访问 containerView 并设置你自己的颜色/颜色动画

    例如

        ...
        ...
        source.present(destination, animated: true)
    
        DispatchQueue.main.async {
            dest.containerView?.backgroundColor = .white
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-01
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多