2010-02-22 3 views
1

나는 오프 스크린 애니메이션을 적용한 후에 슈퍼 뷰에서 뷰를 제거하려고합니다. 그러나 애니메이션이 끝나야 할 때 removeFromSuperview 호출을 추가하면보기가 전혀 움직이지 않고 화면에서 즉시 사라집니다.
[[self pickerView] removeFromSuperview];을 아래 메소드에 추가 할 때 애니메이션이없는 이유는 무엇입니까?슈퍼 뷰에서 뷰를 제거하면 뷰가 애니메이션으로 표시되지 않습니다.

- (void) slidePickerOutView 
{ 

    [UIView beginAnimations:@"slidePickerOutView" context:nil]; 
    [UIView setAnimationDelegate:self]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [UIView setAnimationDuration:0.2]; 
    [UIView setAnimationDidStopSelector:@selector(slidePickerOutViewEnded:finished:context:)]; 

    CGRect r = CGRectMake(0, 480, 320, 244); 

    [[self pickerView] setFrame:r]; 

    [UIView commitAnimations]; 
} 

- (void) slidePickerOutViewEnded:(NSString *)id finished:(BOOL) finished context:(void *) context 
{ 
    //Stop observing the 'Done' button 
    [[self pickerView] removeObserver:self forKeyPath:@"valueSelectDone"]; 
    [[self pickerView] removeObserver:self forKeyPath:@"selectedValue"]; 

    [[self pickerView] removeFromSuperview]; 

    [self setPickerView:nil]; 
} 
+0

은 당신이 말하는 당신은 "removeFromSuperview"으로 라인을 주석 경우 그러면 애니메이션이 작동합니까? 그것은 매우 이상 할 것입니다. 시도해 보셨습니까? 더 긴 animationDuration을 설정하거나 대리자 메서드에서 "finished"값을 확인 하시겠습니까? 이들 중 어느 것도 실제로 당신이 묘사하는 문제를 야기하지는 않지만 더 많은 정보를 얻을 수 있습니다. – Felixyz

+0

실제로 'removeFromSuperview'행을 주석 처리하면 애니메이션이 제대로 작동합니다. 애니메이션이 시작되기 전에보기가보기에서 즉시 제거 된 것처럼 보입니다. 애니메이션보기 KVO, 따라서 removeObserver 라인을 통해 관찰되고 있지만, 그 라인 문제로 중요하다고 생각하지 않습니다. – Oysio

답변

0

좋아, 결국 애니메이션이 시작되지 않는 원인을 발견했습니다. pickerView가 관찰되었으며 인스턴스 변수가 값이 변경되면 부모 뷰가 알림을 받고 애니메이션을 시작하여 화면 밖에서 피커 뷰를 슬라이드합니다. 그러나 parentView는 이전 값과 새 값을 모두 관찰 했으므로 처음에는 이전 값을, 두 번째 값은 새로운 값으로 변경되었습니다. 따라서 parentView는 애니메이션을 두 번 바로 시작했는데, 애니메이션이 전혀 시작되지 않는 것 같습니다. 단지 그 관찰자마다 ValueSelectDone에 이전 값을 전송 한 firstLine의을 주석으로이 같은 고정

값을 변경했다 :

//[self willChangeValueForKey:@"valueSelectDone"]; 

valueSelectDone = flag; 

[self didChangeValueForKey:@"valueSelectDone"]; 
관련 문제