2016-01-15 14 views
12

Sto utilizzando UIStackView nel layout UILabels nella sottoclasse UICollectionViewCell. Sto utilizzando l'SDK iOS 9.2Scarse prestazioni di UIStackView in UICollectionViewCells

Lo scorrimento della vista raccolta è agevole se non aggiorno le etichette "text quando le ho eliminate. Tuttavia, se aggiorno i loro text mentre li rimuovo, lo scorrimento è molto lento.

Ho fatto una demo molto piccola per mostrare il problema, da eseguire su un dispositivo (non sul simulatore). È possibile creare un nuovo progetto vuoto e sostituire il contenuto di ViewController.swift con questo:

import UIKit 

class ViewController: UIViewController { 

    override func loadView() { 
     view = UIView() 

     let layout = UICollectionViewFlowLayout() 
     layout.itemSize = CGSize(width: 100, height: 200) 
     let collectionView = UICollectionView(frame: CGRectZero, collectionViewLayout: layout) 
     collectionView.registerClass(Cell.self, forCellWithReuseIdentifier: "Cell") 
     collectionView.translatesAutoresizingMaskIntoConstraints = false 
     collectionView.dataSource = self 
     view.addSubview(collectionView) 

     let constraints = ["H:|-[collectionView]-|", 
      "V:|[collectionView]|" 
     ].flatMap { NSLayoutConstraint.constraintsWithVisualFormat($0, options: [], metrics: nil, views: ["collectionView": collectionView]) 
     } 
     NSLayoutConstraint.activateConstraints(constraints) 

    } 
} 

extension ViewController: UICollectionViewDataSource { 
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier("Cell", forIndexPath: indexPath) as! Cell 

     //comment out the line below to make the scrolling smoother: 
     cell.fillLabels() 

     return cell 
    } 
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
     return 100 
    } 
} 

class Cell: UICollectionViewCell { 

    var labelArray = [UILabel]() 

    func fillLabels() { 
     for label in labelArray { 
      label.text = "\(label.text!) yo" 
     } 
    } 

    override init(frame: CGRect) { 
     super.init(frame: frame) 

     contentView.backgroundColor = UIColor.whiteColor() 

     let stackView = UIStackView() 
     stackView.axis = .Horizontal 
     stackView.alignment = .Leading 
     stackView.distribution = .EqualSpacing 
     stackView.translatesAutoresizingMaskIntoConstraints = false 
     contentView.addSubview(stackView) 

     let leftStack = UIStackView() 
     leftStack.axis = .Vertical 

     let rightStack = UIStackView() 
     rightStack.axis = .Vertical 

     stackView.addArrangedSubview(leftStack) 
     stackView.addArrangedSubview(rightStack) 

     for index in 0...10 { 
      let leftLabel = UILabel() 
      leftLabel.text = "\(index)" 
      leftStack.addArrangedSubview(leftLabel) 

      labelArray.append(leftLabel) 

      let rightLabel = UILabel() 
      rightLabel.text = "\(index)" 
      rightStack.addArrangedSubview(rightLabel) 

      labelArray.append(rightLabel) 
     } 


     let constraints = [ 
      "H:|[stackView]|", 
      "V:|[stackView]|" 
      ].flatMap { 
       NSLayoutConstraint.constraintsWithVisualFormat($0, options: [], metrics: nil, views: ["stackView": stackView]) 
     } 

     NSLayoutConstraint.activateConstraints(constraints) 

    } 

    required init?(coder aDecoder: NSCoder) { 
     fatalError("init(coder:) has not been implemented") 
    } 
} 

Si noterà che lo scorrimento sia liscia quando si commento la chiamata a fillLabels.

Se si tenta di riprodurre lo stesso layout senza UIStackViews e includere la chiamata fillLabels, si noterà che lo scorrimento è uniforme.

Ciò suggerisce che UIStackView soffre di colli di bottiglia nelle prestazioni se ha ricalcolato il proprio layout.

Questa ipotesi è corretta? Ci sono delle soluzioni?

+0

Ciao Eric! Sei riuscito a trovare conclusioni su questo? – damirstuhec

+1

No, bug archiviato: https://openradar.appspot.com/24206043 – Eric

+0

Avete il precaricamento dell'opzione attivato nell'Inspector degli attributi per UICollectionView – Balanced

risposta

0

Hai provato a non utilizzare il layout automatico? Nella mia esperienza il layout automatico è un colpevole delle prestazioni in molte situazioni.

Provare a non impostare translatesAutoresizingMaskIntoConstraints su false (l'impostazione predefinita è true) e anche eliminare il layout basato sui vincoli della vista di raccolta stessa (utilizzare invece maschere di autoresizing).

Problemi correlati