UIView上的渐变面具

时间:2011-09-21 21:24:09

标签: iphone cocoa-touch uikit core-animation

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

这可以用于UIView(CALayer)以影响整个UIView及其内容吗?

2 个答案:

答案 0 :(得分:32)

是的,您可以将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;

P.S。您还需要将QuartzCore.framework与您的应用相关联才能使其正常运作。

答案 1 :(得分:0)

使用图像作为遮罩,以防止出现布局问题。

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

@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,您甚至可以在情节提要中看到它。

Preview

注意:

您可以使用此class并将UILabel替换为您想继承的任何其他视图。

?骨头:

您可以使用其他形状的图像作为遮罩。