UIView 上的渐变蒙版

Posted

技术标签:

【中文标题】UIView 上的渐变蒙版【英文标题】:Gradient mask on UIView 【发布时间】:2011-09-21 21:24:09 【问题描述】:

我有一个 UIView,希望它的底部淡出为 0 不透明度。

是否可以对 UIView (CALayer) 执行此操作以影响整个 UIView 及其内容?

【问题讨论】:

对于其他使用渐变蒙版的人来说,如果应用于UIStackView,它将不起作用。 【参考方案1】:

是的,您可以通过将CAGradientLayer 设置为视图的图层蒙版来实现:

#import <QuartzCore/QuartzCore.h>

...

CAGradientLayer *maskLayer = [CAGradientLayer layer];

maskLayer.frame = view.bounds;
maskLayer.colors = @[(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor];
maskLayer.startPoint = CGPointMake(0.5, 0);
maskLayer.endPoint = CGPointMake(0.5, 1.0);

view.layer.mask = maskLayer;

附注您还需要将QuartzCore.framework 链接到您的应用程序才能正常工作。

【讨论】:

我知道这是旧的,但是获取 cgcolor 然后将它们桥接到指针有什么关系? colors 属性表示它是一个 UIColors 数组。 abstract from docs - colors - CGColorRef 对象数组,定义每个渐变色标的颜色。为了将它们存储在 NSArray 中,我们将它们转换为 id。坦率地说,我认为我们在使用 ARC 时需要桥接转换,但是现在编译的代码很好【参考方案2】:

使用图像作为掩码来防止布局问题。

虽然弗拉基米尔的回答是正确的,但问题是在视图更改后同步渐变层。例如,当您旋转手机或调整视图大小时。因此,您可以使用图像来代替图层:

@IBDesignable
class MaskableLabel: UILabel 
    var maskImageView = UIImageView()

    @IBInspectable
    var maskImage: UIImage? 
        didSet 
            maskImageView.image = maskImage
            updateView()
        
    

    override func layoutSubviews() 
        super.layoutSubviews()
        updateView()
    

    func updateView() 
        if maskImageView.image != nil 
            maskImageView.frame = bounds
            mask = maskImageView
        
    

然后使用简单的渐变蒙版like this,您甚至可以在故事板中看到它。

注意:

您可以使用此class 并将UILabel 替换为您喜欢子类化的任何其他视图。

? 骨头:

您可以使用任何其他形状的图像作为蒙版。

【讨论】:

以上是关于UIView 上的渐变蒙版的主要内容,如果未能解决你的问题,请参考以下文章

iPhone上的UIView和UILabels上的渐变[重复]

如何在真实设备上的 iOS 10 中将渐变应用到 UIView

圆形 CAGradientLayer 蒙版

只需用矩形遮罩 UIView

使 UIView 渐变的边框颜色

是否有可能有一个可变高度的 UIView 蒙版层不拉伸,也许只是坐在顶部? (例如,“撕纸”式边缘?)