首页 > 解决方案 > UITextView 渐变层应用不起作用

问题描述

我想在 UITextView 的顶部 10% 和底部 10% 上应用渐变层。为此,我放置了一个名为容器视图的虚拟 UIView,并使 UITextView 成为它的子视图。然后我添加以下代码:

   if let containerView = textView.superview {
        let gradient = CAGradientLayer(layer: containerView.layer)
        gradient.frame = containerView.bounds
        gradient.colors = [UIColor.clear.cgColor, UIColor.black.cgColor]
        gradient.locations = [0.0, 0.1, 0.9, 1.0]
        containerView.layer.mask = gradient
    } 

但是渐变只应用于顶部,而不是底部。代码有问题吗?

此外,如果我随时通过修改它的约束来调整容器视图的大小,我是否需要每次都编辑遮罩层?

编辑:这是@DonMag 答案的输出。

在此处输入图像描述

但我想要的是在这张图片中,文本在底部逐渐消失。

在此处输入图像描述

编辑2:

这是DonMag修改答案后的屏幕截图。

在此处输入图像描述 在此处输入图像描述

标签: iosuikituitextviewcagradientlayer

解决方案


@DongMag 解决方案非常复杂。相反,您只需要一个实现如下的掩码:

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

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

预览

注意:您可以使用此方法并替换UILabel为您喜欢子类化的任何其他视图。

这是GitHub 上的示例项目


推荐阅读