2017-08-31 42 views
0

有沒有人遇到同樣的問題,在調用動畫中的layoutIfNeeded時會凍結UI?在動畫中調用layoutIfNeeded塊會凍結iPhone 7上的UI

我有一個方法:

- (void)hide { 
dispatch_block_t onMain = ^{ 
    CGFloat height = -viewContent.frame.size.height; 

    [UIView animateKeyframesWithDuration:0.15f delay:0 options:0 animations:^{ 
     [UIView addKeyframeWithRelativeStartTime:0.f relativeDuration:0.7f animations:^{ 
      self.constraintViewContentBottom.constant = height/3; 
      [self layoutIfNeeded]; 
     }]; 
     [UIView addKeyframeWithRelativeStartTime:0.7f relativeDuration:0.3f animations:^{ 
      self.constraintViewContentBottom.constant = height; 
      [self layoutIfNeeded]; 
     }]; 
    } completion:^(BOOL finished) { 
     [UIView animateWithDuration:0.2f animations:^{ 
      self.viewBackground.alpha = 0.0f; 
     } 
         completion:^(BOOL finished) { 
          self.hidden = YES; 
         }]; 
    }]; 
}; 
if([NSThread isMainThread]) { 
    onMain(); 
} 
else { 
    dispatch_sync(dispatch_get_main_queue(), onMain); 
} 
} 

其中的許多設備完美的作品,但在一個iPhone 7行:[self layoutIfNeeded];凍結UI。

我無法調試該設備,但可以從中獲取一些日誌。

有誰知道我們如何解決這個問題?

感謝任何幫助。

回答

0

設置約束條件的常量之前動畫塊。 layoutIfNeeded是唯一必須加入塊...

+0

那麼,基本上如果我們從[UIView animateWithDuration:0.2f動畫:^ {}]調用它;方法 - 你是對的。但我已經嘗試過不同的變體 - 之前,內心的結果是一樣的。 =( – Andrei

+1

你必須使用'dispatch_sync'? –

+0

不要使用dispatch_sync! –