如何切换CAGradientLayer?
How to switch CAGradientLayer?
我最初在 viewDidLoad 中的第一个场景中创建了一个 CAGradientLayer
。它是这样插入的:
self.view.layer.insertSublayer(myCAGradientLayer, atIndex: 0)
效果很好。但现在我需要在应用程序 运行 时更改渐变。用户将在场景 2 上做一些事情,然后回到场景 1,其中渐变发生变化。我建立了一个新的 CAGradientLayer
并添加到与上面相同的视图中。
但是使用 viewWillAppear 不起作用。
这是一个例子:
let gLocations: [Float] = [0.0, 1.0]
let gLayer: CAGradientLayer = CAGradientLayer()
gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
gLayer.frame = self.view.bounds
gLayer.locations = gLocations
self.view.layer.insertSublayer(gLayer, atIndex: 0)
将以上内容添加到 viewWillAppear。然后使用不同的颜色将其添加到几个条件中。只有第一个条件选择出现。其他条件中的任何其他颜色都不会出现。
我认为部分问题在于我一直在做:
self.view.layer.insertSublayer(gLayer, atIndex: 0)
否则,渐变将出现在其他 UI 组件之上。我正在使用几种不同的渐变,它们都使用上面的代码。但我猜它们都不能插入到 index=0.
还有其他方法可以改变渐变吗?
ViewWillAppear
函数应该可以工作。每次视图即将激活时都会调用它。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated);
}
更新
第一个仅显示,因为您的 CAGradientLayer
颜色始终设置为 gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
.
每当您想更改颜色时,都需要将其保存在内存中,以便您再次进入视图时知道这一点。这是替代解决方案。
创建一个 NSUserDefault
以保存您要显示的颜色。
// Set - set a new color whenever you want this to be displayed when you show the view next time
// forKey is the unique value to access the object you have saved
NSUserDefaults.standardUserDefaults().setObject("red", forKey: "color"
显示视图时,请执行以下操作:
// Get
let color = NSUserDefaults.standardUserDefaults().stringForKey("color")
if color == "red"{
gLayer.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor]
}
else if...
您可以从子层搜索您的层:
myCAGradientLayer.name = "my gradient layer"
...
extension UIView {
func getMyGradient(name:String) -> CAGradientLayer {
if let layers = self.layer.sublayers {
for layer in layers {
if (layer.name == name) {
let caGradientLayer = layer as! CAGradientLayer
return caGradientLayer
}
}
}
print("Sorry your gradient doesnt exist in this view..")
return CAGradientLayer()
}
}
检索渐变:
let myCAGradientLayer = self.view.getMyGradient()
if myCAGradientLayer.name == "my gradient layer" {
// do whatever you want with the same first gradient added
}
尝试使 setNeedsDisplay
成为您的视图,如果显示更新出现问题,则重新呈现自身..
我最初在 viewDidLoad 中的第一个场景中创建了一个 CAGradientLayer
。它是这样插入的:
self.view.layer.insertSublayer(myCAGradientLayer, atIndex: 0)
效果很好。但现在我需要在应用程序 运行 时更改渐变。用户将在场景 2 上做一些事情,然后回到场景 1,其中渐变发生变化。我建立了一个新的 CAGradientLayer
并添加到与上面相同的视图中。
但是使用 viewWillAppear 不起作用。
这是一个例子:
let gLocations: [Float] = [0.0, 1.0]
let gLayer: CAGradientLayer = CAGradientLayer()
gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
gLayer.frame = self.view.bounds
gLayer.locations = gLocations
self.view.layer.insertSublayer(gLayer, atIndex: 0)
将以上内容添加到 viewWillAppear。然后使用不同的颜色将其添加到几个条件中。只有第一个条件选择出现。其他条件中的任何其他颜色都不会出现。
我认为部分问题在于我一直在做:
self.view.layer.insertSublayer(gLayer, atIndex: 0)
否则,渐变将出现在其他 UI 组件之上。我正在使用几种不同的渐变,它们都使用上面的代码。但我猜它们都不能插入到 index=0.
还有其他方法可以改变渐变吗?
ViewWillAppear
函数应该可以工作。每次视图即将激活时都会调用它。
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated);
}
更新
第一个仅显示,因为您的 CAGradientLayer
颜色始终设置为 gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]
.
每当您想更改颜色时,都需要将其保存在内存中,以便您再次进入视图时知道这一点。这是替代解决方案。
创建一个 NSUserDefault
以保存您要显示的颜色。
// Set - set a new color whenever you want this to be displayed when you show the view next time
// forKey is the unique value to access the object you have saved
NSUserDefaults.standardUserDefaults().setObject("red", forKey: "color"
显示视图时,请执行以下操作:
// Get
let color = NSUserDefaults.standardUserDefaults().stringForKey("color")
if color == "red"{
gLayer.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor]
}
else if...
您可以从子层搜索您的层:
myCAGradientLayer.name = "my gradient layer"
...
extension UIView {
func getMyGradient(name:String) -> CAGradientLayer {
if let layers = self.layer.sublayers {
for layer in layers {
if (layer.name == name) {
let caGradientLayer = layer as! CAGradientLayer
return caGradientLayer
}
}
}
print("Sorry your gradient doesnt exist in this view..")
return CAGradientLayer()
}
}
检索渐变:
let myCAGradientLayer = self.view.getMyGradient()
if myCAGradientLayer.name == "my gradient layer" {
// do whatever you want with the same first gradient added
}
尝试使 setNeedsDisplay
成为您的视图,如果显示更新出现问题,则重新呈现自身..