【问题标题】:GradientLayer shifted to the top left in iOS Swift AppGradientLayer 在 iOS Swift App 中移动到左上角
【发布时间】:2020-11-10 14:43:16
【问题描述】:

我使用以下代码添加了一个 GradientLayer 作为视图的背景:

import UIKit

@IBDesignable class MainView: UIView {
    override init(frame: CGRect) {
        super.init(frame: frame)
        sharedInit()
    }
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        sharedInit()
    }
    
    override func prepareForInterfaceBuilder() {
        sharedInit()
    }
    
    func sharedInit() {      
        let colorTop = UIColor.darkGray.cgColor
        let colorBottom = UIColor.lightGray.cgColor
        
        let gradientLayer = CAGradientLayer()
        gradientLayer.frame = self.frame
        gradientLayer.colors = [colorTop, colorBottom]
        self.layer.insertSublayer(gradientLayer, at: 0)
    }
}

在 Xcode Storyboard 预览中,一切看起来都如您所愿,但在模拟器中,背景移动到左上角,如下图所示。

如果有人能告诉我这里发生了什么,那就太好了。

谢谢。

【问题讨论】:

  • 与 CALayer 相同的问题和错误的大小。当sharedInit 被调用时,你还没有真正的大小。尚未应用自动布局。此外,gradientLayer.frame = self.frame 你应该始终使用self.boundsgradientLayer.frame = self.bounds
  • 谢谢,不知道大小的提示有所帮助。我在 layoutSubview 函数中移动了代码,现在它可以工作了。

标签: ios swift xcode cagradientlayer


【解决方案1】:

您应该转到“MainView”类中的“layoutSubviews”方法:-

override func layoutSubviews() {
       super.layoutSubviews()
       sharedInit()
}

另外,将“sharedInit”方法的“gradientLayer.frame = self.frame”行替换为以下代码:-

gradientLayer.frame = self.bounds

我已经检查过了,这对我有用!

【讨论】:

  • 你应该只在layoutSubviews中调整渐变层的大小,而不是调用init方法,否则你每次都会创建并添加一个新的渐变层
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 2019-01-13
  • 2011-07-16
相关资源
最近更新 更多