在 UIBlurEffect 上绘制洞

2024-07-03

Xcode 8.0 - 斯威夫特 2.3
我有一个内部扩展来创建效果很好的模糊层:

internal extension UIView {
    
    /**
     Add and display on current view a blur effect.
     */
    internal func addBlurEffect(style style: UIBlurEffectStyle = .ExtraLight, atPosition position: Int = -1) -> UIView {
        // Blur Effect
        let blurEffectView = self.createBlurEffect(style: style)
        if position >= 0 {
            self.insertSubview(blurEffectView, atIndex: position)
        } else {
            self.addSubview(blurEffectView)
        }
        return blurEffectView
    }
 
    internal func createBlurEffect(style style: UIBlurEffectStyle = .ExtraLight) -> UIView {
        let blurEffect = UIBlurEffect(style: style)
        let blurEffectView = UIVisualEffectView(effect: blurEffect)
        blurEffectView.frame = self.bounds
        blurEffectView.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
        return blurEffectView
    }
    
}

问题是:如何在模糊叠加中添加异形孔? 我做了很多尝试:

let p = UIBezierPath(roundedRect: CGRectMake(0.0, 0.0, self.viewBlur!.frame.width, self.viewBlur!.frame.height), cornerRadius: 0.0)
p.usesEvenOddFillRule = true
let f = CAShapeLayer()
f.fillColor = UIColor.redColor().CGColor
f.opacity = 0.5
f.fillRule = kCAFillRuleEvenOdd
p.appendPath(self.holePath)
f.path = p.CGPath
self.viewBlur!.layer.addSublayer(f)

但结果是:

我不明白为什么孔没问题UIVisualEffectView但不在_UIVisualEffectBackdropView

UPDATE

我尝试过 @Arun 解决方案(使用 UIBlurEffectStyle.Dark),但结果不一样:

UPDATE 2

With @Dim_ov's solution I have: enter image description here

为了使这项工作我需要隐藏_UIVisualEffectBackdropView这样:

    for v in effect.subviews {
        if let filterView = NSClassFromString("_UIVisualEffectBackdropView") {
            if v.isKindOfClass(filterView) {
                v.hidden = true
            }
        }
    }

在 iOS 10 中你必须使用mask的财产UIVisualEffectView代替CALayer's mask.

我在 iOS 10 或 Xcode 8 的一些早期测试版的发行说明中看到了这一点,但我现在找不到这些说明:)。一旦找到正确的链接,我将立即更新我的答案。

下面是适用于 iOS 10/Xcode 8 的代码:

class ViewController: UIViewController {
    @IBOutlet var blurView: UIVisualEffectView!

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        updateBlurViewHole()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        updateBlurViewHole()
    }

    func updateBlurViewHole() {
        let maskView = UIView(frame: blurView.bounds)
        maskView.clipsToBounds = true;
        maskView.backgroundColor = UIColor.clear

        let outerbezierPath = UIBezierPath.init(roundedRect: blurView.bounds, cornerRadius: 0)
        let rect = CGRect(x: 150, y: 150, width: 100, height: 100)
        let innerCirclepath = UIBezierPath.init(roundedRect:rect, cornerRadius:rect.height * 0.5)
        outerbezierPath.append(innerCirclepath)
        outerbezierPath.usesEvenOddFillRule = true

        let fillLayer = CAShapeLayer()
        fillLayer.fillRule = kCAFillRuleEvenOdd
        fillLayer.fillColor = UIColor.green.cgColor // any opaque color would work
        fillLayer.path = outerbezierPath.cgPath
        maskView.layer.addSublayer(fillLayer)

        blurView.mask = maskView;
    }
}

斯威夫特2.3版本:

class ViewController: UIViewController {
    @IBOutlet var blurView: UIVisualEffectView!

    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)

        updateBlurViewHole()
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        updateBlurViewHole()
    }

    func updateBlurViewHole() {
        let maskView = UIView(frame: blurView.bounds)
        maskView.clipsToBounds = true;
        maskView.backgroundColor = UIColor.clearColor()

        let outerbezierPath = UIBezierPath.init(roundedRect: blurView.bounds, cornerRadius: 0)
        let rect = CGRect(x: 150, y: 150, width: 100, height: 100)
        let innerCirclepath = UIBezierPath.init(roundedRect:rect, cornerRadius:rect.height * 0.5)
        outerbezierPath.appendPath(innerCirclepath)
        outerbezierPath.usesEvenOddFillRule = true

        let fillLayer = CAShapeLayer()
        fillLayer.fillRule = kCAFillRuleEvenOdd
        fillLayer.fillColor = UIColor.greenColor().CGColor
        fillLayer.path = outerbezierPath.CGPath
        maskView.layer.addSublayer(fillLayer)

        blurView.maskView = maskView
    }
}

UPDATE

嗯,这是 Apple 开发者论坛的讨论,而不是 iOS 发行说明。但苹果代表已经给出了答案,所以我认为,这个信息可能被认为是“官方”的。

讨论链接:https://forums.developer.apple.com/thread/50854#157782 https://forums.developer.apple.com/thread/50854#157782

遮蔽视觉效果视图的图层并不能保证产生 正确的结果 – 在某些情况下,在 iOS 9 上它会产生 效果看起来正确,但可能来源错误的内容。 视觉效果视图将不再来源错误的内容,而是 屏蔽视图的唯一受支持的方法是使用cornerRadius 直接在视觉效果视图的图层上(这应该产生 与您在此处尝试的结果相同)或使用视觉效果 视图的 maskView 属性。

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

在 UIBlurEffect 上绘制洞 的相关文章

  • UIDatePicker 在 iOS 9 中无法正常显示

    我没有使用自动布局 这就是 UIDatePicker 在 iOS 9 上我的应用程序中的显示方式 选择器在 iOS 8 中看起来完美无缺 但问题仅存在于 iOS 9 中 知道如何解决此问题 P S 使用 auto布局目前对我来说不是一个解决
  • 如何在 MKMapView iOS 中显示多个注释?

    我是 iOS 开发新手 我想在 iOS 中的 MKMapViewController 中显示多个注释 为此我在 viewDidLoad 方法中编写了代码 void viewDidLoad super viewDidLoad self map
  • 导航栏标题视图对齐

    我希望我的导航栏在中间显示两件事 其中之一是列表名称 另一个是用户名称 用户名将放置在列表名称下 到目前为止我所做的是 我以编程方式创建了两个标签和一个超级视图 并设置titleView of navigationItem override
  • 应用程序删除后的iOS应用程序持久设置

    我们正在创建一个应用程序 如下所示 用户从 2 个免费 代币 开始 用户可以通过应用内购买 0 99 美元购买一包 10 个代币 我们已经实现了这个使用NSUserDefaults保存令牌数量 有没有办法让我们的免费 2 令牌设置持久化 即
  • PHAsset(或 ALAsset)跨设备标识符

    我实际上正在创建一个 iOS 应用程序 并且想要在 SQLite 数据库中存储有关照片库图片的一些详细信息 我还希望能够在用户拥有的不同设备上共享这些数据 想象一下有人想要在他的 iPhone 上重新组织图片 并想要在他的 iPad 上检索
  • 没有可编译的体系结构(ARCHS=i386、VALID_ARCHS=arm64 armv7 armv7s)

    Preface 我确实看过类似的问题 https stackoverflow com questions 22328882 xcode 5 1 no architectures to compile for only active arch
  • 像 peek and pop 一样手动振动 iPhone 6S?

    如何手动触发类似单击的振动 就像使用 peek pop 或应用程序快捷方式时发生的振动一样 这个方法很容易实现 而且效果非常好 我自己尝试过 import AudioToolbox AudioServicesPlaySystemSound
  • 如何在 Swift 中观察多个节点中 Firebase 子值的变化?

    我的 Firebase 数据库中有一个 用户 节点 其中的每个用户都有一个 root 及其 uid 每个用户的属性之一是 坐标 我想观察所有用户的任何坐标的任何变化 我几乎需要这样的东西 usersDatabaseReference chi
  • 提交到 AppStore:发现意外的 Mach-O 标头代码:0x72613c21

    我构建了一个 iOS 应用程序 我想将其提交给 Apple 以便让我的同事测试它 我首先清理了工作区 我使用的是 CocoaPods 然后将其存档 然后我进入 档案 窗口并单击 上传到 App Store 出现以下错误 发现意外的 Mach
  • 不要在 iOS 上显示蜂窝数据警告

    如果用户决定不允许应用程序在每次尝试打开应用程序时访问蜂窝数据 则会显示一条警告 告诉他们蜂窝数据已关闭 SDK中有没有办法停止显示此消息或控制其显示的时间 位置 如果您在权限被撤销的情况下尝试访问互联网 系统将显示此消息 为了防止它出现
  • Google 登录显示不正确的项目名称 - iOS

    我一直在集成 Google 登录 以便使用 Google Calendar API 同步日历事件 当我尝试登录时 我收到了这个消息 正如您所看到的 项目 应用程序的名称显示为 project xxxxxxxxx 而不是项目名称本身 如何在这
  • 使用 Appium 和 Ruby 测试 iOS 应用程序时等待元素加载?

    我正在测试一个iOS应用程序 登录后无法与元素交互 因为Appium运行得太快了 有人可以给我指出一个使用 WebDriverWait 风格等待 Appium iOS 测试的示例吗 最好用红宝石 Thanks 这对我有用 但我是 Appiu
  • 如何在 iOS 7 中将 CSV 文件关联到我的应用程序

    今天是个好日子 我逐行遵循这两个教程 尝试将我的应用程序关联到 csv 文件 电子邮件应用程序附件 但是在我将这些更改添加到我的应用程序的 plist 文件中之后 然后构建我的应用程序并在我的设备 iPhone 4 iOS 7 0 4 没有
  • 在 Xamarin.Forms 中添加方向更改布局

    我需要实现的是 在将屏幕从纵向更改为横向时向现有页面添加布局 我已经成功地使用检测方向变化void OnSizeAllocation 双倍宽度 双倍高度 但我无法为此事件添加布局 我的示例 C 代码是 public class MyLayo
  • Firefox 通知是如何实现的?

    我想在 Firefox 扩展中实现一个通知机制 相当于 Firefox 的 保存密码 选项或弹出阻止警告 并在主窗口上方滑动黄色条 现在有人知道如何在 XUL 中实现这一点吗 谢谢你的帮助 你会想要使用通知框元素 https develop
  • iOS 7.1 CommonCrypto 库抱怨:隐式转换丢失整数精度:'NSUInteger'(无符号长整型)到 CC_LONG(无符号整型)

    我在从文件执行 MD5 时收到上述错误 标题中 我通常可以处理这些类型的 32 gt 64 位转换问题 但在这种情况下 我不知道我应该做什么 因为 CC MD5 是其中的一部分的CommonCrypto gt CommonDigest iO
  • 以编程方式 Swift 在 UIView 上添加 UITextField

    我是 Swift 和 iOS 编程新手 我试图创建一个UITextField以编程方式使用 Swift 但无法完全正确 另外 如何将其更改为半透明效果以淡入背景 var myField UITextField UITextField fra
  • 在 Swift 中捕获 [weak self] 的 Realm 通知

    在 Swift 的 Realm 文档中 有关以下内容的部分通知 https realm io docs swift latest notifications有这个示例代码 class ViewController UITableViewCo
  • 导航回 ViewController 时出现重复消息问题

    我有一个 ViewController 它向用户显示更多信息 然后他们单击一个按钮 它将它们发送到我的 messageView 它是一个 JSQ ViewController JSQViewController 使用集合视图类 当用户导航回
  • iOS 7 AVPlayer AVPlayerItem 持续时间在 iOS 7 中不正确

    我的应用程序中有以下代码 NSURL url NSURL fileURLWithPath self DocDir stringByAppendingPathComponent self FileName isDirectory NO sel

随机推荐

  • 如何创建一个 HTML 按钮,其作用类似于同一页面上某个项目的链接?

    我想创建一个 HTML 按钮 其作用类似于指向同一页面上的项目的链接 因此 当您单击该按钮时 它会重定向到同一页面上的项目 我怎样才能做到这一点 我会将解决方案限制为 HTML CSS 和 JavaScript 因为目前我没有使用任何其他语
  • 如何让“IE 6 条件注释”发挥作用?

    我有这个标记 效果很好 div class header headerNotIE6 我现在正在尝试放置一个特定于 ie6 的解决方法 因此我尝试仅在浏览器不是 IE 6 的情况下使用此 div 因此 如果它是 IE7 8 firefox 和
  • 随机播放与排列 numpy

    有什么区别numpy random shuffle x and numpy random permutation x 我已阅读文档页面 但当我只想随机洗牌数组的元素时 我无法理解两者之间是否有任何区别 更准确地说 假设我有一个数组x 1 4
  • Android 在 onTextChanged 中调用 setText

    为了防止无限循环 我做了这样丑陋的事情 Override protected void onTextChanged CharSequence text int start int lengthBefore int lengthAfter S
  • Angular 的“controllerAs”在routeProvider 中不起作用

    我正在尝试使用controllerAs财产在 routeProvider路线没有任何成功 这是示例代码 var app angular module app ngRoute app config routeProvider location
  • 在 Tkinter 文本小部件被文本小部件绑定后,如何在 Tkinter 文本小部件中绑定自身事件?

    我想在之后绑定自身事件Text小部件类绑定 以便在调用我的绑定函数时更改小部件的文本 以我的绑定为例self text bind
  • 有什么办法可以覆盖Python的内置类吗?

    我正在尝试改变 python 的行为int类 但我不确定是否可以使用纯Python来完成 这是我到目前为止所尝试的 import builtins class int new builtins int def eq self other r
  • Webkit 背面可见性不起作用

    我正在构建一个简单的示例来使用以下方法翻转卡片 webkit transform rotateY财产 前几天还好好的 突然就不行了 该效果仍然有效 但是当我将鼠标悬停在卡片上时 正面应该消失以使背面可见 为此我正在使用 webkit bac
  • FloatToStr / DateToStr 的线程安全性

    我刚刚在文档中发现FloatToStr and DateToStr它们的单参数重载不是线程安全的 原因是它们访问存储在全局变量中的本地化信息 我的问题是 如果我不在运行时更改格式设置 这有任何实际意义吗 据我了解 只要每个人都只读取格式设置
  • 显示 100% 带边距的 div 宽度

    我想显示一个可扩展的div width 100 有边距 page background red float left width 100 height 300px margin background green float left wid
  • Protobuf-net跳过特定字段的反序列化

    我已经序列化了这个类 ProtoContract public class TestClass ProtoMember 1 public int hugeArray ProtoMember 2 public int x ProtoMembe
  • 如何正确关闭Landscape VideoView Activity?

    在我的应用程序中 我有一个以横向模式播放 http 直播流视频的活动 我的 AndroidManifest xml
  • PHPExcel如何对从mysql表创建的整个文档应用对齐

    I used PHPExcel库根据 mysql 查询创建的表生成 excel 文件 我使用来自不同查询的各个数据创建了多个选项卡 我需要将所有选项卡 工作表 中的所有单元格中的数据对齐到中心 这是我的代码 mysql xls new My
  • 在Python中像\\uXXXX这样的字符串的转换[重复]

    这个问题在这里已经有答案了 我从第三方服务收到这样的字符串 gt gt gt s u0e4f u032f u0361 u0e4f 我知道这个字符串实际上包含单个反斜杠 小写 u 等的序列 如何转换该字符串 以便 u0e4f 被替换为 u0e
  • 缓存抖动,一般有助于理解

    我试图了解缓存抖动 以下文本正确吗 以下面的代码为例 long max 1024 1024 long a max b max c max d max e max for i 1 i lt max i a i b i c i d i e i
  • 设置 UITabBar 中选定选项卡的色调颜色

    在 Xcode 5 Dev Preview 2 中 我能够执行以下命令 UITabBar appearance setTintColor UIColor whiteColor 所选图像和文本的颜色 白色 在 Xcode 5 Dev Prev
  • Mongodb聚合匹配查询,优先全匹配

    我正在尝试对字段执行 mongodb 正则表达式查询 我希望查询在找到一个匹配项时优先考虑完整匹配项 然后再优先考虑部分匹配项 例如 如果我有一个充满以下条目的数据库 username patrick username robert use
  • 使用WebClient时如何绕过系统代理

    我在窗口中使用代理 如何在从某些网站上传或下载时使用 Web 客户端绕过代理服务器设置 即使我在控制面板中使用代理服务器 你可以用这个 WebClient webclient new WebClient webclient Proxy nu
  • 特定键盘事件

    我正在使用 Vue 并且在 div 中有 Quill 编辑器 这就是为什么我使用已弃用的DOMSubtreeModified 我想触发一个事件来发送 API 请求以将编辑器的内容保存到数据库中 现在 下面是我所拥有的 但当我删除字符时它不会
  • 在 UIBlurEffect 上绘制洞

    Xcode 8 0 斯威夫特 2 3我有一个内部扩展来创建效果很好的模糊层 internal extension UIView Add and display on current view a blur effect internal f