15

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

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

4

2 回答 2

34

是的,您可以通过设置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;

PS您还需要链接QuartzCore.framework到您的应用程序才能使事情正常进行。

于 2011-09-21T21:50:49.883 回答
0

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

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

@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
        }
    }
}

然后用这样一个简单的渐变蒙版,你甚至可以在故事板中看到它。

预览

笔记:

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

骨头:

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

于 2020-07-31T19:27:57.747 回答