2016-09-26 1 views
0

나는 간단한 응용 프로그램을 가지고 있습니다. 그라데이션 배경이있는 레이어 인 CALayer를 반환하는 함수가 있습니다. 잘 작동하고 적절하게 그립니다현재 CALayer를 바꾸는 방법

view.layer.insertSublayer(myGradientLayer, at: 0) 

: 버튼이이 코드를 사용하여 클릭

. 그러나 나중에 두 번째 단추를 클릭하여 색을 변경하려면 인덱스 0에서 레이어의 색을 더 이상 변경할 수 없습니다. 동일한 코드를 사용하면 아무 일도 일어나지 않습니다. 나는 무엇을 놓치고 있습니까? 그리고 예. 나는 view.setNeedsDisplay()

+1

예, 이전 레이어가 상단에 표시되기 때문에 ... 어떻게 표시합니까? 이 문제를 해결할 수있는 많은 옵션이 있습니다. CALayer를 회원으로 지정하고 색상을 지정할 수 있습니까? – ColdSteel

답변

3

The sublayers are listed in back to front order.에서 전화를 걸므로 인덱스 0에 레이어를 추가 할 때마다 이전 레이어보다 아래에있게됩니다. 첫 번째 레이어는 유일한 레이어이기 때문에 작동하지만 첫 번째 레이어 아래에있을 때 인덱스 0에 놓은 모든 레이어

0

두 답변 모두 올바른 것입니다. 매우 감사.

대답은 :

view.layer.sublayers?[0].removeFromSuperLayer() 
view.layer.insertSubLayer(MyLayer, at: 0) 
view.setNeedsDisplay() 

그래서 나는 실제로 위의 방법을 호출하기 전에 답변 중 하나가 제안처럼 init 메소드에 레이어를 추가해야합니다.

0

비슷한 기능이 필요한 경우이 질문을 검토하십시오. 내 최종 솔루션은 레이어를 만들고 여기에 태그를 할당 할 때 그런

class MyCALayer : CALayer { 
    var tag:Int? 
    override init() { 
     super.init() 
    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

CALayer을 상속하는 새로운 클래스 MyCALayer을 정의하는 것입니다. 다음 번에이를 대체해야 할 때 모든 뷰의 하위 레이어를 반복하고 이전에 추가 된 해당 레이어를 찾을 수 있습니다.

if let sublayers = view.layer.sublayers { 
     for layer in sublayers { 
      if let mylayer = layer as? MyCALayer, 
       mylayer.tag == tag { 
       mylayer.removeFromSuperlayer() 
      } 
     } 
    } 

누구나 비슷한 문제가있는 경우에 대비하여 공유하십시오.

관련 문제