2017-12-29 16 views
1

사용자가 이동할 수 있도록하려는이 아이콘이 있으며 부모보기의 특정 영역에 들어가면 크기를 표시해야합니다.스케일링 변환 적용시 흔들림 애니메이션

let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
var scaleTransformation: CGAffineTransform = CGAffineTransform(scaleX: 1, y: 1) 

if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
} 

let transformation = scaleTransformation.concatenating(moveTransformation) 

: 그리고

let translationPoint = sender.translation(in: view) 

그럼 내가 다음 코드 CGAffineTranformations으로 원하는 동작을 애니메이션을 시도 : 나는 사용자가 팬 제스처 인식기와 명령을 사용하여 아이콘을 이동하고 싶은 위치를 검색 아이콘보기에서 변환을 적용합니다. 이 동작을 트리거해야하는 영역으로 들어갔다 나오면 조금 움직이는 것을 제외하고는 꽤 잘 작동합니다.

저는 일반적으로 두 가지 변형을 적용하는 것이 좋지 않다는 것을 온라인에서 읽었습니다. 아마 뷰 자체의 실제 프레임을 업데이트해야하지만 변형 애니메이션을 적용하면 위치를 쉽게 재설정 할 수 있다고 생각했습니다. 사용자가 갈 때 (나는 또한 그것을하기 위하여 경량이기 위하여 의미되었다는 것을 들었다).

남녀 모두에게 어떤 제안이 있습니까? 당신의 도움이

UPDATE 주셔서 감사합니다

내 애니메이션 코드 :

DispatchQueue.main.async { 
    UIView.animate(withDuration: 0.15) { 
     self.iconView.transform = transformation 
    } 
} 

답변

0

둥지 부모보기에서 아이콘보기. 상위 뷰에 위치 변환을 적용하고 하위 뷰에 스케일을 적용합니다.

이렇게하면 변환을 별도로 유지하고 결과를보다 쉽게 ​​예측할 수 있습니다.

+0

이것은 효과가있는 것 같습니다. 고마워요 :) –

1

여러 변형을 적용해도 문제가 없습니다. 귀하의 코드 (애니메이션 블록 또는 응답에 대한 네트워크 호출)을 보지 않고 나는 두 가지 추측을 할 것입니다

1) 귀하의 UIView 애니메이션 블록이 없습니다.

let translationPoint = sender.translation(in: view) 
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
    var scaleTransformation: CGAffineTransform = .identity 

    if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
    } 

    let transformation = scaleTransformation.concatenating(moveTransformation) 
    DispatchQueue.main.async { 
     UIView.animate(withDuration: 0.2) { 
      iconView.transform = scaleTransformation 
     } 
    } 

2) 위의 문제로 인해 네트워크 호출에서 백그라운드 스레드의 UI를 변경하려고하는 경우가 많습니다. 이것은 지연과 갑작스러운 것을 만들 수 있으며 위의 애니메이션과 같은 주 스레드 호출에 래핑되어야합니다.

let translationPoint = sender.translation(in: view) 
    let moveTransformation = CGAffineTransform(translationX: response.translationPoint.x, y: response.translationPoint.y) 
    var scaleTransformation: CGAffineTransform = .identity 

    if response.shouldScaleUp { 
     scaleTransformation = CGAffineTransform(scaleX: 1.3, y: 1.3) 
    } 

    let transformation = scaleTransformation.concatenating(moveTransformation) 
    DispatchQueue.main.async { 
     iconView.transform = scaleTransformation 
    } 
+0

나는 그것을 움직이지 않으려 고 노력하고 그것은 (그래서 두 번째 솔루션) 작동합니다. 아이콘이 지금은 증가 된 크기로 점프하기 때문에 이상적이지 않습니다. –

+0

첫 번째 예제에서 애니메이션을 단축 할 수 있습니다. GCD 발송물에 포장되었는지 확인하십시오. – agibson007

+0

초기 변환 스케일을 0으로 설정하고 식별을 위해 다시 축소 할 수는 있지만 사용자가 어떤 것인지 알 수 없습니다. – agibson007

관련 문제