如何在 CAShapeLayer(Rounded-Recr 角 UIView)上设置 maskToBounds 效果?

Posted

技术标签:

【中文标题】如何在 CAShapeLayer(Rounded-Recr 角 UIView)上设置 maskToBounds 效果?【英文标题】:How can I set maskToBounds effect on CAShapeLayer(Rounded-Recr cornered UIView)? 【发布时间】:2013-04-18 03:16:33 【问题描述】:

I want to make the glow effect spread outside of thisView.

我用这段代码制作了Half-Rounded rect cornered UIVew

Round two corners in UIView

这是我的代码。

+ (UIView *)makeUpperHalfRoundedView:(UIView *)view 
    CAShapeLayer *maskLayer = [CAShapeLayer layer];
    maskLayer.frame = view.bounds;
    UIBezierPath *roundedPath =
    [UIBezierPath bezierPathWithRoundedRect:maskLayer.bounds
                          byRoundingCorners:UIRectCornerTopLeft | UIRectCornerTopRight
                                cornerRadii:CGSizeMake(8.f, 8.f)];
    maskLayer.fillColor = [[UIColor blackColor] CGColor];
    maskLayer.backgroundColor = [[UIColor clearColor] CGColor];
    maskLayer.path = [roundedPath CGPath];
//    maskLayer.masksToBounds = NO;

    //Don't add masks to layers already in the hierarchy!
    UIView *superview = [view superview];
    [view removeFromSuperview];
    view.layer.mask = maskLayer;
    [superview addSubview:view];

    return view;

在这个视图中有two image buttons 靠近边界。 如果按钮上发生触摸事件,则会显示发光效果(showsTouchWhenHighlighted)

在使用这段代码之前,我只是用过

thisView.layer.cornerRadius = 8;
thisVIew.layer.masksToBounds = NO;

并且发光效果散布在“thisView”之外。

但是在 'thisView' 中使用 CAShapeLayer 来遮盖半醒的矩形后,发光效果会被边界遮盖。

【问题讨论】:

"不要给层次结构中已有的图层添加蒙版!"谁告诉你那个??? 注释刚刚写在代码上:) 【参考方案1】:

您所看到的正是面具的工作原理。您正在将蒙版应用于超级视图的图层。让我们将该视图称为superview(就像在您的代码中一样)。好的,那会做什么呢?它将掩盖superview 及其所有子层。 这包括它的子视图。它的子视图实际上是它的子层。

因此,由于按钮是 superview 的子视图,因此它们像 superview 中的其他所有内容一样被屏蔽。

如果您不希望这种情况发生,请不要将按钮设置为 superview 的子视图。例如,它们可以坐在superview 之上,而不是其子视图。

【讨论】:

感谢您的建议。我想到了一个主意。制作具有完全相同框架的两层。一个是frontView,其中包含按钮,另一个是backView,它是半圆角矩形UIView。然后我使用上面的代码制作backView,并将两个按钮移动到frontView。这个怎么样? 正是我的想法。或者只是将两个按钮移到前面,让它们成为superview.superview 的子视图 :) 我用两个分离的视图解决了这个问题,它们是一个超级视图的子视图。你的建议很好。谢谢;-)

以上是关于如何在 CAShapeLayer(Rounded-Recr 角 UIView)上设置 maskToBounds 效果?的主要内容,如果未能解决你的问题,请参考以下文章

如何在PHP中舍入浮点数?

如何将 CAGradientLayer 添加到 CAShapeLayer?

如何在旋转时处理 UIView 圆角(使用 CAShapeLayer)

如何将 CAShapeLayer 转换为 CAGradientLayer?

iOS - 如何在使用自定义 UIBezierPath 绘制的 CAShapeLayer 中设置 CATextLayer?

如何通过点击角来改变 CAShapeLayer 中的多边形形状?