2011-09-18 7 views
6

표시기를 빈 양식 필드에 애니메이션으로 적용하려고하므로 아래 방법을 사용하여 애니메이션을 위치에 적용하고 애니메이션을 반전하고 반복하십시오. 시뮬레이터에서는 정상적으로 작동합니다. 3GS에서는 완성 블록이 호출 될 때 플리커가 올바르게 발생하는 것처럼 보입니다. 표시기는 원래 위치에서가 아니라 중간 위치에 잠시 표시됩니다.자동 반전을 사용하여 UIView 애니메이션 깜박임

왜 이런 일이 발생했는지에 대한 의견이 있으십니까? 감사.

- (void)bounceFormIndicator { 
    if (formIndicator.superview == nil) { 
     return; 
    } 

    int bounceDistance = 24; 

    [UIView animateWithDuration:0.6 
          delay:0 
         options:UIViewAnimationOptionCurveEaseInOut | UIViewAnimationOptionAutoreverse | UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x += bounceDistance; 
         formIndicator.frame = indicatorFrame; 
        }completion:^(BOOL finished){ 
         CGRect indicatorFrame = formIndicator.frame; 
         indicatorFrame.origin.x -= bounceDistance; 
         formIndicator.frame = indicatorFrame; 
         [self bounceFormIndicator]; 
        }]; 
} 
+0

아직 해결되지는 않았지만 해결 방법을 찾았습니다. UIViewAnimationOptionRepeat 옵션을 사용하고 완료 블록을 완전히 제거합니다. – brianpartridge

답변

13

나는 동일한 문제가 있었으며, Apple DTS에서 해결 방법을 찾았습니다.

DTS에 따르면이 '깜박임'효과 또는 스냅 백 효과가 예상되는 동작입니다. 오랫동안 내 프로젝트에 문제가 있다고 생각했습니다.

은 특히 그것은이 방법 때문에

UIViewAnimationOptionAutoreverse 실행에 대한 문서 상태, 애니메이션 뒤로 전달합니다.

UIViewAnimationOptionRepeat 옵션과 함께 사용해야합니다.

깜박임을 없애기 위해 나는 2 가지를해야했습니다.

구현이 동적이어서 첫 번째 단계를 구현하지 않아도되지만 참조 용으로 여기에 설명해 두겠습니다.

첫째, 내가 UIViewAnimationOptionAutoreverse 내가 내 애니메이션으로 전달하는 거라고 옵션의 일부였다 있는지 확인하고, UIViewAnimationOptionRepeat이 아니었다 ... 그렇다면, 내가 같은 라인을 추가하여 옵션을 제거 :

animationOptions &= ~UIViewAnimationOptionAutoreverse; 

반복하지 않고 반전 애니메이션을 만들려면 완성 블록과 반대되는 UIView 애니메이션을 추가하십시오. 이 중 UIViewAnimationOptionCurveEaseIn 또는 UIViewAnimationOptionCurveEaseOut ...

있다면 나는 또한 완화를 반전 내 프로젝트에서 코드는 다음과 같습니다

객체의 animationOptions에서 autoreverse 옵션을 제거합니다 문 :

if ((animationOptions & AUTOREVERSE) == AUTOREVERSE) { 
    self.shouldAutoreverse = YES; 
    animationOptions &= ~AUTOREVERSE; 
} 

애니메이션을 처리하는 재정의 된 속성 설정 자의 예 :

-(void)setCenter:(CGPoint)center { 
    CGPoint oldCenter = CGPointMake(self.center.x, self.center.y); 

    void (^animationBlock) (void) =^{ super.center = center; }; 
    void (^completionBlock) (BOOL) = nil; 

    BOOL animationShouldNotRepeat = (self.animationOptions & REPEAT) != REPEAT; 
    if(self.shouldAutoreverse && animationShouldNotRepeat) { 
     completionBlock =^(BOOL animationIsComplete) { 
      [self autoreverseAnimation:^ { super.center = oldCenter;}]; 
     }; 
    } 
    [self animateWithBlock:animationBlock completion:completionBlock]; 
} 

완료 메소드 그는 반복없이 역전의 경우 :

-(void)autoreverseAnimation:(void (^)(void))animationBlock { 
     C4AnimationOptions autoreverseOptions = BEGINCURRENT; 
     if((self.animationOptions & LINEAR) == LINEAR) autoreverseOptions |= LINEAR; 
     else if((self.animationOptions & EASEIN) == EASEIN) autoreverseOptions |= EASEOUT; 
     else if((self.animationOptions & EASEOUT) == EASEOUT) autoreverseOptions |= EASEIN; 

     [UIView animateWithDuration:self.animationDuration 
           delay:0 
          options:autoreverseOptions 
         animations:animationBlock 
         completion:nil]; 
} 
관련 문제