gpt4 book ai didi

ios - layoutIfNeeded 函数行为

转载 作者:可可西里 更新时间:2023-11-01 01:26:32 24 4
gpt4 key购买 nike

我正在使用此功能使用大量渐变绘图:

func drawGradient(colors: [CGColor], locations:  [NSNumber]) {
let gradientLayer = CAGradientLayer()
gradientLayer.frame.size = self.frame.size
gradientLayer.frame.origin = CGPoint(x: 0.0,y: 0.0)
gradientLayer.colors = colors
gradientLayer.locations = locations
print(self.frame.size)
self.layer.insertSublayer(gradientLayer, at: 0)
}

问题是,如果我不在 UIViewControllerviewDidLoad() 中调用 self.view.layoutIfNeeded(),我的渐变不会在 iPhone X+ 上覆盖整个屏幕。但是,如果我调用 self.view.layoutIfNeeded(),它会使我的应用程序在 iOS 9.x 上崩溃并在 iPhone 5/5s 上表现得很奇怪。我真的不知道有什么解决方法,需要帮助才能理解它是如何工作的。

最佳答案

您正在 viewDidLoad 中调用 drawGradient。那太早了。您需要等到 Auto Layout 确定框架的大小。将 viewDidLoad 中的调用移动到 viewDidLayoutSubviews 的重写。不过要小心,因为 viewDidLayoutSubviews 被调用了不止一次,所以请确保只调用一次 drawGradient。您可以向 viewController 添加一个名为 var appliedGradient = false 的属性,然后在应用渐变之前检查它并将其翻转为 true

对于 UITableViewCellUICollectionViewCell 的自定义子类,覆盖 layoutSubviews 并在 super 之后调用 drawGradient .layoutSubviews()。同样,确保只调用一次。


注意:如果您的框架可以调整大小(由于手机的旋转)或不同的单元格大小,您应该跟踪之前的渐变层并将其替换为在 viewDidLayoutSubviews 中为您的 viewController 和在 layoutSubviews 中为您的单元格添加一个新的。

在这里,我修改了您的 drawGradient 以创建一个名为 applyGradient 的全局函数,用于向 View 添加渐变。如果有的话,它会替换之前的渐变层:

func applyGradient(colors: [CGColor], locations: [NSNumber], to view: UIView, replacing prior: CALayer?) -> CALayer {
let gradientLayer = CAGradientLayer()
gradientLayer.frame.size = view.frame.size
gradientLayer.frame.origin = CGPoint(x: 0.0,y: 0.0)
gradientLayer.colors = colors
gradientLayer.locations = locations
print(view.frame.size)
if let prior = prior {
view.layer.replaceSublayer(prior, with: gradientLayer)
} else {
view.layer.insertSublayer(gradientLayer, at: 0)
}
return gradientLayer
}

它是这样使用的:

class ViewController: UIViewController {
// property to keep track of the gradient layer
var gradient: CALayer?

override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
gradient = applyGradient(colors: [UIColor.red.cgColor, UIColor.yellow.cgColor],
locations: [0.0, 1.0], to: self.view, replacing: gradient)
}
}

关于ios - layoutIfNeeded 函数行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41332022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com