2012-12-14 2 views
4

처음으로 기본적인 Objective-C 및 iOS 개발을 배우기 때문에 나와 함께하시기 바랍니다. 나는 다른 언어의 lambdas 개념에 대해 매우 잘 알고 있지만 Objective-C 블록을 사용한 것은 이번이 처음이다.animateWithDuration은 애니메이션을 적용 할 대상을 어떻게 알 수 있습니까?

그래서 UIKit 애니메이션 자습서에 따라 배경색을 애니메이션으로 적용하여 확장한다고 생각했습니다.

- (void) setBG: (float)r g:(float)g b:(float)b duration:(float)secs 
{ 
    [UIView animateWithDuration:secs delay:0.0 options:0 
        animations:^{ 
         [self setBackgroundColor: [UIColor colorWithRed:r green:g blue:b alpha:1.0]]; 
        } 
        completion:nil]; 
} 

그래서, 변수의 애니메이션이 필요 무엇 animateWithDuration에게 어떻게 든해야 할 것으로 예상 :이 썼다. 나는 위치 (그래서 x와 y)를 움직이는 예제에서 이것을 시작했고 3 개의 변수를 움직이기 위해 약간의 변경을해야한다고 생각했다.

그러나 놀랍게도,이 "그냥 효과가 있습니다." 어쨌든 언어가 자동으로 r, gb에 애니메이션을 적용하려고한다고 판단한 것 같습니다. 컴파일러가 블록을 실제로 내관합니까? 여기서 무슨 일이 일어나고있는거야? animateWithDuration은 시간이 지남에 따라 수정할 변수를 어떻게 알 수 있습니까? 사전에

감사합니다.

답변

2

컴파일러는 그런 식으로 코드를 해석하지 않습니다. 그것은 완전히 UIView 클래스에 의해 수행됩니다.

분명히 정확한 내부 구현을 알지 못하지만 UIViewshouldAnimate 플래그를 사용하는 것이 하나의 방법 일 수 있습니다. animateWithDuration:... 클래스 메서드는 전달한 애니메이션 블록을 실행하기 전에이 플래그를 켤 수 있습니다. UIView의 애니메이션 속성의 setter 메소드는 다음 애니메이션해야하는지 여부를 결정하기 위해이 플래그를 확인할 수 있습니다

- (void)setBackgroundColor:(UIColor *)newColor { 
    if (shouldAnimate) { 
     // set up and start animation. 
    } else { 
     _backgroundColor = newColor; // just set without animating. 
    } 
    [self setNeedsDisplay]; 
} 

애니메이션 차단 실행 한 후 animateWithDuration:... 마지막으로 사용자가 설정 그렇게되면, 다시 플래그를 해제 UIView 속성이 애니메이션 블록 외부에 있으면 애니메이션이 적용되지 않습니다.

+0

흠, 블록에 NSLog 문을 추가했는데 한 번만 인쇄됩니다. 이 말은 setBackgroundColor가 한 번 호출되었지만 값을 애니메이션화하기 위해 특별히 작성된 것일 수도 있다는 것을 알 수 있습니다. animateWithDuration은 어떻게 든 배경색 애니메이터에 "지속 시간"값을 전송합니다. – Steve

0

UIView animateWithDuration은 시작 상태 (원래 값)와 종료 상태 (애니메이션 블록에서 설정 한 값) 사이에서 선형 보간법을 사용합니다. 시간이 지남에 따라 변수 값의 그래프를 상상해보십시오. 원하는 지속 시간과 두 점을 사용하여 (0 초, 시작 값)과 (지속 시간, 종료 값) 사이에 선을 만듭니다. 애니메이션이 재생되면 시간 경과에 따라 선을 따라 움직이는 점을 기준으로 값이 업데이트됩니다.

그래서 색상이 값으로 나뉘어집니다 (rgb는 논리적 추측 일 것입니다). 우리는 각 요소의 시작 값과 끝 값을 가지며 애니메이션 지속 시간을 변경합니다.

2

UIView 클래스에는 사용자가 애니메이션 블록 안에 있는지 여부와 애니메이션의 매개 변수를 추적하는 개인 변수가 있습니다.

다양한 UIView 속성의 설정자가 해당 상태를 확인합니다. setter가 애니메이션 블록 내에서 호출되는 것을 발견하면 속성의 애니메이션을 만듭니다. 애니메이션은 뷰 레이어에 첨부 된 CABasicAnimation의 인스턴스입니다.)

애니메이션화 특성은 UIView Class Reference에 나열되어

  • frame
  • bounds
  • center
  • transform
  • alpha
  • backgroundColor
  • contentStretch
관련 문제