我正在尝试将渐变应用于限制在主屏幕的顶部、左侧和右侧的视图,但由于某种原因,渐变没有覆盖所应用视图的整个宽度(请参见中的黄色)图片)。
class ViewController: UIViewController {
@IBOutlet weak var myView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let gradient = CAGradientLayer()
gradient.colors = [UIColor.blue.cgColor, UIColor.white.cgColor]
gradient.startPoint = CGPoint(x:00, y:00)
gradient.endPoint = CGPoint(x:0, y:0.6)
gradient.frame = myView.bounds
myView.clipsToBounds = true
myView.layer.insertSublayer(gradient, at: 0)
}
}
我究竟做错了什么?
问题很可能是您在中添加渐变层viewDidLoad()
。直到之后视图才会设置为最终尺寸viewDidLoad()
.
您的视图控制器可能在 XIB/Storyboard 中设置为与运行它的屏幕尺寸不同的屏幕尺寸。 (假设您将其设置为 iPhone SE 尺寸,但您在 6 上运行它。6 的屏幕稍宽,因此当首次加载视图时,图层将设置为 iPhone SE 的宽度。然后视图的大小将被调整,但图层的大小永远不会调整。)
您应该实现 UIViewController 方法viewDidLayoutSubviews()
,并在该方法中调整图层的框架:
override func viewDidLayoutSubviews() {
gradientLayer.frame = self.view.bounds
}
这样,如果视图大小发生调整(例如,由于自动旋转),渐变层将自动相应调整。
EDIT:
正如 Sulthan 所指出的,对图层框架的更改默认是动画的。您可能应该将框架更改包装在CATransaction.begin
/CATransaction.end
并禁用操作,如下所示:
override func viewDidLayoutSubviews() {
CATransaction.begin()
CATransaction.setDisableActions(true)
gradientLayer.frame = self.view.bounds
CATransaction.commit()
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)