2017-10-29 9 views
0

私のTableViewCellにラベルがあります。 DispatchQueueを使用してセルをデキューすると、セル内のラベルが縮小されます。それどころか、単にデキューすると、ラベルは通常に変わります。 これにはどのような原因が考えられますか?DispatchQueueでUITableViewCellの文字が縮む

DispatchQueue 前enter image description here

DispatchQueue 後enter image description here

コード:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 

    let post = posts[indexPath.row] 
    if let cell = tableView.dequeueReusableCell(withIdentifier: "FeedCell") as? FeedCell { 
     DispatchQueue.main.async { 
      cell.configureCell(post: post) 
     } 
     return cell 
    } else { 
     return FeedCell() 
    } 
} 

コードFeedCellでラベルレイアウトのため(のUITableViewCell):

override func layoutSubviews() { 
    super.layoutSubviews() 

    contentView.layoutIfNeeded() 
    self.caption.sizeToFit() 
} 

contentViewは、ラベルが置かれているUIViewです。

+1

を削除する方が簡単であることを保証するだろうか?そのコードは既にメインキューで実行されています。あなたの質問への答えは、すでにテーブルビューにセルを返した後に設定が行われるため、空のキャプションに合わせてサイズがすでに設定されているからです。 – Paulw11

+0

はい。 UI更新をメインキューで実行する必要がありますが、UI要素によって呼び出されるこのようなメソッドはすでにメインキューにあります – Paulw11

答えて

1

メインキューには常にcellForRowAt:が呼び出されるため、その機能をメインキューにディスパッチする必要はありません。

あなたが非同期的にあなたのconfigureCellコールを派遣しているので、あなたはself.caption.sizeToFit()空のキャプションのために呼び出される原因となる、cellForRowAt:から未設定のセルを返し終わる(またはセルがその後に再利用されている場合、それはどんなキャプションための大きされるだろうが、以前にいましたそのセルオブジェクト内に)。

あなたはconfigureCellは、セル再レイアウトをトリガしていますが、メインキューにcomfigurationを派遣しているのはなぜそれだけで不要DispatchQueue.main.async

関連する問題