首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Swift:不能改变数组中的CALayer背景色

Swift:不能改变数组中的CALayer背景色
EN

Stack Overflow用户
提问于 2016-11-28 19:02:23
回答 1查看 1.2K关注 0票数 1

我只是试图更改CALayer数组最后一个元素的背景色。下面是我的整个View,但是它只有2-3行,我实际上尝试访问CALayer的最后一个元素。

这是我的progressViewClass,我给出了我的问题所在:

代码语言:javascript
复制
class ProgressBarView: UIView {

//Variables for progress bar
var holdGesture = UILongPressGestureRecognizer()
let animation = CABasicAnimation(keyPath: "bounds.size.width")
var layerHolder = [CALayer]()
var widthIndex = CGPoint(x: 0, y: 0)
var nextXOffset = CGFloat(0.0)
var checkIfFull = CGFloat()
var newLayer : CALayer?
var progressBarAnimationDuration : CFTimeInterval = (MainController.sharedInstance.totalMiliSeconsToRecord  / 10)

// Only override draw() if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
override func draw(_ rect: CGRect) {

}

func startProgressBar(){

    if(RecordingViewController().currentCameraMode == .recordingMode || RecordingViewController().currentCameraMode == .record1stClipMode) {

        newLayer = CALayer()
        newLayer?.frame = CGRect(x: nextXOffset, y: 0, width: 0, height: self.bounds.height)
        newLayer?.backgroundColor = UIColor(red:0.82, green:0.01, blue:0.11, alpha:1.0).cgColor

        //print("before \(nextXOffset)")
        newLayer?.anchorPoint = widthIndex
        animation.fromValue = 0
        animation.toValue = self.bounds.width  - nextXOffset
        animation.duration = progressBarAnimationDuration - ((MainController.sharedInstance.miliSecondsPassed) / 10)
        self.layer.addSublayer(newLayer!)

        //print("Long Press Began")
        newLayer?.add(animation, forKey: "bounds.size.width")

    }
    else{
        stopProgressBar()
    }
}

func stopProgressBar(){
    if(RecordingViewController().currentCameraMode != .recordingMode){

            pauseLayer(layer: newLayer!)

            newLayer?.frame = (newLayer?.presentation()!.frame)!
            nextXOffset = (newLayer?.frame.maxX)!
            layerHolder.append(newLayer!)
            print("Layerholder has elements : \(layerHolder.count)")
    }
}

// HERE IS MY PROBLEM
func highlightLastLayer(){
    print("in highlight last layer Layerholder has elements : \(layerHolder.count)")

    // I CAN HIDE THE CALAYER SO I BELIEVE IM ACCESSING THE CORRECT LAYER
    // layerHolder.last?.isHidden = true

    // This is suppose to change the last element background color to blue but doesnt
    layerHolder.last?.backgroundColor = UIColor.blue.cgColor
}

// ALSO MY PROBLEM
func unhighlightLastLayer(){
    print("inside unhighlight last layer")

    // I CAN HIDE THE CALAYER SO I BELIEVE IM ACCESSING THE CORRECT LAYER
    //layerHolder.last?.isHidden = false

    // Changes CALayer back to red
    layerHolder.last?.backgroundColor = UIColor(red:0.82, green:0.01, blue:0.11, alpha:1.0).cgColor
}

//Function to pause the Progress Bar
func pauseLayer(layer : CALayer){
    let pausedTime : CFTimeInterval = layer.convertTime(CACurrentMediaTime(), from: nil)
    layer.speed = 0.0
    layer.timeOffset = pausedTime

}



}

简单地说,我在我的progressView中创建了一个viewController对象,然后根据特定的按钮输入调用这些函数。这个视图本质上是一个进度条,您可以在许多视频记录应用程序中看到它,以显示您记录了多少。在highlightLastLayer中,我试图获取"layerHolder“数组的最后一个元素,并将其颜色更改为蓝色。很简单对吧?不起作用。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-18 17:30:26

你在哪里叫高亮和非高亮。我非常肯定,当您被“停止”或“暂停”时,您会这样做,因为这是您唯一一次向layerHolder数组添加任何内容。只有当你没有动画的时候,你才能做到这一点,因为当你在动画的时候,表示层是显示的,而不是“真实的”层。不要将速度设置为零,而是设置您的图层看起来像当前的动画状态和调用层。removeAllAnimations来关闭表示层,而不是显示视图的实际层。现在你可以做所有你想要的改变,它们实际上会出现。

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

https://stackoverflow.com/questions/40851591

复制
相关文章

相似问题

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