2012-03-04 3 views
0

У меня есть UIViewController.анимация UIView делает flashscrollindicators вели себя странно

Его представление содержит UITableView в качестве подзаголовка. В viewDidAppear UIViewController вызывает UITableView - (void) flashScrollIndicators.

UIViewController также наблюдает уведомление «SomethingHappened». Когда это происходит, UIViewController добавляет еще одно небольшое подвью (30-кратное полупрозрачное полотно с надписью «что-то случилось»). Между тем для содержимогоInset UITableView установлено значение 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» обычно публикуется/наблюдается примерно одновременно с тем, что tableview мигает своими индикаторами прокрутки. Это заставляет индикатор прокрутки вести себя очень странно - он скользит слева и над всем содержимым, прежде чем он приземляется на правый край, где он должен быть.

Должен ли я отложить одну из анимаций (индикация вспышки или размещение бара)? Как я могу узнать, безопасно ли начинать секунды?

ответ

0

Я использую обходной путь сейчас. Я добавил два BOUL 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]; 
}