iOS 시스템에서 보기 애니메이션 자세히 보기

애니메이션은 사용자 인터페이스의 상태 변환에 유창한 시각화 효과를 제공합니다. iOS에서 보기 위치, 크기 변경, 시각화 트리에서 보기 삭제, 보기 숨기기 등 애니메이션 효과를 대량으로 사용했습니다.너는 애니메이션 효과로 사용자에게 피드백을 제공하거나 재미있는 효과를 실현하는 것을 고려할 수 있다.
iOS 시스템에서 Core Animation은 내장된 애니메이션 지원을 제공합니다. 애니메이션을 만드는 데 어떤 그림 코드도 필요하지 않습니다. 당신이 해야 할 일은 지정한 애니메이션을 자극하는 것입니다. 다음은 Core Animation에 맡기고 렌더링합니다. 한 마디로 하면 복잡한 애니메이션은 몇 줄의 코드만 있으면 됩니다.

애니메이션 효과를 추가할 수 있는 속성


iOS 보기 프로그래밍 가이드에 설명된 대로 UIVIew 내장 지원은 다음 속성에 애니메이션 효과를 추가합니다.
  • Frame은 상위 뷰에 대한 뷰의 위치와 크기를 변경할 수 있습니다.(뷰가 배율, 회전, 변환 등의 변환을 거친 경우 Center 및 Bounds 속성을 수정해야 함)
  • Bounds는 뷰 크기를 변경합니다.
  • Center는 상위 뷰에 대한 뷰 위치를 변경합니다.
  • Transform은 중심점에 비해 보기 축소, 회전, 평이를 하는데 이 속성은 2차원 변환만 할 수 있습니다.(3D 변환을 수행하려면 뷰의 Layer 속성을 CoreAnimation으로 조작해야 합니다.)
  • Alpha는 뷰의 투명도를 변경합니다.
  • BackgroundColor 뷰의 배경색을 수정합니다.
  • ContentStretch는 뷰 컨텐트가 사용 가능한 공간에서 늘어나는 방식을 변경합니다.
  • 뷰의 속성 변화에 애니메이션 추가


    속성의 변화에 애니메이션 효과를 추가하기 위해서는 이 속성을 수정한 코드를 지정한 애니메이션 코드 섹션 (animation block) 에 넣어야 합니다.애니메이션 코드 세그먼트에서 애니메이션을 지원하는 속성을 수정해야만 애니메이션 효과를 추가할 수 있습니다.

    Begin/Commit 메서드를 사용하여 애니메이션 만들기


    iOS 3.0 및 이전 시스템에서 UIVIew의 클래스 방법을 사용해야 합니다. beginAnimations:context:과commitAnimations를 사용하여 애니메이션 코드 세그먼트를 정의해야 합니다. begin과commit 사이의 코드는 특수한 애니메이션 라인에서 실행되기 때문에 메인 라인을 막지 않습니다. 예를 들어 두 개의 보기를 바꾸려면 코드가 이렇게 해야 합니다.
    
    [UIView beginAnimations:@"ToggleViews" context:nil];
    [UIView setAnimationDuration:1.0];
     
    // Make the animatable changes.
    firstView.alpha = 0.0;
    secondView.alpha = 1.0;
     
    // Commit the changes and perform the animation.
    [UIView commitAnimations];
    사마린에서iOS(MonoTouch) 플랫폼에서 begin/end 방법에 대한 귀속은 다음과 같습니다.
  • public static void BeginAnimations (string animation)
  • public static void BeginAnimations (string animationID, IntPtr context)
  • public static void CommitAnimations ()
  • 위의 전환 뷰의 C# 버전 코드는 다음과 같습니다.
    
    UIView.BeginAnimations("ToggleViews");
    UIView.SetAnimationDuration(1.0)
    this.FirstView.Alpha = 0.0;
    this.SecondView.Alpha = 1.0;
    UIView.CommitAnidations();
    Begin/Commit 함수 사이에 다음 방법으로 애니메이션의 매개 변수와 옵션을 설정할 수 있습니다.
  • setAnimationStartDate:
  • setAnimationDelay:
  • setAnimationDuration:
  • setAnimationCurve:
  • setAnimationRepeatCount:
  • setAnimationRepeatAutoreverses:
  • setAnimationDelegate:
  • setAnimationWillStartSelector:
  • setAnimationDidStopSelector:
  • setAnimationBeginsFromCurrentState:
  • 주의: 오래된 장치를 지원하기 위해서가 아니라면 아래의 lambda(block based method)를 사용하여 애니메이션 효과를 실현하는 것을 추천합니다. 비록begin/commit는 사용할 수 있지만 공식적으로는 새로운 시스템에 대해 추천하지 않습니다.

    lambda (block based method) 로 애니메이션 만들기


    iOS 4.0 이후 코드 블록(code block)이라는 개념을 도입하여 코드 블록을 사용하여 애니메이션을 초기화할 수 있다. 이것도 iOS 4.0 이후 애플이 추천한 방법이다. iOS SDK가 제공하는 API는 다음과 같다.
  • animateWithDuration:animations:
  • animateWithDuration:animations:completion:
  • animateWithDuration:delay:options:animations:completion:
  • 사마린에서iOS(MonoTouch) 플랫폼에서 이러한 메서드는 다음 메서드로 바인딩됩니다.
  • public static void Animate(double duration, NSAction animation)
  • public static void Animate (double duration, NSAction animation, NSAction completion)
  • public static void Animate (double duration, double delay, UIViewAnimationOptions options, NSAction animation, NSAction completion)
  • 아니면 보기를 전환하는 애니메이션입니다. 만약objective-c의 코드 블록으로 이루어진다면 다음과 같이 해야 합니다.
    
    [UIView animateWithDuration:1.0 animations:^{
      self.firstView.alpha = 0.0;
      self.secondView.alpha = 1.0;
    }];
    C#을 사용하면 다음과 같습니다.
    
    UIView.Animate(1.0, () => {
      this.FirstView.Alpha = 0.0f;
      this.SecondView.Alpha = 1.0f;
    });
    이렇게 하면 간단한 점차적인 애니메이션을 실현하고 한 번만 실행할 수 있으며 통상적으로 수요를 만족시키지 못하고 좀 더 복잡한 것을 할 수 있다.
    
    [UIView animateWithDuration:1.0
        delay:0.0
        options:UIViewAnimationOptionCurveEaseIn
        animations:^{
          self.firstView.alpha = 0.0;
        }
        completion:^(BOOL finished){
          [UIView animateWithDuration:1.0
              delay:1.0
              options:UIViewAnimationOptionCurveEaseOut animations:^{
                self.firstView.alpha = 1.0;
              }
              completion:nil];
    }];
    해당하는 C# 코드는 다음과 같습니다.
    
    UIView.Animate(
      1.0,
      0.0,
      UIViewAnimationOptions.CurveEaseIn,
      () => this.FirstView.Alpha = 0.0f,
      () => {
        UIView.Animate(
          1.0,
          1.0,
          UIViewAnimationOptions.CurveEaseOut,
          () => this.FirstView.Alpha = 1.0f,
          null
        );
      }
    );

    내포된 애니메이션


    iOS는 중첩된 애니메이션을 지원합니다. 즉, 한 애니메이션 코드 세그먼트에서 다른 애니메이션 코드 세그먼트를 다시 시작할 수 있습니다. 현재 애니메이션이 완성될 때까지 기다리지 않고 중첩된 애니메이션이 동시에 실행됩니다. 기본적으로 원래 애니메이션의 지연, 시간 길이, 가속 곡선 등을 계승하지만 이 옵션도 무시할 수 있습니다.예:
    
    [UIView animateWithDuration:1.0
      delay:1.0
      options:UIViewAnimationOptionCurveEaseOut animations:^{
        self.firstView.alpha = 0.0f;
        //  
        [UIView animateWithDuration:1.0
          delay:0.0
          options:UIViewAnimationOptionOverrideInheritedCurve |
            UIViewAnimationOptionCurveLinear |
            UIViewAnimationOptionOverrideInheritedDuration |
            UIViewAnimationOptionRepeat |
            UIViewAnimationOptionAutoreverse
          animations:^{
            [UIView setAnimationRepeatCount:2.5];
            self.secondView.alpha = 0.0f;
          }
          completion:nil];
      }
      completion:nil
    ];
    해당하는 C# 코드는 다음과 같습니다.
    
    UIView.Animate(
      1.0,
      1.0,
      UIViewAnimationOptions.CurveEaseIn,
      () => {
        this.FirstView.Alpha = 0.0;
        UIView.Animate(
          1.0,
          1.0,
          UIViewAnimationOptions.OverrideInheritedCurve |
          UIViewAnimationOptions.CurveLinear |
          UIViewAnimationOptions.OverrideInheritedDuration |
          UIViewAnimationOptions.Repeat |
          UIViewAnimationOptions.Autoreverse,
          () => {
            UIView.SetAnimationRepeatCount(2.f);
            this.SecondView.Alpha = 0.0;
          },
          null
        );
      },
      null
    );
    Begin/Commit 메서드를 사용하는 애니메이션의 경우 네스트 호출 Begin/Commit 메서드를 사용하여 네스트된 애니메이션을 구현할 수도 있습니다. 예를 들어
    
    UIView.BeginAnimations("Animation1");
    // Animation code goes here
      // Start another animation
      UIView.BeginAnimations("Nested animation");
      // nested animations code goes here.
      UIView.CommitAnimations();
    // other code
    UIView.CommitAnimations();
    이 C# 코드에 대응하는 ObjC 코드는 간단해서 쓰지 않겠습니다.

    애니메이션의 자동 회전을 실현하다


    지정된 횟수를 자동으로 뒤집는 애니메이션을 만들 때 반복 횟수를 비정규 수치로 설정하는 것을 고려합니다.자동으로 뒤집히는 애니메이션의 경우 매번 순환은 원본 값에서 목표 값으로 바뀌고 원본 값으로 바뀌기 때문에 애니메이션이 끝난 후에 목표 값에 머무르려면 반복 횟수 설정을 0.5로 해야 한다. 그렇지 않으면 애니메이션이 천천히 원본 값으로 바뀌고 목표 값으로 빠르게 바뀌기 때문에 원래 기대했던 애니메이션 효과가 아닐 수 있다.

    뷰 전환 애니메이션 만들기


    보기 전환 애니메이션은 시각화 트리를 수정할 때 발생하는 인터페이스의 돌연변이를 줄일 수 있다. iOS 시스템에서 보기 전환 애니메이션을 대량으로 사용했다. 보기 전환 애니메이션은 주로 다음과 같은 두 가지 장면이 있다.
  • 하위 뷰 수정
  • 하위 뷰 대체
  • 주의: 보기 전환과 보기 컨트롤러의 전환을 혼동하지 마십시오(모드 대화상자 보이기, 보기 컨트롤러를 내비게이션 창고에 밀어넣기 등). 보기 전환은 보기의 가시화 트리일 뿐, 보기 컨트롤러는 변하지 않습니다. 더 많은 정보는 iOS 보기 컨트롤러 프로그래밍 안내서를 참고할 수 있습니다.

    하위 뷰 수정


    하위 뷰의 가시성을 수정하여 현재 뷰의 다른 상태를 나타낼 수 있습니다. 아래 두 뷰 전환의 예를 보면 iOS 4.0 이전에 보기 전환 애니메이션을 Begin/Commit 애니메이션에 추가해야 합니다. 코드는 다음과 같습니다.
    iOS 4.0 이후에transitionWithView:duration:options:animations:completion:
    
    [UIView beginAnimations:@"toggleView" context:nil];
    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
    [UIView setAnimationDuration:1.0];
    // animation goes here
    self.currentView.hidden = YES;
    self.swapView.hidden = NO;
    [UIView commitAnimations];
    여기에는 애니메이션 부분의 코드만 있습니다. 애니메이션이 완성된 후에 setAnimationDelegate: 방법을 참고하여 UIAnimationDelegate를 설정하고 실현하십시오.

    하위 뷰 대체


    하위 보기를 대체하려면transitionFromView:toView:duration:options:completion: 방법을 사용해야 합니다. 예시 코드는 다음과 같습니다.
    
    UIView *fromView = (self.displayPrimary ? self.view : self.secondView);
    UIView *toView = (self.displayPrimary ? self.secondView : self.view);
    UIViewAnimationOptions option = (self.displayPrimary ? UIViewAnimationOptionTransitionFlipFromRight
                    : UIViewAnimationOptionTransitionFlipFromLeft);
    [UIView transitionFromView:fromView toView:toView duration:1.0 options:option
      completion:^(BOOL finished) {
        if (finished) {
        self.displayPrimary = !self.displayPrimary;
        }
      }
    ];

    여러 애니메이션 링크


    위의 지식이 있으면 여러 애니메이션을 연결하는 것은 매우 간단하다.
  • lambda 또는block-based 방법의 애니메이션에 대해complete 리셋 함수를 사용하면 된다.
  • Begin/Commit 방법의 애니메이션은 UIAnimationDelegate를 실현하고 setAnimationDelegate 방법으로 Delegate를 설정하면 된다.
  • 이상은 iOS 시스템의 보기 애니메이션에 대한 상세한 내용입니다. iOS 보기 애니메이션에 대한 더 많은 자료는 저희 다른 관련 글을 참고하세요!

    좋은 웹페이지 즐겨찾기