您在viewDidLoad
打電話給drawGradient
。這太早了。您需要等到自動佈局確定了框架的大小。 將viewDidLoad
中的呼叫轉移到viewDidLayoutSubviews
的覆蓋。要小心,因爲viewDidLayoutSubviews
被稱爲不止一次,因此請確保您只呼叫drawGradient
一次。您可以將屬性添加到您的viewController,名爲var appliedGradient = false
,然後在應用漸變並將其翻轉到true
之前檢查它。
對於UITableViewCell
和UICollectionViewCell
您的自定義子類,覆蓋layoutSubviews
和super.layoutSubviews()
後打電話drawGradient
。再次確保您只調用一次。
注:如果frame
可以調整(由於手機的旋轉)或不同的小區大小,你應該保持以前的梯度層的跟蹤和替換它用新的viewDidLayoutSubviews
您的viewController並在layoutSubviews
爲您的單元格。
在這裏,我修改了您的drawGradient
以創建一個名爲applyGradient
的全局函數,該函數爲視圖添加了漸變。它取代了,如果有一個以前的梯度層:
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)
}
}
當你調用'drawGradient',你必須確保觀點有正確的幀。 –
是的,我得到的,但我需要調用這裏面單元格的設置等,我不得不強制我的看法佈局,但它使我的應用程序崩潰在iOS 9.x – JuicyFruit
你在哪裏調用'drawGradient'? – vacawama