鉴于iOS上的任意UIView的,有没有使用核芯显卡(CAGradientLayer想到)的“前景透明”梯度适用于它的方法吗?
因为背景比的UIColor更复杂,我不能用一个标准CAGradientLayer。 我还不能覆盖一个PNG因为我的子视图沿其父垂直滚动视图(见图片)滚动背景将发生变化。
我有一个不优雅的回退:有我的UIView夹及其子视图和父滚动视图滚动移动背景的预渲染梯度PNG。
鉴于iOS上的任意UIView的,有没有使用核芯显卡(CAGradientLayer想到)的“前景透明”梯度适用于它的方法吗?
因为背景比的UIColor更复杂,我不能用一个标准CAGradientLayer。 我还不能覆盖一个PNG因为我的子视图沿其父垂直滚动视图(见图片)滚动背景将发生变化。
我有一个不优雅的回退:有我的UIView夹及其子视图和父滚动视图滚动移动背景的预渲染梯度PNG。
这是一个令人尴尬的简单的解决办法:应用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指着我在正确的方向!
这就是我要做的。
步骤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
我只是碰到了同样的问题,结束了写我自己的类。 这似乎是严重的矫枉过正,但它是我能找到做渐变与透明度的唯一途径。 你可以看到我在这里的书面记录和代码示例
它基本上可以归结为创建两个图像一个自定义的UIView。 一个是纯色,另一个是用作图像掩模的梯度。 从那里,我申请所产生的图像到uiview.layer.content。
我希望它能帮助,乔
我用上面的接受(OP的)答案,遇到同样的问题指出一个upvoted评论 -当视图滚动,即开始屏幕外一切都是透明的现在,被掩模覆盖。
解决的办法是梯度层添加为上海华的掩模,而不是滚动视图的掩模。 就我而言,我使用的是文本视图,它包含了一个名为视图中contentView
。
我增加了第三颜色和使用locations
代替startPoint
和endPoint
,使文本视图下方的项目仍然可见。
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
之前,即开始屏幕外的文字是永久可见。 随着我的修改,滚动按预期工作,而“关闭”按钮没有被掩模覆盖。
我讨厌这样说,但我认为你是到自定义UIView的土地。 我认为我会尝试在自定义的UIView overiding的常规的drawRect来实现这一点。
有了这个,你可以有一个观点,地方上实际滚动视图的顶部,和你的梯度视图(如果你愿意)“传递的”所有触摸事件(即放弃第一响应者)。