CALayer配列の最後の要素の背景色を変更しようとしています。ここに私のViewクラス全体がありますが、CALayerの最後の要素に実際にアクセスしようとするのはわずか2-3行です。ここでSwift:CALAYの変更CALayerの背景色が配列
は私progressViewClassであり、私は私の問題がどこにあるかを正確にコメントを入れて:
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
}
}
単に私がのViewControllerにprogressViewオブジェクトを作成し、特定のボタン入力に基づいて、これらの関数を呼び出す、置きます。このビューは、本質的に、多くのビデオ録画アプリケーションで録画した量を示すプログレスバーです。 highlightLastLayerでは、 "layerHolder"配列の最後の要素をつかみ、その色を青に変更しようとしています。単純な権利ですか?動作しません。何か案は?
「highlightLastLayer'と 'unhighlightLastLayer'はいつ呼びますか?あなたは本当にメインスレッドでそれをやっていますか?あなたがカスタム描画をしていない場合、 'drawRect'をオーバーライドしないように注意してください。 Appleは、ビュークラスを作成するときにコメントで警告することさえできます。 –
@MihaiFratu私は1000%ですhighlightLastLayerとunhighlightLastLayerを呼び出すのは、関数内に入れたプリントメッセージのためです。私はdrawRectをオーバーライドする何も書かなかったので、それはうまくいくはずです。あなたが見ることができる何かが、なぜこれがうまくいかないかを説明していますか?上のコードをすべて別のファイルにコピーし、ビューコントローラーでインスタンス化して、意味を確認することもできます。 – OriginalAlchemist
上記のコードでは、2つのメソッドを呼び出す場所がありません。私はあなたが 'print'メッセージを見ていることを理解していますが、間違った時間に間違ったスレッドでやっているかもしれません。 'drawRect'について:それに何も書き込まないことは、パフォーマンスが賢明で、実際に何かをやっています。私はそれがあなたの問題と関係があると言っているわけではありません。私はちょうどあなたにアドバイスをしています:あなたがカスタム図面を作ろうとしないなら空のオーバーライドを削除してください。 –