在iOS上给定任意的UIView,是否可以使用核心图形(CAGradientLayer)为其应用一个“前景透明”的渐变效果?
由于背景比UIColor更加复杂,因此无法使用标准的CAGradientLayer。同时也无法覆盖PNG图片,因为随着我的子视图在父垂直滚动视图中滚动,背景会发生变化(参见图像)。
我有一个不太优雅的后备方案:让我的UIView剪裁其子视图,并将预渲染的背景渐变png移动到父滚动视图滚动时。
在iOS上给定任意的UIView,是否可以使用核心图形(CAGradientLayer)为其应用一个“前景透明”的渐变效果?
由于背景比UIColor更加复杂,因此无法使用标准的CAGradientLayer。同时也无法覆盖PNG图片,因为随着我的子视图在父垂直滚动视图中滚动,背景会发生变化(参见图像)。
我有一个不太优雅的后备方案:让我的UIView剪裁其子视图,并将预渲染的背景渐变png移动到父滚动视图滚动时。
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
}
}
步骤二 - 在你的Storyboard中拖放一个UIView
并将其自定义类设置为GradientView
例如,这是上述渐变视图的外观:
mapView.addSubview(mapGradientView)
。 - CodetardmapView.addSubview(mapGradientView)
。本质上,如果我们在故事板中有视图,我们就不应该再次调用它。但是,如果您想在代码中执行操作,那么这将是正确的方法。 - YuchencontentView
的视图中。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.layer.content。
希望能帮到你, Joe
我不想这么说,但我认为你需要使用自定义UIView。我建议你在自定义UIView中重写drawRect方法来实现它。
这样,你就可以将该视图放置在实际滚动视图的顶部,并使你的渐变视图(如果你愿意)“传递”所有触摸事件(即放弃第一响应者)。