iOS8:自动布局和渐变
iOS8: Auto-layout and Gradient
设置:
我有一个 View Controller
,它由一个 View
和一个 Container View
组成。
View
(橙色)是 pinned
到 top
0、left
0 和 right
0。
Container View
(灰色)是 pinned
到 bottom
0,left
0,和 right
0。
View
的Bottom Space to: Container View
= 0
View
的 Proportional 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
}
设置:
我有一个 View Controller
,它由一个 View
和一个 Container View
组成。
View
(橙色)是 pinned
到 top
0、left
0 和 right
0。
Container View
(灰色)是 pinned
到 bottom
0,left
0,和 right
0。
View
的Bottom Space to: Container View
= 0
View
的 Proportional 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
}