没有模糊视图效果的 UIAlertController 操作表

2023-12-22

我在用着UIAlertController对于一些行动。

但我不太喜欢模糊视图效果在操作组视图中(参见下面的屏幕截图)。

我正在尝试消除这种模糊效果。我在网上查了一下,没有找到任何APIUIAlertController这样就可以消除这种模糊效果。另外,根据他们的苹果文档here https://developer.apple.com/reference/uikit/uialertcontroller%20here :

UIAlertController 类旨在按原样使用,不支持子类化。此类的视图层次结构是私有的,不得修改。

我看到 Instagram 也消除了这种模糊的视图效果:

我找到删除它的唯一方法是通过扩展自己更新视图层次结构UIAlertController.

extension UIAlertController {
    @discardableResult private func findAndRemoveBlurEffect(currentView: UIView) -> Bool {
        for childView in currentView.subviews {
            if childView is UIVisualEffectView {
                childView.removeFromSuperview()
                return true
            } else if String(describing: type(of: childView.self)) == "_UIInterfaceActionGroupHeaderScrollView" {
                // One background view is broken, we need to make sure it's white.
                if let brokenBackgroundView = childView.superview {
                    // Set broken brackground view to a darker white
                    brokenBackgroundView.backgroundColor = UIColor.colorRGB(red: 235, green: 235, blue: 235, alpha: 1)
                }
            }
            findAndRemoveBlurEffect(currentView: childView)
        }
        return false
    }
}

let actionSheetController = UIAlertController(title: title, message: nil, preferredStyle: .actionSheet)
actionSheetController.view.tintColor = .lightBlue
actionSheetController.removeBlurryView()

这工作得很好,它消除了我的模糊视图效果:

我想知道......我的解决方案是实现这一目标的唯一方法吗?或者我对警报控制器的外观缺少一些东西? 也许有一种更干净的方法来实现这个结果?还有其他想法吗?


子类化更容易UIAlertController.

这个想法是每次遍历视图层次结构viewDidLayoutSubviews被调用,删除效果UIVisualEffectView并更新他们的backgroundColor:

class AlertController: UIAlertController {

    /// Buttons background color.
    var buttonBackgroundColor: UIColor = .darkGray {
        didSet {
            // Invalidate current colors on change.
            view.setNeedsLayout()
        }
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        // Traverse view hierarchy.
        view.allViews.forEach {
            // If there was any non-clear background color, update to custom background.
            if let color = $0.backgroundColor, color != .clear {
                $0.backgroundColor = buttonBackgroundColor
            }
            // If view is UIVisualEffectView, remove it's effect and customise color.
            if let visualEffectView = $0 as? UIVisualEffectView {
                visualEffectView.effect = nil
                visualEffectView.backgroundColor = buttonBackgroundColor
            }
        }

        // Update background color of popoverPresentationController (for iPads).
        popoverPresentationController?.backgroundColor = buttonBackgroundColor
    }

}


extension UIView {

    /// All child subviews in view hierarchy plus self.
    fileprivate var allViews: [UIView] {
        var views = [self]
        subviews.forEach {
            views.append(contentsOf: $0.allViews)
        }

        return views
    }

}

Usage:

  1. 创建警报控制器。
  2. 设置按钮背景颜色:alertController.buttonBackgroundColor = .darkGray
  3. 定制并呈现控制器。

Result:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

没有模糊视图效果的 UIAlertController 操作表 的相关文章

随机推荐

  • 如何获取WCF服务的所有方法?

    如何从代码中获取启用 WCF silverlight 的服务的所有方法的列表 我已经向 Silverlight 应用程序添加了服务引用 我可以使用反射获取所有方法吗 如果可以请给我提供例子 给定服务类的类型 您可以使用获取方法 http m
  • 使用 Firebase Auth 模拟器以编程方式创建用户

    我正在尝试使用 Firebase Auth 模拟器编写玩笑测试 并继续收到以下 CORS 错误 console error Error Headers X Client Version forbidden at dispatchError
  • 无法让 Log4Net 在我的 ASP.NET 网站上工作:(

    非常简单的问题 gt 我似乎无法在 ASP NET 应用程序中从 Log4Net 获取任何数据 我有一个简单的 ASP NET 网站 它引用了一个类库 在这个类库中 我有一些调用记录器的行 我正在尝试在 Visual Studio 2008
  • Jira 用于错误跟踪和客户支持?

    我们正在考虑使用 Jira 进行错误跟踪 并将其与 Git 集成 以将错误修复与版本处理联系起来 您是否也推荐 Jira 来提供客户支持 还是我们应该寻找其他系统 例如 Zendesk 来实现此目的 我知道可以通过某种方式将 Hipchat
  • String s = "something"; 和有什么区别和 String s = new String("某事"); [复制]

    这个问题在这里已经有答案了 可能的重复 字符串对象和字符串文字之间的区别 https stackoverflow com questions 3297867 difference between string object and stri
  • 为什么该规则不能防止重复密钥违规?

    postgresql 我试图COPY将 csv 数据写入表中 但我收到重复的密钥违规错误 并且无法判断COPY为了忽略这些 所以根据互联网智慧 我尝试添加此规则 CREATE OR REPLACE RULE ignore duplicate
  • Python 中的数组解构

    我希望能够vals最后一行更清楚 import rx from rx import operators as op light stream rx range 1 10 pipe op with latest from irradiance
  • 如何使用 Liquid (Shopify) 遍历商店的所有产品?

    我不能 我知道 Shopify 对页面上可以循环浏览的产品数量施加了限制 当前限制为 50 实际上 这不是真的 可以使用 Liquid 遍历商店的所有产品 paginate collections all products products
  • 如何获取当前目标蚂蚁的值?

    如何获取当前目标蚂蚁的值 它是否存在一个称为 TARGET 的特殊变量 基于问题 https issues apache org bugzilla show bug cgi id 44980你必须修补 ant 或使用 javascript
  • 解析错误:语法错误,意外的“else”(T_ELSE)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我编辑此代码以在 select 为空时显示消息 并收到此错误 Parse error syntax error unexpecte
  • setX()、setTranslationX()、setY() 和 setTranslationY()

    setX setY 和 setTranslationX setTranslationY 有什么区别 他们是在现有坐标上设置偏移还是设置绝对位置 如果他们设置绝对坐标 会不会与父布局的约束冲突 假设我们有类似的东西 View 1 View 2
  • 将 war 从 S3 部署到 AWS Elastic Beanstalk

    我有2台AWS机器 1 dev ec2 2 prod elastic beanstalk 每次提交后 我都会在 dev machine1 上进行构建和部署 这会生成一个 war 文件 该文件也将使用 s3cmd 工具上传到 S3 存储桶上
  • php的'include'是函数还是语句?

    网络上有很多这两种情况的示例 php 手册说 include 语句 这似乎是矛盾的 如果它是一个语句 它不应该没有括号吗 这两者都有效 include somefile php include somefile php 那么我或其他人应该关
  • 如何判断 Rails 代码是通过 rake 还是 script/generate 运行?

    我有一个有点重的插件 项目符号 配置有 Growl 通知 如果我只是运行 rake 任务或生成器 我不想启用它 因为它在这些情况下没有用 有什么方法可以判断是否是这种情况吗 就这么简单 if rails rake task puts Gue
  • 什么类型的序列化在幕后使用 Wcf?

    我知道 net 中有 3 种类型的序列化 Soap Xml Binary Wcf 指示 DataContract 属性也序列化 但是通过what 二进制不是 我知道 那么通过什么机制 它是为给定端点定义的绑定 它指定了序列化机制 例如 ba
  • python seed() 不保持相同的序列

    我正在使用 random seed 来尝试保持 random sample 与我从列表中采样更多值相同 并且在某些时候数字会发生变化 我认为的一个目的Seed 函数的作用是保持数字相同 这是我做的一个测试 以证明它不会保留相同的数字 imp
  • 编译器在转换整型常量时做什么?

    使用以下宏 define MIN SWORD signed int 0x8000 例如以下表达式 signed long s32 if s32 lt signed long MIN SWORD 预计要做以下检查 if s32 lt 3276
  • 数据表中的字典

    说我有3个Dictionary
  • 应用程序缓存清单+本地存储大小限制

    我正在构建一个可能有大量离线存储需求的应用程序 我想知道是否可以同时使用离线缓存清单 5MB 和本地存储 5MB 来使用 10MB 存储 请注意 这是一个 Intranet 应用程序 因此我们可以控制设备 我已经在 Chrome Firef
  • 没有模糊视图效果的 UIAlertController 操作表

    我在用着UIAlertController对于一些行动 但我不太喜欢模糊视图效果在操作组视图中 参见下面的屏幕截图 我正在尝试消除这种模糊效果 我在网上查了一下 没有找到任何APIUIAlertController这样就可以消除这种模糊效果