【问题标题】: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() 也不起作用。肯定有办法解决这个问题吗?

【问题讨论】:

    标签: ios swift xcode cagradientlayer


    【解决方案1】:

    你可以放在这个块里面:

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
    }
    

    【讨论】:

    • 与将代码放在viewWillAppear()中相比,将代码放在这里有什么优点/缺点
    • 每次更新框架时都会调用此方法。在你的情况下没有很大的缺点。
    • @D-AUK 在渐变中添加颜色,在 viewDidLoad gradient1.colors = [UIColor.black, UIColor.blue] 中的代码可以正常工作
    【解决方案2】:

    viewDidAppear() 有效。此屏幕是根控制器 - 我不知道这是否会有所不同,但在应用渐变背景时没有明显的延迟。

    如果有人能解释一下,我会感兴趣吗?我在应用程序的另一部分有一个条形图,在 viewDidAppear() 中有完成条形图的代码,但是在填充它时会有延迟。

    【讨论】:

      【解决方案3】:

      改变viewDidLayoutSubviews里面的layer.frame属性 方法。这是为了确保子视图(playView)已经有一个合适的框架。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-27
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多