在 UIVisualEffect 视图上创建一个透明孔

Posted

技术标签:

【中文标题】在 UIVisualEffect 视图上创建一个透明孔【英文标题】:Creating a transparent hole on UIVisualEffect view 【发布时间】:2015-08-30 00:26:50 【问题描述】:

我正在尝试在 UIVisualEffectView 上创建一种透明的孔视图。我正在关注here 给出的解决方案。我附上了我在here 上工作的示例代码。我正在尝试创建一个透明视图,其框架取自模糊视图后面的图像视图。任何人都可以告诉我我在这里做错了什么?

【问题讨论】:

【参考方案1】:

您可以使用UIBezierPath 来创建您想要的面具。

blurView.layer.mask = (
    CGRect roundedRect = self.bounds;
    roundedRect.origin.x = roundedRect.size.width / 4.0f;
    roundedRect.origin.y = roundedRect.size.height / 4.0f;
    roundedRect.size.width /= 2.0f;
    roundedRect.size.height /= 2.0f;

    CGFloat cornerRadius = roundedRect.size.height / 2.0f;

    UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.bounds];
    UIBezierPath *croppedPath = [UIBezierPath bezierPathWithRoundedRect:roundedRect cornerRadius:cornerRadius];
    [path appendPath:croppedPath];
    [path setUsesEvenOddFillRule:YES];

    CAShapeLayer *mask = [CAShapeLayer layer];
    mask.path = path.CGPath;
    mask.fillRule = kCAFillRuleEvenOdd;
    mask;
);

【讨论】:

太棒了!像魅力一样工作! 谢谢uuuuuuuu ;) 如何设置仅可点击的圆形清晰视图意味着用户交互仅在该部分启用@cnotethegr8【参考方案2】:

Swift 5 版本的懒人解决方案 :)

    var roundedRect = visualEffectsView.bounds
    roundedRect.origin.x = roundedRect.size.width / 4
    roundedRect.origin.y = roundedRect.size.height / 4
    roundedRect.size.width = roundedRect.size.width / 2
    roundedRect.size.height = roundedRect.size.height / 2

    let cornerRadius = roundedRect.size.height / 2

    let path = UIBezierPath(rect: visualEffectsView.bounds)
    let croppedPath = UIBezierPath(roundedRect: roundedRect, cornerRadius: cornerRadius)
    path.append(croppedPath)
    path.usesEvenOddFillRule = true

    let mask = CAShapeLayer()
    mask.path = path.cgPath
    mask.fillRule = .evenOdd
    visualEffectsView.layer.mask = mask

【讨论】:

以上是关于在 UIVisualEffect 视图上创建一个透明孔的主要内容,如果未能解决你的问题,请参考以下文章

带有非透明子视图的 iOS 8 透明视图

透明子视图控制器的视图

使用ABAP CDS视图创建服务

透明子视图控制器的视图

如何停止透​​明PNG图像在tableview单元格中显示为黑色

neutron-metadata-proxy无响应,导致windos2003密码透传失败