如何在圆形内使用UIVisualEffectView?

10
我正在制作一个自定义控件圆形。圆形的一部分可能是透明的。如果它是半透明的而不是透明的,那么它会更有视觉效果并且看起来更好。
因为视图是矩形的,并且我只想让圆形是半透明的,而不是矩形的其他部分,所以这是一个问题。 UIVisualEffectView 在自定义控件后面。

enter image description here

(出于调试目的,圆圈内没有任何渲染内容)

正如您所看到的,视图会使圆圈外的东西变模糊。

我不知道如何只在视图内部进行模糊处理,而且预发行文档 几乎为空。我唯一的想法是创建许多1x1的视图来覆盖圆圈,但这似乎并不真正起作用,即使它起作用了,它也会是一个缓慢而丑陋的解决方案。如何在视图内部模糊内容,而不模糊其外部的任何内容?

1个回答

30

将圆形视图的图层蒙版设置为填充圆:

CircleControlView *circleView = yourCircleView();

CAShapeLayer *mask = [CAShapeLayer layer];
mask.path = [UIBezierPath bezierPathWithOvalInRect:circleView.bounds].CGPath;
circleView.layer.mask = mask;

更新

Swift playground 示例:

import UIKit
import XCPlayground
import QuartzCore

UIGraphicsBeginImageContext(CGSize(width: 100, height: 100))
let viewPath = UIBezierPath(ovalInRect:CGRect(x:1,y:1,width:98,height:98))
viewPath.lineWidth = 2
viewPath.stroke()
let image = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

let view = UIView(frame:CGRect(x:0,y:0,width:100,height:100))
XCPShowView("view", view)

let label = UILabel(frame:view.bounds)
label.text = "This is the text in the background behind the circle."
label.numberOfLines = 0
view.addSubview(label)

let effectView = UIVisualEffectView(effect:UIBlurEffect(style:.ExtraLight))
effectView.frame = view.bounds
view.addSubview(effectView)

let circleView = UIImageView(image:image)
effectView.addSubview(circleView)

let maskPath = UIBezierPath(ovalInRect:circleView.bounds)
let mask = CAShapeLayer()
mask.path = maskPath.CGPath
effectView.layer.mask = mask

结果:

半透明圆形


值得一提的是 - 我只能在禁用UIVisualEffectView的活力时使其正常工作。如果我打开了活力,遮罩显然会被忽略。 - Benjohn
1
@Benjohn 当视觉效果视图启用活力时,我的圆形遮罩仍然可以正常工作。当活力启用时,你的遮罩不起作用似乎很奇怪。我认为这一定是由其他原因引起的。 - Eliza Wilson
嗨@E.A.Wilson,谢谢 - 你是对的,我使用了错误的活力 :-) - Benjohn
这能用不同的图像来完成吗?比如我有一个箭头图像,我想让UIEffectsView的效果只应用于该图像。我该如何将此代码应用于该图像? - Jacob
我不明白你在问什么,但听起来与原问题不同,应该是一个独立的问题。 - rob mayoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接