我正在尝试将UIView
的背景设置为渐变。我的UIViewController
的{{1}}方法中有以下内容:
viewDidLoad
渐变将按预期方式呈现。但是,当我旋转设备时,渐变不会重绘并且不再正确渲染。从“纵向”->“横向”旋转时,左侧或右侧留有空白部分。从landscape-> portrait旋转时,在底部留有空白部分。我尝试将这段代码移至let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.blue70.cgColor, UIColor.blue60.cgColor, UIColor.blue70.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 1 )
gradientLayer.frame = self.view.bounds
self.view.layer.insertSublayer(gradientLayer, at: 0)
,但这并没有解决。关于如何完成此操作的任何建议?
答案 0 :(得分:1)
我在这里建议在viewWillLayoutSubviews()方法中添加渐变
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
self.view.addGradiant()
}
但是现在我们必须在添加新框架和新框架时删除旧图层(以防手机旋转)
然后我们可以先删除该图层,然后像此扩展方法一样添加新图层
extension UIView {
func addGradiant() {
let GradientLayerName = "gradientLayer"
if let oldlayer = self.layer.sublayers?.filter({$0.name == GradientLayerName}).first {
oldlayer.removeFromSuperlayer()
}
let gradientLayer = CAGradientLayer()
gradientLayer.colors = [UIColor.blue.cgColor, UIColor.red.cgColor, UIColor.green.cgColor]
gradientLayer.startPoint = CGPoint(x: 0, y: 0)
gradientLayer.endPoint = CGPoint(x: 1, y: 1 )
gradientLayer.frame = self.bounds
gradientLayer.name = GradientLayerName
self.layer.insertSublayer(gradientLayer, at: 0)
}
}
答案 1 :(得分:0)
设置gradientLayer视图控制器的属性。
let gradientLayer = CAGradientLayer()
以与您相同的方式在viewDidLoad中添加gradientLayer。
在viewWillLayoutSubviews中设置框架
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
gradientLayer.frame = self.view.bounds
}
答案 2 :(得分:0)
虽然您可以按照其他答案的建议进行操作,并更新viewDidLayoutSubviews
中的渐变层边界,但更可重用的方法是将layerClass
是{{1 }}。这样的视图将自动调整其大小以适合该视图(因为渐变层现在是该视图的支持层,而不是某些subLayer),并且您可以在任何地方使用此视图,只需在nib文件中更改视图的类即可或情节提要:
CAGradientLayer