2012-03-04 25 views
0

我有一個UIViewController。UIView動畫使flashscrollindicators行爲怪異

它的視圖包含一個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]; 
} 

結果看起來非常好。這裏是問題:通常在桌面視圖閃爍滾動指示符的同時發佈/觀察「發生的事情」。這使得滾動指示器的閃爍行爲非常奇怪 - 從左側滑入並覆蓋整個內容,然後落到應該出現的右側邊緣上。

我是否應該延遲其中一個動畫(指示燈閃爍或條形放置)?我怎麼知道開始第二秒鐘是否安全?

回答

0

我現在在使用解決方法。我添加了兩個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]; 
}