2012-03-04 9 views
0

私はUIViewControllerを持っています。UIViewアニメーションが奇妙な動作をします。

ビューには、サブビューとしてUITableViewが含まれています。 viewDidAppearで、UIViewControllerはUITableViewの - (void)flashScrollIndicatorsを呼び出します。

UIViewControllerは、通知「SomethingHappened」も監視します。これが起こると、UIViewControllerは、別の小さなサブビュー(ラベルが「何か起こった」という30pxの半透明バー)をそのビューに追加します。一方、UITableViewのcontentInsetは一番上に30pxに設定され、contentOffsetは-30pxに設定されます。

これはUIViewアニメーションで起こります。これは、後で半透明バーの背後にあるコンテンツをスクロールする機能を失うことなく、ビューをバーに押し込んでテーブルビューのコンテンツを少し下に移動します。

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addMessageView:) name:@"SomethingHappened" object:nil]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated];  
    [self.tableView flashScrollIndicators]; 
} 

- (void)addMessageView { 

    self.statusMessageView = [[FFStatusMessageView alloc] initWithFrame:CGRectMake(0, -kMessageViewHeight, self.view.frame.size.width, kMessageViewHeight)]; 
    self.statusMessageView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 


    void (^animations)(void) = ^{ 
     [self.view addSubview:self.statusMessageView]; 
     self.statusMessageView.frame = CGRectMake(0, 0, self.view.frame.size.width, kMessageViewHeight); 
     self.tableView.contentInset = UIEdgeInsetsMake(kMessageViewHeight, 0,0,0); 
     if (self.tableView.contentOffset.y == 0) self.tableView.contentOffset = CGPointMake(0, -kMessageViewHeight); 
    }; 

    [UIView animateWithDuration:0.4 animations:animations]; 
} 

結果は非常によく見えます。ここに問題があります:「SomethingHappened」は、通常、テーブルビューがスクロールインジケータを点滅させるのとほぼ同時にポストされ/観察されます。これにより、スクロールインジケータのフラッシュが実際には奇妙な動作をします。コンテンツが左端からスライドし、コンテンツの右端に表示されます。

アニメーションの1つ(インジケータの点滅またはバーの配置)を延ばす必要がありますか?秒を始めるのが安全であることを私はどのように知ることができますか?

答えて

0

私は現在回避策を使用しています。アニメーションの状態を知るために2つのBOOL ivars(_animatingTableViewと_waitingToFlashIndicators)を追加しました。

- (void)viewDidLoad 
{ 
    [super viewDidLoad];  
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(addMessageView:) name:@"SomethingHappened" object:nil]; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated];  
    if (! _animatingTableView) { 
     [self.tableView flashScrollIndicators]; 
    } else { 
     _waitingToFlashIndicators = YES; 
    } 
} 

- (void)addMessageView { 

    _animatingTableView = YES; 
    self.statusMessageView = [[FFStatusMessageView alloc] initWithFrame:CGRectMake(0, -kMessageViewHeight, self.view.frame.size.width, kMessageViewHeight)]; 
    self.statusMessageView.autoresizingMask = UIViewAutoresizingFlexibleWidth; 

    void (^animations)(void) = ^{ 
     [self.view addSubview:self.statusMessageView]; 
     self.statusMessageView.frame = CGRectMake(0, 0, self.view.frame.size.width, kMessageViewHeight); 
     self.tableView.contentInset = UIEdgeInsetsMake(kMessageViewHeight, 0,0,0); 
     if (self.tableView.contentOffset.y == 0) self.tableView.contentOffset = CGPointMake(0, -kMessageViewHeight); 
    }; 

    void (^completion)(BOOL) = ^(BOOL finished){ 
     _animatingTableView = NO; 
     if (_waitingToFlashIndicators) { 
      [self.tableView flashScrollIndicators]; 
      _waitingToFlashIndicators = NO; 
     } 
    }; 

    [UIView animateWithDuration:0.4 animations:animations completion:completion]; 
}