2014-06-22 4 views
3

UIView를 "흔들어야"하는 경우가 많이 있습니다.UIView 흔들기 ...하지만 UIKit 역학을 사용하여

(예를 들어, 등등 ", 사용자가 잘못된 입력을 입력", "연결이 느리다" "컨트롤에 자식 사용자의 관심을 끌기"와.)

그것은 가능한 것이 UIKit 역학을 사용하여이 작업을 수행하는 ?

그래서 당신은 추가

  • 그것에게 찔러주는 봄 개념을 ..

    • 뷰를 가지고 가야 0,0

    • 에서 말하고 싶지만는 말할 "왼쪽"

    • 봄에 앞뒤로 흔들어야하므로 궁극적으로 다시 0,0

    • 01에 정착해야합니다.

    이것이 가능합니까? 애플 데모에서 예제를 찾을 수 없었다. 환호

    Niels가 아래에서 매우 자세하게 설명 했으므로 스프링이 반드시 이러한 상황 중 일부에 대해 원하는 "피직스 느낌"이 아님을주의하십시오. 다른 상황에서는 완벽 할 수 있습니다. 지금까지 내가 아는 한, 모두 iOS 자체의 앱 (예 : 메시지 등)의 물리학은 UIKit Dynamics를 사용하므로 나에게 '봄에 튀는 UIView'를 처리 할 가치가 있습니다.


    분명히 분명히 분명히 애니메이션과 함께 "비슷한"것을 할 수 있습니다. 예 ...

    하지만 이제는 iOS의 나머지 부분과 동일한 '물리적인 느낌'이 없습니다. 당신이 UIKit 역학을 사용하려면

    -(void)userInputErrorShake 
        { 
        [CATransaction begin]; 
    
        CAKeyframeAnimation * anim = 
         [CAKeyframeAnimation animationWithKeyPath:@"transform"]; 
    
        anim.values = @[ 
         [NSValue valueWithCATransform3D: 
          CATransform3DMakeTranslation(-4.0f, 0.0f, 0.0f) ], 
         [NSValue valueWithCATransform3D: 
          CATransform3DMakeTranslation(4.0f, 0.0f, 0.0f) ] 
         ]; 
    
        anim.autoreverses = YES; 
        anim.repeatCount = 1.0f; 
        anim.duration = 0.1f; 
        [CATransaction setCompletionBlock:^{}]; 
        [self.layer addAnimation:anim forKey:nil]; 
        [CATransaction commit]; 
        } 
    
  • +0

    'animateWithDuration : delay : usingSpringWithDamping'은 UIKit 다이나믹스가 아닙니다. – matt

    +0

    시도가 잘못 되었습니까? 그것은 나에게 좋아 보인다. – danh

    +0

    내 견해 중 하나를 시도해 보니 괜찮아 보이지만 어쩌면 맛의 문제 일 수 있습니다. 초기에 애니메이션을 적용해야한다고 생각한다면 왜 처음에 애니메이션을 적용하지 않을까요? 그게 왜 "우아하지 않은가"? 아니면 또 다른 맛입니까? – danh

    답변

    8

    을 수행 할 수 있습니다

    • 첫째, 관장 애니메이터 정의 :

      @property (nonatomic, strong) UIDynamicAnimator *animator; 
      

      을 그리고 인스턴스화 :

      self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view]; 
      
    • 둘째, 첨부 파일 동작 추가 현재 위치에서보기를 위해 그 애니메이터에게. 푸시가 끝나면 스프링으로 되돌아갑니다. dampingfrequency 값으로 재생해야합니다.

      UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:viewToShake attachedToAnchor:viewToShake.center]; 
      attachment.damping = 0.5; 
      attachment.frequency = 5.0; 
      [self.animator addBehavior:attachment]; 
      

      이 값은 적합하지 않지만 실험의 출발점 일 수 있습니다.

    • 푸시 동작 (UIPushBehaviorModeInstantaneous)을 적용하여 교란시킵니다. 그러면 첨부 파일 동작이 다시 발생합니다.

      UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[viewToShake] mode:UIPushBehaviorModeInstantaneous]; 
      push.pushDirection = CGVectorMake(100, 0); 
      [self.animator addBehavior:push]; 
      

    개인적으로, 나는 (감쇠 곡선이 나에게 아주 느낌이 좋지 않음)이 특정 애니메이션에 대한 미치지 않았어. 나는 한쪽 방향 (UIViewAnimationOptionCurveEaseOut)으로 움직이기 위해 블록 기반의 애니메이션을 사용하고 반대 방향으로 움직이면서 다른 방향으로 움직이면 (UIViewAnimationOptionCurveEaseInOut) usingSpringWithDamping 변환 animateWithDuration을 사용하여 움직인다. 원래 자리로 돌아갑니다. IMHO, 그것은 "잘못하면 흔들어주세요"와 같은 느낌을주는 곡선을 만듭니다.

    +0

    웅대 한, 감사합니다 @ 로브. "첫 번째 첨부 파일 동작 추가"라고하면 ... 힌트를 줄 수 있습니까? 어쨌든 사용해야 할 방법은 무엇입니까? :) – Fattie

    +0

    @JoeBlow 일부 코드 샘플을 추가했습니다. – Rob

    +0

    나는 물리학 결과를 탄력적 인 느낌으로 사용한다고 생각하는데, 나는 항상 "틀린 암호"동작을 다른 사람의 머리를 흔들어 대는 것과 같다고 생각합니다 ... 더 지속되고 고의적 인 움직임입니다. – nielsbot