iOS 앱에서 CALayer를 드래그하려고합니다.어떻게 CALayer를 즉시 움직입니까 (애니메이션 제외)
는 즉시 나는 그것이 사방에 새로운 위치로 애니메이션을 시도하면서 깜빡 위치 속성을 변경 같이
layer.position = CGPointMake(x, y)
어떻게 즉시 CALayers를 이동할 수 있습니다? Core Animation API에 대해 머리를 맞출 수없는 것 같습니다.
iOS 앱에서 CALayer를 드래그하려고합니다.어떻게 CALayer를 즉시 움직입니까 (애니메이션 제외)
는 즉시 나는 그것이 사방에 새로운 위치로 애니메이션을 시도하면서 깜빡 위치 속성을 변경 같이
layer.position = CGPointMake(x, y)
어떻게 즉시 CALayers를 이동할 수 있습니다? Core Animation API에 대해 머리를 맞출 수없는 것 같습니다.
는 다음에 전화를 포장하려면 : 당신은 또한뿐만 아니라 편의 기능
[CATransaction setDisableActions:YES]
을 사용할 수 있습니다
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
.
참고 : 발생할 수있는 문제를 이해하려면 Yogev Shelly의 의견을 읽으십시오.
중요 :이 작업은 모든 CALayer에 영향을 주므로 작업을 완료 한 후에 작업을 다시 활성화하려는 것입니다. [CATransaction setDisableActions : YES] –
젠장, 그렇게 말 했어야합니다. 좋은 결과. 이 명령은 애니메이션이 NO로 설정되거나 핵심 그래픽 애니메이션 엔진이 실행주기를 완료 할 때까지 애니메이션을 비활성화합니다. 그게 맞는 단어인지 잘 모르겠다. : /하지만 모두를 위해 그것을 정리해 주셔서 감사합니다. – Biclops
다른 사람들이 제안했듯이 CATransaction
을 사용할 수 있습니다.
CALayer의 기본 암시 적 애니메이션 지속 시간이 0.25 초이므로 문제가 발생합니다.
따라서 setDisableActions
대신에 setAnimationDuration
을 사용하는 것이 더 편리 할 것입니다. 제 생각에는 0.0
입니다.
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
기억하기 쉽고, 코드를 다시 읽고 쉽게 입력 할 때 이해하기 쉽습니다. 감사! –
스위프트 3 확장 :
extension CALayer {
class func performWithoutAnimation(_ actionsWithoutAnimation:() -> Void){
CATransaction.begin()
CATransaction.setValue(true, forKey: kCATransactionDisableActions)
actionsWithoutAnimation()
CATransaction.commit()
}
}
사용법 : 정확히이다
CALayer.performWithoutAnimation(){
someLayer.position = newPosition
}
'@noescape' 속성을 블록에 추가하면 블록에'self'가 필요 없다는 것을 허용 (그리고 명확하게)하는 것이 유용합니다 – Andrew
. 나는 CATransaction에 대해서 생각조차하지 않았다. 고마워요! – Mel
2 년 후, 감사, 롤. – nacho4d
5 년 후 감사합니다. – MichaelScaria