2008-10-22 4 views
58

iOS 앱에서 CALayer를 드래그하려고합니다.어떻게 CALayer를 즉시 움직입니까 (애니메이션 제외)

는 즉시 나는 그것이 사방에 새로운 위치로 애니메이션을 시도하면서 깜빡 위치 속성을 변경 같이

layer.position = CGPointMake(x, y) 

어떻게 즉시 CALayers를 이동할 수 있습니다? Core Animation API에 대해 머리를 맞출 수없는 것 같습니다.

답변

131

는 다음에 전화를 포장하려면 : 당신은 또한뿐만 아니라 편의 기능

[CATransaction setDisableActions:YES] 

을 사용할 수 있습니다

[CATransaction begin]; 
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+1

. 나는 CATransaction에 대해서 생각조차하지 않았다. 고마워요! – Mel

+3

2 년 후, 감사, 롤. – nacho4d

+3

5 년 후 감사합니다. – MichaelScaria

17

.

참고 : 발생할 수있는 문제를 이해하려면 Yogev Shelly의 의견을 읽으십시오.

+4

중요 :이 작업은 모든 CALayer에 영향을 주므로 작업을 완료 한 후에 작업을 다시 활성화하려는 것입니다. [CATransaction setDisableActions : YES] –

+0

젠장, 그렇게 말 했어야합니다. 좋은 결과. 이 명령은 애니메이션이 NO로 설정되거나 핵심 그래픽 애니메이션 엔진이 실행주기를 완료 할 때까지 애니메이션을 비활성화합니다. 그게 맞는 단어인지 잘 모르겠다. : /하지만 모두를 위해 그것을 정리해 주셔서 감사합니다. – Biclops

12

다른 사람들이 제안했듯이 CATransaction을 사용할 수 있습니다.
CALayer의 기본 암시 적 애니메이션 지속 시간이 0.25 초이므로 문제가 발생합니다.

따라서 setDisableActions 대신에 setAnimationDuration을 사용하는 것이 더 편리 할 것입니다. 제 생각에는 0.0입니다.

[CATransaction begin]; 
[CATransaction setAnimationDuration:0.0]; 
layer.position = CGPointMake(x, y); 
[CATransaction commit]; 
+0

기억하기 쉽고, 코드를 다시 읽고 쉽게 입력 할 때 이해하기 쉽습니다. 감사! –

10

스위프트 3 확장 :

extension CALayer { 
    class func performWithoutAnimation(_ actionsWithoutAnimation:() -> Void){ 
     CATransaction.begin() 
     CATransaction.setValue(true, forKey: kCATransactionDisableActions) 
     actionsWithoutAnimation() 
     CATransaction.commit() 
    } 
} 

사용법 : 정확히이다

CALayer.performWithoutAnimation(){ 
    someLayer.position = newPosition 
} 
+0

'@noescape' 속성을 블록에 추가하면 블록에'self'가 필요 없다는 것을 허용 (그리고 명확하게)하는 것이 유용합니다 – Andrew

관련 문제