繁体   English   中英

iOS 10上的UIVisualEffectView掩码

[英]UIVisualEffectView mask on iOS 10

我有一个UIVisualEffectView和一个我希望查看其形状的形状( CGPath )。

我听说掩盖UIVisualEffectView会做到这一点。

这就是我所做的( PocketSVG是一个帮助您将SVG文件转换为CGPath的API)。 码:

let blur: UIBlurEffect = UIBlurEffect(style: .Light)
let ev: UIVisualEffectView = UIVisualEffectView(effect: blur)
ev.frame = self.frame
ev.translatesAutoresizingMaskIntoConstraints = false
self.addSubview(ev)

ev.rightAnchor.constraintEqualToAnchor(self.rightAnchor).active = true
ev.bottomAnchor.constraintEqualToAnchor(self.bottomAnchor).active = true
ev.leftAnchor.constraintEqualToAnchor(self.leftAnchor).active = true
ev.heightAnchor.constraintEqualToAnchor(self.heightAnchor, multiplier: 1.5).active = true

let myPath: CGPathRef = PocketSVG.pathFromSVGFileNamed("CategoriesBar").takeUnretainedValue()
var transform: CGAffineTransform = CGAffineTransformMakeScale(self.frame.size.width / 754.0, self.frame.size.height / 220.0)

let transformedPath: CGPathRef = CGPathCreateMutableCopyByTransformingPath(myPath, &transform)!

let maskLayer = CAShapeLayer()
maskLayer.path = transformedPath
maskLayer.fillRule = kCAFillRuleEvenOdd

let maskView = UIView(frame: self.frame)
maskView.backgroundColor = UIColor.blackColor()
maskView.layer.mask = maskLayer

ev.maskView = maskView

它在iOS 9及更低版本上运行良好,但它不适用于iOS 10Xcode 8 (没有模糊,只有透明视图)。

如果有人想尝试,这里是我的SVG文件的链接:

https://www.dropbox.com/s/mjql2bzf37vpl2r/CategoriesBar.svg?dl=0

知道如何才能让它在iOS 10

谢谢!

在iOS 10 / Xcode 8中使用layer.mask时,遗憾的是重新屏蔽了VisualEffectViews。 我发现,在接受的答案代码示例这里 应该为你工作......这似乎只能由斯威夫特3语法从您的代码不同(据我可以看到)。 值得双重检查代码事件的顺序和您正在使用的语法,但是,为了确保您没有遗漏任何东西。

let maskLayer = CAShapeLayer()
maskLayer.path = path.cgPath
maskLayer.fillRule = kCAFillRuleEvenOdd

let borderLayer = CAShapeLayer()
borderLayer.path = circle.cgPath
borderLayer.strokeColor = UIColor.white.cgColor
borderLayer.fillColor = UIColor.clear.cgColor //Remember this line, it caused me some issues
borderLayer.lineWidth = 10

let maskView = UIView(frame: self.view.frame)
maskView.backgroundColor = UIColor.black
maskView.layer.mask = maskLayer

blur.layer.addSublayer(borderLayer)
blur.mask = maskView

您还可以在创建蒙版后尝试使用setNeedsDisplay()layoutIfNeeded()强制进行视图布局。 请参阅8月4日flainez在苹果开发人员论坛上关于主题的评论,他说这解决了显示屏蔽的VisualEffectView的问题。

上面的链接线程也广泛讨论了这个问题,代码示例以及Apple员工的反馈和建议,“Rincewind”正在解决这个问题。 如果你还在努力解决这个问题,我建议你仔细阅读。 我认为整体共识是该问题可以解决蒙面VisualEffectsViews,但对于在视图之间转换期间尝试使用蒙版VisualEffectsViews的开发人员来说无法解析。

您还可以查看2015年WWDC视频,了解UIVisualEffectView。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM