2013-09-27 1 views
1

애니메이션이 포함 된보기의 프레임을 변경하려고합니다. 애니메이션 중에 프레임을 알고 싶습니다. 내가하는 일은 다음과 같습니다.프레임 변경시 콜백 받기

[_viewTemp addObserver:self forKeyPath:@"frame" options:0 context:NULL]; 
[UIView animateWithDuration:1.0 animations:^{ 
    CGRect frame = _viewTemp.frame; 
    frame.origin.x += 100; 
    _viewTemp.frame = frame; 
}]; 

여기 _viewTemp은 내 UIView 클래스 객체입니다. 애니메이션이 작동하는 동안 모든 프레임을 변경하고 싶습니다. Like : 현재 원본은 {10,10}입니다. 애니메이션 완료 후 {110,10}이됩니다. {11,10}, {12, 10}처럼 모든 프레임 변경에 대한 콜백을 원합니다.

이것이 가능한지 확실하지 않습니다. KVO를 사용하면 한 번만 전화를받을 수 있습니다. 하위 클래스를 만들고 처리하여도

- (void)setFrame:(CGRect)frame; 

이 예상대로 작동하지 않습니다.

가능 여부 및 어떻게 할 수 있는지 확인하고 싶습니다.

감사합니다. 사용하여

+0

어떤 용도로? –

답변

0

:

#define kRight   YES 
#define kLeft   NO; 

@interface ViewController() 
{ 
    bool _moveDirection; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    _moveDirection = kRight; 
} 

- (IBAction)actionChange:(id)sender { 

    __block NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:-1 target:self selector:@selector(handleAnimationTimer:) userInfo:nil repeats:YES]; 

    [UIView animateWithDuration:1.0 animations:^{ 

     CGRect frame = self.outletLabel.frame; 

     if(_moveDirection == kRight) { 
      _moveDirection = kLeft; 
      frame.origin.x += 100; 
     } else { 
      _moveDirection = kRight; 
      frame.origin.x -= 100; 
     } 
     self.outletLabel.frame = frame; 

    } completion:^(BOOL finished) { 

     // Remove timer 
     [timer invalidate]; 
     timer = nil; 
    }]; 

} 


-(void)handleAnimationTimer:(NSTimer *)timer{ 

    CGRect frame = self.outletLabel.frame; 
    NSLog(@"frame X %.00f", frame.origin.x); 

} 

당신은 프레임이 애니메이션 동안 하지 변화 않는 것을 볼 수 있습니다 - 그것은 단지 애니메이션의을 시작하는 로 설정합니다.

나는 당신이 타이머를 사용해야 할 것입니다 당신이 (위 그림 예약 타이머를 사용하여) 자신의 프레임 애니메이션을 롤 제안하고

handleAnimationTimer:(NSTimer *)timer 
1

각 통화 중에 프레임을 조정한다. 타이머 이벤트 핸들러에서 수행 할 작업

-(void)timerHandler:(NSTimer *)timer { 

    CGRect frame = [_tempView.layer.presentationLayer frame]; 

} 
관련 문제