大佬教程收集整理的这篇文章主要介绍了ios – 在UIBlurEffect上画一个洞,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
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中没有
我试过@Arun解决方案(使用UIBlurEffectStyle.Dark),但结果不一样:
更新2
为了完成这项工作,我需要以这种方式隐藏_UIVisualEffectBACkdropView:
for v in effect.subviews { if let filterView = NSClassFromString("_UIVisualEffectBACkdropView") { if v.isKindOfClass(filterView) { v.hidden = true } } }
对于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; } }
Swift 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: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 } }
嗯,这是Apple Developer论坛的讨论,而不是iOS发行说明.但是,我认为Apple的代表有答案,这些信息可能被视为“官方”.
以上是大佬教程为你收集整理的ios – 在UIBlurEffect上画一个洞全部内容,希望文章能够帮你解决ios – 在UIBlurEffect上画一个洞所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。