Uikit:在 UIViewController 后面模糊和变暗(如弹出框)

Uikit: blur and dim behind a UIViewController (like a popover)

提问人:Afinainflowers 提问时间:8/18/2023 更新时间:8/21/2023 访问量:42

问:

我在一些不同的控制器上展示了一个复杂的控制器 AskController(从 UIViewController、UIPopoverPresentationControllerDelegate 和 UIPopoverControllerDelegate 衍生而来),弹出样式。

有没有一种简单的方法可以自动调暗和模糊所述 AskController 后面发生的任何事情,并以任何方式消除 AskController 关闭时的这些影响?

不能使 AskController 成为 UIPopoverPresentationController 的后代。

即使设备多次改变方向,效果也必须起作用。

已经尝试设置 popoverPresentationController.backgroundColor - 什么都不做。 如果相关,这就是我的呈现方式:

let  windowAsking = AskController()

    windowAsking.modalPresentationStyle = .popover
    if let popoverController = windowAsking.popoverPresentationController {
        popoverController.sourceView = self.view
        popoverController.sourceRect = centerOfTheScreen()
        popoverController.permittedArrowDirections = []
        popoverController.delegate = windowAsking
    }
    self.present(windowAsking, animated: true)
iOS Swift UIVieController , UIKit 弹出窗口

评论


答:

0赞 Duncan C 8/19/2023 #1

以下是我的处理方式:

使视图控制器成为全屏模式。使用全屏模糊视觉效果视图作为背景。然后构建一个看起来像模态/弹出框的视图层次结构,并使其成为模糊视图的子视图。将点击手势识别器添加到模糊视图,以消除模式。

0赞 Afinainflowers 8/21/2023 #2

经过一番反复试验,我发现了一种方法:

lazy var blackerOutOfPreviousScreen: UIVisualEffectView = {
    let blurEffect = UIBlurEffect(style: .systemUltraThinMaterialDark)
    let blackerOut = UIVisualEffectView(effect: blurEffect)
    blackerOut.backgroundColor = UIColor.black.withAlphaComponent(0.1)
    return blackerOut
}()

当显示控制器时:

main?.view.addSubview(blackerOutOfPreviousScreen)
   <insert anchoring to the edges of the screen>

这里的主要内容是显示 AskController 的控制器。

但是这种方式很尴尬,因为需要在打开控制器时分配 main,所以我会欣赏一种更好、更优雅的方式。