【问题标题】:Diagonal Gradient background on UIView and Screen Rotation [duplicate]UIView和屏幕旋转上的对角渐变背景[重复]
【发布时间】:2019-04-06 21:09:08
【问题描述】:

我正在尝试将UIView 的背景设置为渐变。我的UIViewControllerviewDidLoad 方法中有以下内容:

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)

渐变按预期呈现。但是,当我旋转设备时,渐变不会重绘并且不再正确渲染。从纵向->横向旋转会在右侧或左侧留下空白部分。从横向->纵向旋转使我在底部有一个空白部分。我尝试将此代码移动到viewDidLayoutSubviews,但这并没有解决它。关于如何实现这一点的任何建议?

【问题讨论】:

  • 您的主要问题是您在视图底部添加了多个渐变层,但只有顶部的一个可见。您需要确保只添加一个渐变层并在 viewDidLayoutSubviews 方法 gradientLayer.frame = view.bounds 中调整其框架

标签: ios swift uiview gradient


【解决方案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)
}

}

【讨论】:

    【解决方案2】:

    制作 gradientLayer 视图控制器的属性。

    let gradientLayer = CAGradientLayer()
    

    以与您相同的方式在 viewDidLoad 中添加 gradientLayer。

    在 viewWillLayoutSubviews 中设置框架

    override func viewWillLayoutSubviews() {
        super.viewWillLayoutSubviews()
        gradientLayer.frame = self.view.bounds
    }
    

    【讨论】:

    • 不。试过了。重绘也有同样的问题。
    【解决方案3】:

    虽然您可以按照其他答案的建议进行操作并在viewDidLayoutSubviews 中更新您的渐变层边界,但更可重用的方法是创建一个渐变视图子类,其layerClassCAGradientLayer。这样的视图将自动调整其图层大小以适应视图(因为渐变层现在是视图的支持层,而不是某个子图层),您可以在任何地方使用此视图,只需在 nib 文件中更改视图的类或故事板:

    class GradientView: UIView {
        var colors: [UIColor] = [.red, .white] {
            didSet {
                setup()
            }
        }
        var locations: [CGFloat] = [0,1] {
            didSet {
                setup()
            }
        }
        var startPoint: CGPoint = .zero  {
            didSet {
                setup()
            }
        }
        var endPoint: CGPoint = CGPoint(x: 1, y: 1) {
            didSet {
                setup()
            }
        }
    
        override class var layerClass : AnyClass { return CAGradientLayer.self }
    
        required init?(coder aDecoder: NSCoder) {
            super.init(coder: aDecoder)
            setup()
        }
        override func awakeFromNib() {
            super.awakeFromNib()
            setup()
        }
        private func setup() {
            guard let layer = self.layer as? CAGradientLayer else {
                return
            }
            layer.colors = colors.map { $0.cgColor }
            layer.locations = locations.map { NSNumber(value: Double($0)) }
            layer.startPoint = startPoint
            layer.endPoint = endPoint
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-02
      • 2015-04-23
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多