iOS8:自动布局和渐变

iOS8: Auto-layout and Gradient

设置:

我有一个 View Controller,它由一个 View 和一个 Container View 组成。

View(橙色)是 pinnedtop 0、left 0 和 right 0。

Container View(灰色)是 pinnedbottom 0,left 0,和 right 0。

ViewBottom Space to: Container View = 0

ViewProportional Height to Container 视图 = 1

期望的结果: 我想为 View(橙色)

的背景添加渐变

尝试过:

我正在使用 class 大小的自动布局来在不同的屏幕上获得不同的行为。

代码:

class ViewController: UIViewController {

    @IBOutlet weak var graphView: UIView!
    @IBOutlet weak var containerView: UIView!
    override func viewDidLoad() {
        super.viewDidLoad()

        let backgroundColor = CAGradientLayer().graphViewBackgroundColor()
        backgroundColor.frame = self.graphView.frame

        self.graphView.layer.addSublayer(backgroundColor)
}

我有一个类别:

extension CAGradientLayer {

    func graphViewBackgroundColor() -> CAGradientLayer {

        let topColor = UIColor(red: (160/255.0), green: (160/255.0), blue: (160/255.0), alpha: 1)
        let bottomColor = UIColor(red: (52/255.0), green: (53/255.0), blue: (52/255.0), alpha: 1)

        let gradientColors: [CGColor] = [topColor.CGColor, bottomColor.CGColor]
        let gradientLocations: [Float] = [0.0, 1.0]

        let gradientLayer: CAGradientLayer = CAGradientLayer()
        gradientLayer.colors = gradientColors
        gradientLayer.locations = gradientLocations

        return gradientLayer
    }
}

结果:

如您所见,渐变并未覆盖整个 View

问题:如何让渐变覆盖整个View

更新:

当我将代码放在 viewDidLayoutSubviews() 中时,旋转时看起来很奇怪:

尝试将渐变代码放入 viewDidLayoutSubviews 而不是 viewDidLoad

当调用 viewDidLoad 时,视图没有布局(即还没有设置它们的最终帧),所以这就是为什么您只看到渐变的部分覆盖

只需在 viewDidLayoutSubviews 中执行此操作即可:

override func viewDidLayoutSubview() {
  super.viewDidLayoutSubviews
  backgroundColor.frame = self.graphView.bounds
}

viewDidLayoutSubviews 应在您旋转设备时调用。

如果没有被调用,重写这个方法并按如下方式执行,

override func viewWillTransitionToSize(size: CGSize, withTransitionCoordinator coordinator: UIViewControllerTransitionCoordinator) {
  super.viewWillTransitionToSize(size, withTransitionCoordinator: coordinator)

  backgroundColor.frame = self.graphView.bounds
}