UIView的透明梯度(UIView transparent gradient)

2019-06-25 02:14发布

鉴于iOS上的任意UIView的,有没有使用核芯显卡(CAGradientLayer想到)的“前景透明”梯度适用于它的方法吗?

因为背景比的UIColor更复杂,我不能用一个标准CAGradientLayer。 我还不能覆盖一个PNG因为我的子视图沿其父垂直滚动视图(见图片)滚动背景将发生变化。

我有一个不优雅的回退:有我的UIView夹及其子视图和父滚动视图滚动移动背景的预渲染梯度PNG。

Answer 1:

这是一个令人尴尬的简单的解决办法:应用CAGradientLayer我的子视图的面具。

CAGradientLayer *gradientLayer = [CAGradientLayer layer];
gradientLayer.frame = _fileTypeScrollView.bounds;
gradientLayer.colors = [NSArray arrayWithObjects:(id)[UIColor whiteColor].CGColor, (id)[UIColor clearColor].CGColor, nil];
gradientLayer.startPoint = CGPointMake(0.8f, 1.0f);
gradientLayer.endPoint = CGPointMake(1.0f, 1.0f);
_fileTypeScrollView.layer.mask = gradientLayer;

由于Cocoanetics指着我在正确的方向!



Answer 2:

这就是我要做的。

步骤1定义自定义梯度视图(SWIFT 4):

import UIKit

class GradientView: UIView {
    override open class var layerClass: AnyClass {
        return CAGradientLayer.classForCoder()
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        let gradientLayer = self.layer as! CAGradientLayer
        gradientLayer.colors = [
            UIColor.white.cgColor,
            UIColor.init(white: 1, alpha: 0).cgColor
        ]
        backgroundColor = UIColor.clear
    }
}

第2步 -拖放一个UIView在你的故事板和自定义类设置为GradientView

作为一个例子,这是在上述倾斜视图看起来像:


https://github.com/yzhong52/GradientViewDemo



Answer 3:

我只是碰到了同样的问题,结束了写我自己的类。 这似乎是严重的矫枉过正,但它是我能找到做渐变与透明度的唯一途径。 你可以看到我在这里的书面记录和代码示例

它基本上可以归结为创建两个图像一个自定义的UIView。 一个是纯色,另一个是用作图像掩模的梯度。 从那里,我申请所产生的图像到uiview.layer.content。

我希望它能帮助,乔



Answer 4:

我用上面的接受(OP的)答案,遇到同样的问题指出一个upvoted评论 -当视图滚动,即开始屏幕外一切都是透明的现在,被掩模覆盖。

解决的办法是梯度层添加为上海华的掩模,而不是滚动视图的掩模。 就我而言,我使用的是文本视图,它包含了一个名为视图中contentView

我增加了第三颜色和使用locations代替startPointendPoint ,使文本视图下方的项目仍然可见。

let gradientLayer = CAGradientLayer()
gradientLayer.frame = self.contentView!.bounds
gradientLayer.colors = [UIColor.white.cgColor, UIColor.clear.cgColor, UIColor.white.cgColor]

// choose position for gradient, aligned to bottom of text view
let bottomOffset = (self.textView!.frame.size.height + self.textView!.frame.origin.y + 5)/self.contentView!.bounds.size.height
let topOffset = bottomOffset - 0.1
let bottomCoordinate = NSNumber(value: Double(bottomOffset))
let topCoordinate = NSNumber(value: Double(topOffset))
gradientLayer.locations = [topCoordinate, bottomCoordinate, bottomCoordinate]

self.contentView!.layer.mask = gradientLayer

之前,即开始屏幕外的文字是永久可见。 随着我的修改,滚动按预期工作,而“关闭”按钮没有被掩模覆盖。



Answer 5:

我讨厌这样说,但我认为你是到自定义UIView的土地。 我认为我会尝试在自定义的UIView overiding的常规的drawRect来实现这一点。

有了这个,你可以有一个观点,地方上实际滚动视图的顶部,和你的梯度视图(如果你愿意)“传递的”所有触摸事件(即放弃第一响应者)。



文章来源: UIView transparent gradient