CALayer
iOS 앱에서 드래그하려고합니다 .
위치 속성을 변경하자마자 새 위치로 애니메이션을 시도하고 모든 곳에서 깜박입니다.
layer.position = CGPointMake(x, y)
어떻게 CALayers
즉시 이동할 수 있습니까? Core Animation API에 대해 머리를 이해할 수없는 것 같습니다.
답변:
다음에서 통화를 래핑하려고합니다.
[CATransaction begin];
[CATransaction setValue: (id) kCFBooleanTrue forKey: kCATransactionDisableActions];
layer.position = CGPointMake(x, y);
[CATransaction commit];
[UIView performWithoutAnimation:<#^(void)actionsWithoutAnimation#>];
Swift 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
필요하지 않은 것을 허용하고 명확하게하기 위해 블록에 속성 을 추가하는 것이 유용합니다.
편의 기능을 사용할 수도 있습니다.
[CATransaction setDisableActions:YES]
게다가.
참고 : 발생할 수있는 문제를 이해하려면 Yogev Shelly의 의견을 읽어보십시오.
다른 사람들이 제안했듯이 CATransaction
.
CALayer의 기본 암시 적 애니메이션 기간이 0.25 초이기 때문에 문제가 발생합니다.
따라서 (내 의견으로는) 의 값과 함께 setDisableActions
사용 하는 것이 더 쉽습니다 .setAnimationDuration
0.0
[CATransaction begin];
[CATransaction setAnimationDuration:0.0];
layer.position = CGPointMake(x, y);
[CATransaction commit];
여기 Swift 4에 대한 이전 답변을 결합하여 애니메이션 기간을 명확하게 명시합니다.
extension CALayer
{
class func perform(withDuration duration: Double, actions: () -> Void) {
CATransaction.begin()
CATransaction.setAnimationDuration(duration)
actions()
CATransaction.commit()
}
}
용법...
CALayer.perform(withDuration: 0.0) {
aLayer.frame = aFrame
}