Swift:旋转时渐变分裂
Swift: Gradient splits on rotation
简而言之,我有一个混合了深蓝色和黑色的渐变。渐变看起来很漂亮,但是当我旋转屏幕并将其置于横向时,两种颜色分开,屏幕的一半是蓝色背景,另一半是黑色。发现我没有做对,我从这两个来源复制了代码:
YouTube 视频 https://www.youtube.com/watch?v=pabNgxzEaRk
网站http://blog.apoorvmote.com/gradient-background-uiview-ios-swift/
这是我的代码:
let topColor = UIColor(red: 28/255.0, green: 25/255.0, blue: 127/255.0, alpha: 1)
let bottomColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 25/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
gradientLayer.frame = self.view.bounds
self.view.layer.insertSublayer(gradientLayer, atIndex: 0)
有人可以指出正确的方向来阻止我的渐变一分为二吗?
请记住,当更改屏幕方向时,所有视图的边界也会发生变化(假设您使用的是自动布局),但同样的事情不会应用于以编程方式添加的图层。因此,在您的情况下,渐变层仍然具有根据旋转前的旧视图边界设置的框架。为了解决这个问题,我建议子类化你的渐变视图并在 layoutSubviews
函数中更新渐变层框架,该函数在每次视图边界更改时调用。
class GradientView: UIView {
let gradientLayer = CAGradientLayer()
override func awakeFromNib() {
gradientLayer.frame = self.bounds
gradientLayer.colors = yourColors
gradientLayer.locations = yourLocations
self.layer.addSublayer(gradientLayer)
}
override func layoutSubviews() {
gradientLayer.frame = self.bounds
}
}
您只需重写 layoutSubview 方法即可根据您设备的视图自动调整渐变视图的大小
只写,
override func viewDidLayoutSubviews() {
gradientLayer.frame = self.view.bounds
}
我试过了,效果很好。希望对你有帮助。
简而言之,我有一个混合了深蓝色和黑色的渐变。渐变看起来很漂亮,但是当我旋转屏幕并将其置于横向时,两种颜色分开,屏幕的一半是蓝色背景,另一半是黑色。发现我没有做对,我从这两个来源复制了代码:
YouTube 视频 https://www.youtube.com/watch?v=pabNgxzEaRk
网站http://blog.apoorvmote.com/gradient-background-uiview-ios-swift/
这是我的代码:
let topColor = UIColor(red: 28/255.0, green: 25/255.0, blue: 127/255.0, alpha: 1)
let bottomColor = UIColor(red: 0/255.0, green: 0/255.0, blue: 25/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
gradientLayer.frame = self.view.bounds
self.view.layer.insertSublayer(gradientLayer, atIndex: 0)
有人可以指出正确的方向来阻止我的渐变一分为二吗?
请记住,当更改屏幕方向时,所有视图的边界也会发生变化(假设您使用的是自动布局),但同样的事情不会应用于以编程方式添加的图层。因此,在您的情况下,渐变层仍然具有根据旋转前的旧视图边界设置的框架。为了解决这个问题,我建议子类化你的渐变视图并在 layoutSubviews
函数中更新渐变层框架,该函数在每次视图边界更改时调用。
class GradientView: UIView {
let gradientLayer = CAGradientLayer()
override func awakeFromNib() {
gradientLayer.frame = self.bounds
gradientLayer.colors = yourColors
gradientLayer.locations = yourLocations
self.layer.addSublayer(gradientLayer)
}
override func layoutSubviews() {
gradientLayer.frame = self.bounds
}
}
您只需重写 layoutSubview 方法即可根据您设备的视图自动调整渐变视图的大小
只写,
override func viewDidLayoutSubviews() {
gradientLayer.frame = self.view.bounds
}
我试过了,效果很好。希望对你有帮助。