2017-04-21 10 views
0

私はUITableViewを持っていて、その中に項目として複数のUIStackViewがあります。それらの中でUIStackView私は色付けされた四角をサブビューとして追加します。問題は、垂直方向のスクロールを著しく遅くすることです。複数のスタックビューがあるテーブルのスクロール速度を向上させる方法はありますか?

スクロールのパフォーマンスを改善するにはどうすればよいですか?ここで

はスクロールがどのように見えるかです: https://gfycat.com/DentalContentIndigowingedparrot

ここでは、ソースコードである: https://github.com/Cook10/StackTableProblem

+1

なぜこれを行うにはコレクションビューを使用できないのかと尋ねるのは公正でしょうか? – NRitH

+0

このコードは、スクロールのパフォーマンスが低いことを示すために行われているためです。私の実際のプロジェクトでは、セルに項目が増えているので、UITableViewを使用する必要があります。 –

答えて

2

あなたは再利用する細胞のポイントを逃しています。あなたのコード:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! MyTableViewCell 

    addStacksToTableCell(cell.stack1) 
    addStacksToTableCell(cell.stack2) 
    addStacksToTableCell(cell.stack3) 
    addStacksToTableCell(cell.stack4) 

    return cell 
} 

あなたはスクロールダウン毎回、新たなセルを使用して、その中にすべてのビュー(400ビュー)を削除すると、あなたは、新しいビュー(400ビュー)を作成している、高価なレイアウトをトリガーと仕組みを再レンダリング、表示されています。

あなたのスクロールのたびに発生します。

これは、細胞を再利用する目的を完全に無効にします。これは、毎回新しいセルを作成するのと同じです。

代わりに、ビューを1回作成してください。セルを再利用する場合は、内部ビューの色のみを更新してください。色を変更するだけでは、ビューを再作成しないでください。

は、あなたのセルに追加します:いくつかの非常に単純な変更を使用して

それは、この特定のケースに接続され、100%ではありません

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell 

    if !cell.createdViews { 
     cell.views1 = addStacksToTableCell(cell.stack1) 
     cell.views2 = addStacksToTableCell(cell.stack2) 
     cell.views3 = addStacksToTableCell(cell.stack3) 
     cell.views4 = addStacksToTableCell(cell.stack4) 

     cell.createdViews = true 
    } else { 
     // only update the views 
     cell.views1.forEach { $0.backgroundColor = UIColor.random() } 
     cell.views2.forEach { $0.backgroundColor = UIColor.random() } 
     cell.views3.forEach { $0.backgroundColor = UIColor.random() } 
     cell.views4.forEach { $0.backgroundColor = UIColor.random() } 
    } 

    return cell 
} 

func addStacksToTableCell(_ stack: UIStackView) -> [UIView] { 

    stack.removeAllArrangedSubviews() 

    var views: [UIView] = [] 

    for i in 0..<ITEMS{ 
     let image = UIImageView() 
     image.backgroundColor = UIColor.random() 
     stack.addArrangedSubview(image) 

     let width = NSLayoutConstraint(item: image, attribute: .width, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50) 
     let height = NSLayoutConstraint(item: image, attribute: .height, relatedBy: .equal, toItem: nil, attribute: .notAnAttribute, multiplier: 1, constant: 50) 

     image.addConstraints([width,height]) 

     views.append(image) 
    } 

    return views 
} 
+0

どのように細胞を再利用するのですか? –

+0

@TheCookサンプル実装を追加しました。 – Sulthan

0

、:

var createdViews: Bool = false 
var views1: [UIView] = [] 
var views2: [UIView] = [] 
var views3: [UIView] = [] 
var views4: [UIView] = [] 

はその後で、あなたのコントローラメソッドを置き換えますセルのスクロールを改善する別の方法は次のとおりです。

iOSでは、yo自動レイアウトを使用してテーブルビューセルの高さを定義できます。ただし、この機能はデフォルトで有効になっていません。

通常、セルの高さは、テーブルビューデリゲートのtableView:heightForRowAtIndexPath:メソッドによって決定されます。セルフサイジングテーブルビューセルを有効にするには、テーブルビューのrowHeightプロパティをUITableViewAutomaticDimensionに設定する必要があります。また、estimatedRowHeightプロパティに値を割り当てる必要があります。これらのプロパティが両方設定されると、システムは自動レイアウトを使用して行の実際の高さを計算します。

tableView.estimatedRowHeight = 85.0 
tableView.rowHeight = UITableViewAutomaticDimension 

次に、セルのコンテンツビュー内にテーブルビューセルのコンテンツをレイアウトします。セルの高さを定義するには、コンテンツビューの上端と下端の間の領域を塗りつぶすために、拘束のない連鎖とビュー(定義された高さを持つ)が必要です。ビューに本質的なコンテンツの高さがある場合、システムはこれらの値を使用します。そうでない場合は、ビューまたはコンテンツビュー自体に適切な高さの制約を追加する必要があります。

さらに、推定された行の高さをできるだけ正確にするようにしてください。これらの見積もりに基づいてスクロールバーの高さなどの項目が計算されます。見積もりがより正確になればなるほど、ユーザーエクスペリエンスはよりシームレスになります。

あなたに最高のお祈りをしてください。

関連する問題