UICollectionView在UITableViewCell中重用

时间:2016-09-25 18:22:12

标签: ios swift uitableview uicollectionview

我知道这个问题已经问了很多次,但解决方案没有问题。

我在uitableview单元格中有集合视图,我在故事板中准备了一个表视图和集合视图的单元格,我的问题是假设我滚动单元格1集合视图,然后单元格4集合也自动滚动到该位置。我怎么能处理这种情况..

  

请注意我现在制作一个静态的屏幕设计

我的代码

// MARK:
    // MARK: table view delegate method

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return 1
    }
    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {

        if Appconstant.isIpad()
        {
            return 215.0
        }
        return 185.0

    }
    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 6
    }
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let strCell = "WorkoutCell" //+ "\(indexPath.row)"
        let cell = tableView.dequeueReusableCellWithIdentifier(strCell) as? WorkoutCell
//        if cell == nil
//        {
//            cell = work 
//        }
        return cell!
    }
    func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) {
        let cell2 = cell as! WorkoutCell
        cell2.collecionWorkout.reloadData()
    }
    // MARK:
    // MARK: collectionview delegate and data source
    //1
    func shouldInvalidateLayoutForBoundsChange(newBounds: CGRect) -> Bool {
        return true
    }
     func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int {
        return 1
    }

    //2
     func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 10
    }
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
        return UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0)
    }

    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: NSIndexPath) -> CGSize {
        // Adjust cell size for orientation
        if Appconstant.isIpad() {
            return CGSize(width: 160, height: 150)
        }
        return CGSize(width: 140.0, height: 130.0)
    }
    //3
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("WorkoutCollectionCell", forIndexPath: indexPath)
        // Configure the cell
        return cell
    }
  

uitableview单元格代码

class WorkoutCell: UITableViewCell {

    @IBOutlet weak var collecionWorkout: UICollectionView!
    var flowLayout : UICollectionViewFlowLayout!
    override func awakeFromNib() {
        super.awakeFromNib()
        self.flowLayout = UICollectionViewFlowLayout()
        if Appconstant.isIpad()
        {
            self.flowLayout.itemSize = CGSize(width: 160, height: 150)
        }
        else
        {
            self.flowLayout.itemSize = CGSize(width: 140, height: 130)
        }
        self.flowLayout.scrollDirection = .Horizontal
        self.flowLayout.minimumInteritemSpacing = 10.0
        flowLayout.sectionInset = UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0);
        collecionWorkout.collectionViewLayout = flowLayout

        // Initialization code
    }

    override func setSelected(selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
  

我滚动的第一小区

enter image description here

  

单元格4自动滚动

enter image description here

2 个答案:

答案 0 :(得分:4)

有两种情况。

1-重置UICollectionView偏移位置:

要重置集合视图位置,只需在cellForRowAtIndexPath中调用cell.collectionView.contentOffset = .zero

2-保持上一个滚动位置:

要保持先前的滚动位置,您需要为每个单元格的偏移量列表与数据模型一起存储在包含的视图控制器中。然后,您可以将给定单元格的偏移量保存在didEndDisplayingCell中,并在cellForRowAtIndexPath中而不是.zero中进行设置。

答案 1 :(得分:2)

UITableView适用于reusability的概念。每当滚动tableView时,cells中的tableView肯定会被重用。

现在出现两种情况,

  1. 获取新单元格-重新使用tableViewCell时,其内部的collectionView也将被重新使用,因此这就是{{1 }}保留前一个单元格。

  2. contentOffset-如果我们已手动滚动到Scroll to previous cell中的某个特定cell,则在滚动回该位置时可能希望保留其位置。

要在collectionView中获得这种功能,我们需要-为tableView手动重置contentOffset,并且需要将1st case保留在第二个中。

您可以遵循的另一种方法是使用 contentOffset

这是怎么回事。

  1. combination of UIScrollview and UIStackView中,创建一个UIScrollView。向其中添加垂直的UIStackView。

  2. storyboard中添加4 UICollectionViews。该号码可以根据您的要求进行配置。

  3. 将您的stackView添加为所有controller的{​​{1}}和dataSource

delegate

现在,由于我们使用的是collectionViews,因此class ViewController: UIViewController, UICollectionViewDataSource { override func viewDidLoad() { super.viewDidLoad() } func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { return 10 } func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) as! CustomCell cell.label.text = "\(indexPath.row)" return cell } } class CustomCell: UICollectionViewCell { @IBOutlet weak var label: UILabel! } 都不会被重用。因此,所有stackView中的collectionViews将保持不变。

enter image description here