【问题标题】:Round UIVisualEffectView圆形 UIVisualEffectView
【发布时间】:2015-03-01 19:49:37
【问题描述】:

我有一张地图。在地图上,我想画一个小而模糊的圆圈。我已经实现了这样的东西:

UIVisualEffect *visualEffect = [UIBlurEffect effectWithStyle:UIBlurEffectStyleLight];
self.visualEffectView = [[UIVisualEffectView alloc] initWithEffect:visualEffect];
[self addSubview:self.visualEffectView];

然后在layoutSubviews:

[self.visualEffectView setFrame:CGRectMake(0.f, 0.f, 20.f, 20.f];

现在的问题是使这个视图变得圆润。我试过了:

[self.visualEffectView.layer setCornerRadius:10.f];

但是什么也没发生。另一个尝试是(基于SOF question):

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

但在这种情况下,visualEffectView 是圆形的,但不会模糊:/。有什么办法让它工作吗?

顺便说一句:我已经尝试过FXBlurView,但是它的运行速度非常慢,我不能接受我的应用在 iPhone 5 上仅加载地图 + 模糊约 1 分钟。

【问题讨论】:

    标签: ios objective-c blur uivisualeffectview


    【解决方案1】:

    试用:

    self.visualEffectView.clipsToBounds = YES;
    

    在你设置cornerRadius之后放这个。这应该是它。你可以省略 BezierPath 的东西。希望这会有所帮助:)

    编辑

    我刚刚在自己的项目中尝试了类似的方法。保持圆角模糊的一个好方法是将视觉效果视图作为与视觉效果视图相同框架的新视图的子视图。您现在只需设置这个新父对象UIView 的圆角半径并将其clipsToBounds 属性设置为YES。然后它会自动为其子视图提供角半径,因为它会剪辑到其边界。

    试一试,它适用于我的情况。

    【讨论】:

    • 已经试过了,结果和设置蒙版一样——没有模糊。
    • 但是你的观点是圆的?只有模糊消失了?
    • 是的。在这种情况下,视图是圆形的,但缺少模糊。如果我设置ClipsToBounds:NO,那么视图不是圆的,但我可以看到模糊。
    • @surfrider 您是否尝试将其嵌入到 uiview 中,如编辑部分所述?
    • @croX 是的,我的意思是这种方法。在任何情况下,我都有模糊或圆角。
    【解决方案2】:

    如果有人想知道怎么做,我就知道了,不需要代码:

    1. 在属性编辑器中创建一个视图并将其背景设置为“清除颜色”(它必须是清除颜色而不是默认颜色。

    2. 在第一个视图的顶部拖动另一个视图,将其调整为您想要的视觉效果视图的大小,然后在属性编辑器中将其背景设置为“清除颜色”,然后选中“剪辑子视图”。

      同样在此视图中,转到身份检查器并在“用户定义的运行时属性”下添加一个名为“layer.cornerRadius”的新键路径,使其键入“数字”,并将其值设置为 9 或更高体面的圆形边缘。 (Xcode 中有一个错误,一旦您更改 Type,Key Path 就会更改回默认值,如果发生这种情况,请务必返回并重新输入 layer.cornerRadius)。

    3. 在步骤 3 中的视图顶部拖动一个带有模糊的视觉效果视图。

    4. 现在运行您的程序。您将拥有圆润的边缘、模糊和无伪影。

    现在,我创建了我的链接,它使用 segue 进行链接,如果您需要它与 segue 一起使用,则必须将 segue 设置为 Modal 并且必须将演示文稿设置为 OVER Full Screen(而不仅仅是 Full Screen)。

    这是一个演示它的项目文件的链接。注意第二个视图控制器中视图的层次结构:Project File on Dropbox

    编辑:我的照片消失了,所以我读了它。

    【讨论】:

    • 这对我有帮助,尽管现在(或者,至少在我的情况下)只需剪辑到边界并在视觉效果视图本身上设置 layer.cornerRadius 就足够了。
    【解决方案3】:

    自最初的问题以来,事情显然发生了变化,但我只需在视觉效果视图本身的“用户定义的运行时属性”中选择“剪辑到边界”并设置“layer.cornerRadius”即可实现这一点。

    【讨论】:

    • 对。在其他答案下面的 cmets 中已经说过,现在只需设置 cornerRadius 即可正常工作。另一部分特定于 Interface Builder,因此仅适用于使用该工具的人。我会接受这个答案 - 时间确实发生了变化,现在它就像这个答案一样简单,所以人们不会搜索它。
    【解决方案4】:

    要画圆,CornerRadius 必须等于 width/2 在您的示例中 width = 30 然后 CornerRadius = 30/2 = 15;

    【讨论】:

    • 这只是 SOF 要求的一个例子,与问题无关。无论如何,你已经注意到了,更新的问题。
    【解决方案5】:

    这对我有用

    @IBOutlet weak var blurView: UIVisualEffectView!
    

    在 viewDidLoad() 中

    blurView.layer.cornerRadius = 10;
    blurView.clipsToBounds  =  true
    

    您可以根据自己的喜好更改拐角半径。

    【讨论】:

      【解决方案6】:

      嗯,所以可以像在普通 UIView 上一样应用圆角。但是UIVisualEffectView 看起来不太好,因为圆的弯曲“边”附近的区域没有正确模糊。因为它看起来又丑又丑,我不建议使用 UIVisualEffectView

      【讨论】: