渐变层不在正确的位置
Posted
技术标签:
【中文标题】渐变层不在正确的位置【英文标题】:Gradient layer not in the right place 【发布时间】:2019-04-25 19:07:20 【问题描述】:我有如下代码:
playView.layer.cornerRadius = 16
let gradient1 = CAGradientLayer()
gradient1.frame = playView.frame
gradient1.cornerRadius = 16
if #available(ios 10.0, *)
// set P3 colour
else
// set sRGB colour
gradient1.startPoint = CGPoint(x: 0, y: 0)
gradient1.endPoint = CGPoint(x: 1, y: 1)
playView.layer.insertSublayer(gradient1, at: 0)
在上面代码块的第 3 行,我将渐变的框架设置为我希望它填充的框架。
当我在不同的设备上运行应用程序时,如果正在运行应用程序的设备是在 Interface Builder 中选择的设备,则渐变层只会填充正确的区域。
我目前有viewDidLoad()中的代码,所以可以通过将代码移到viewDidAppear()来解决问题,但是当应用程序加载时,渐变出现之前会有一点延迟,没有给出流畅的外观和感觉。
是否有另一种方法可以将代码放入其中,以便渐变显示在正确的位置,同时在用户看到屏幕时立即出现?或者,一种使渐变填充视图的方法,同时仍将代码保留在 viewDidLoad() 中?
编辑:viewWillAppear() 不起作用,viewWillLayoutSubviews() 也不起作用。肯定有办法解决这个问题吗?
【问题讨论】:
【参考方案1】:你可以放在这个块里面:
override func viewWillLayoutSubviews()
super.viewWillLayoutSubviews()
【讨论】:
与将代码放在viewWillAppear()中相比,将代码放在这里有什么优点/缺点 每次更新框架时都会调用此方法。在你的情况下没有很大的缺点。 @D-AUK 在渐变中添加颜色,在 viewDidLoad gradient1.colors = [UIColor.black, UIColor.blue] 中的代码可以正常工作【参考方案2】:viewDidAppear() 有效。此屏幕是根控制器 - 我不知道这是否会有所不同,但在应用渐变背景时没有明显的延迟。
如果有人能解释一下,我会感兴趣吗?我在应用程序的另一部分有一个条形图,在 viewDidAppear() 中有完成条形图的代码,但是在填充它时会有延迟。
【讨论】:
【参考方案3】:改变viewDidLayoutSubviews
里面的layer.frame属性
方法。这是为了确保子视图(playView)已经有一个合适的框架。
【讨论】:
以上是关于渐变层不在正确的位置的主要内容,如果未能解决你的问题,请参考以下文章