UIView和屏幕旋转的对角渐变背景

时间:2019-04-06 21:09:09

标签: ios swift uiview gradient

我正在尝试将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) ,但这并没有解决。关于如何完成此操作的任何建议?

3 个答案:

答案 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