首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何切换CAGradientLayer?

如何切换CAGradientLayer?
EN

Stack Overflow用户
提问于 2016-05-07 05:15:36
回答 2查看 708关注 0票数 1

我最初在viewDidLoad的第一幕上创建了一个viewDidLoad。它是这样插入的:

代码语言:javascript
复制
self.view.layer.insertSublayer(myCAGradientLayer, atIndex: 0)

效果很好。但现在,我需要改变梯度,而应用程序运行。用户将在场景2上做一些事情,然后回到场景1,其中梯度变化。我构建了一个新的CAGradientLayer,并向视图添加了与上面相同的内容。

但是使用viewWillAppear不起作用。

下面是一个示例:

代码语言:javascript
复制
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中。然后使用不同的颜色将其添加到几个条件项中。只会出现第一个选择的条件。其他条件词中的任何其他颜色都不会出现。

我认为问题的一部分是我一直在做:

代码语言:javascript
复制
self.view.layer.insertSublayer(gLayer, atIndex: 0)

否则,梯度将出现在其他UI组件之上。我使用了几个不同的梯度,它们都使用上面的代码。但我猜它们都不能在index=0上插入。

还有其他方法来改变梯度吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-05-07 05:46:00

ViewWillAppear函数应该可以工作。每次视图即将激活时,都会调用它。

代码语言:javascript
复制
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated);
}

更新

第一个只会显示,因为您的CAGradientLayer颜色总是设置为gLayer.colors = [UIColor.yellowColor().CGColor, UIColor.greenColor().CGColor]

每当您想要更改颜色时,都需要将其保存在内存中,以便在再次输入视图时知道这一点。这是另一种解决办法。

创建一个NSUserDefault以保存要显示的颜色。

代码语言:javascript
复制
// 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"

当您显示视图时,请执行以下操作:

代码语言:javascript
复制
// Get
let color = NSUserDefaults.standardUserDefaults().stringForKey("color")

if color == "red"{
   gLayer.colors = [UIColor.redColor().CGColor, UIColor.blueColor().CGColor]
}
else if...
票数 1
EN

Stack Overflow用户

发布于 2016-05-07 06:35:55

您可以从子层搜索您的层:

代码语言:javascript
复制
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()
    }
}

要检索您的梯度:

代码语言:javascript
复制
let myCAGradientLayer = self.view.getMyGradient()
if myCAGradientLayer.name == "my gradient layer" {
   // do whatever you want with the same first gradient added 
}

尝试使setNeedsDisplay到您的视图,如果在显示更新方面有问题,可以重新呈现自己。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37084768

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档