2017-10-19 43 views
1

J'ai collectionVoir à l'intérieur tableView. collectionView besoin d'une image de défilement horizontale, tableView pour les colonnes de défilement verticales. Quand j'ai eu 3 lignes je n'ai eu aucun problème, mais quand je crée 4 lignes j'ai un problème avec le défilement éléments lignes intérieures. Si je commence à faire défiler le 4 ligne, le défilement est répété sur la ligne 1 et la même chose si je commence à défiler sur 1 ligne défilement se répète sur ligne 4.Réutiliser l'article à l'intérieur d'une rangée lors du défilement

Quel pourrait être le problème et comment le résoudre? Peut être

Peut vérifier le fichier .gif. Je commence le 1 ligne sur le nom « Oko » et si je défilement vers le bas sur 4 ligne et défilement vers la droite collectionCell et retour sur 1 ligne je vois à côté nom de l'image « City », mais il doit être le nom "Oko"

Mon code:

ViewController:

class PhotoStudiosViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UISearchResultsUpdating { 

    @IBOutlet weak var tableView: UITableView! 

    var theStudios: [Studio] = [] 
    var filteredStudios: [Studio] = [] 

    var studiosRef: DatabaseReference! 

    override func viewWillAppear(_ animated: Bool) { 
     super.viewWillAppear(true) 

     tableView.estimatedRowHeight = 475 
     tableView.rowHeight = UITableViewAutomaticDimension 

    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     studiosRef = Database.database().reference(withPath: "PhotoStudios1") 

     studiosRef.observe(.value, with: { (snapshot) in 

      for imageSnap in snapshot.children { 

       let studioObj = Studio(snapshot: imageSnap as! DataSnapshot) 

       self.theStudios.append(studioObj) 

      } 

      self.tableView.reloadData() 

     }) 

    } 
    // MARK: - TableView 
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

     if searchController.isActive && searchController.searchBar.text != "" { 

      return filteredStudios.count 

     } 

     return theStudios.count 

    } 

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

     cell.currentPageNumber.text = "1/\(theStudios[indexPath.row].halls.count)" 

     if searchController.isActive && searchController.searchBar.text != nil { 
      cell.theHalls = filteredStudios[indexPath.row].halls 
     } else { 
      cell.theHalls = theStudios[indexPath.row].halls 
     } 

     cell.nameLabel.text = theStudios[indexPath.row].studioName 

     cell.addressLabel.text = theStudios[indexPath.row].studioAddress 

     cell.logoLabel.sd_setImage(with: URL(string: theStudios[indexPath.row].studioLogo)) 

     cell.didSelectAction = { 

      (innerPath) in 

      self.showDetailsView(indexPath, cellPath: innerPath) 

     } 

     return cell 

    }  

TableViewCell:

class PhotoStudiosTableViewCell: UITableViewCell, UICollectionViewDelegate, UICollectionViewDataSource, UIScrollViewDelegate, UICollectionViewDelegateFlowLayout { 

    @IBOutlet weak var button: UIButton! 
    @IBOutlet weak var logoLabel: UIImageView! 
    @IBOutlet weak var nameLabel: UILabel! 
    @IBOutlet weak var addressLabel: UILabel! 
    @IBOutlet weak var collectionView: UICollectionView! 
    @IBOutlet weak var currentPageNumber: UILabel! 

    var didSelectAction: ((IndexPath) ->())? 

    var theHalls: [Hall] = [] { 
     didSet { 
      collectionView.reloadData() 
     } 
    } 

    var lastContentOffset = CGPoint.zero 

    override func prepareForReuse() { 
     super.prepareForReuse() 

     resetCollectionView() 

    } 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     currentPageNumber.layer.zPosition = 2 
     currentPageNumber.layer.cornerRadius = 15.0 
     currentPageNumber.clipsToBounds = true  

    } 

    func resetCollectionView() { 
     guard !theHalls.isEmpty else { return } 
     theHalls = [] 
     collectionView.reloadData() 
    } 

    // MARK: - CollectionView 
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 

     return theHalls.count 

    } 

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
     let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "collectionCell", for: indexPath) as! PhotoStudiosCollectionViewCell2 

     cell.hallName.text = theHalls[indexPath.item].hallName 

     cell.priceLabel.text = theHalls[indexPath.item].hallPrice 

     cell.metrslabel.text = theHalls[indexPath.item].hallMetrs 

     cell.photoStudioImage.sd_setImage(with: URL(string: theHalls[indexPath.item].hallImage)) 

     return cell 

    } 

    func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 

     didSelectAction?(indexPath) 

    } 

} 

git image

Répondre

3

Vous réutilisez les vues de collecte dans vos cellules, ce qui est correct, mais cela signifie que le contentOffset est également laissé de tout ce qui défilait précédemment quand une cellule est réutilisée. Il devrait être suffisant pour que réinitialiser le contentOffset dans cellForRowAtIndexPath lorsque vous configurez votre cellule en faisant quelque chose comme:

cell.collectionView.contentOffset = .zero 

Une chose à noter est que je ne vois que tu as une propriété appelée lastContentOffset dans vos cellules qui doesn Ne faites rien encore et je suppose que vous allez essayer d'utiliser cela pour conserver le décalage pour une cellule donnée quand elle défile hors de vue pour que vous puissiez le redéfinir quand il revient à la vue (plutôt que de toujours réinitialiser).

Si vous allez faire cela, avoir la propriété dans la cellule ne fonctionnera pas. Vous devez disposer d'une liste de décalages pour chaque cellule stockée à côté de vos modèles de données dans le contrôleur de vue conteneur. Ensuite, vous pouvez enregistrer le décalage pour une cellule donnée dans didEndDisplayingCell et le définir dans cellForRowAtIndexPath au lieu de .zero comme je l'ai fait ci-dessus.

+0

il m'a aidé 'cell.collectionView.contentOffset = .zero'. Un grand merci, le deuxième jour en essayant de résoudre ce problème. Au sujet de l'autre je penserai que j'en ai besoin. – onpro