【问题标题】:How to switch CAGradientLayer?如何切换 CAGradientLayer?
【发布时间】:2016-05-07 05:15:36
【问题描述】:

我最初在 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 处。

还有其他方法可以改变渐变吗?

【问题讨论】:

    标签: ios swift uiview cagradientlayer


    【解决方案1】:

    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...
    

    【讨论】:

    • 我在 OP 中添加了一些示例代码。在 viewWillAppear 中使用不同颜色的条件多次添加。如果您愿意,可以添加一个计数器,您可以在不同的条件(和颜色)之间切换。
    • @4thSpace,如果我正确理解您的问题:您有渐变色,当用户转到另一个视图然后返回时,您想将渐变色更改为另一个?
    • 是的。涉及3种不同的梯度。但就像我说的,只有第一个显示。
    • @4thSpace,检查更新,如果需要进一步帮助,请告诉我。
    • 感谢您的出色示例。
    【解决方案2】:

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

    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 设置为您的视图,如果显示更新出现问题,则重新渲染自身..

    【讨论】:

    • 我不确定这有什么帮助。
    • 先生您已经表达了如何切换渐变的问题以及如何在 viewWillAppear 中执行的问题。所以现在,在你更新之后,更清楚了,你必须改变渐变,标题看不懂
    • 我仍然不知道您的代码有什么帮助。您可以在我的示例中看到,我总是在 index=0 处插入渐变。所以应该只有一个梯度。我总是覆盖。除非我误解了什么。
    • 为什么每次都插入图层?您不按照我的回答中的说明从子层中检索吗?我认为不需要重新插入刚刚添加到您的视图中的元素。我认为您必须只工作一层,并且正如解释的那样,您不会遇到更多问题。
    • 看起来我需要删除我添加的任何层,以便一次只有一个层。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多