【问题标题】:Horizontally scroll ALL rows of UICollectionView together一起水平滚动 UICollectionView 的所有行
【发布时间】:2016-03-04 21:58:54
【问题描述】:

我有UITableView。在UITableViewCell 里面我放了UICollectionView。目前所有行单独滚动。我需要的是当用户以水平方式(从左到右或从右到左)滚动任何行时,所有行必须以相同的模式滚动。

我点击了下面的链接,但没有成功

Scroll Multiple UICollectionView with one collectionview IOS

Manually scrolling two UICollectionViews showing the same content

请看我的代码

视图控制器

import UIKit

class ViewController: UIViewController, UITableViewDataSource {

    var categories = ["Header 1", "Header 2", "Header 3", "Header 4", "Header 5", "Header 6", "Header 7", "Header 8"]

    @IBOutlet var myTableView: UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()

        myTableView.dataSource = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        return categories[section]
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {
        return categories.count
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? CategoryRow
        if cell == nil {
            cell = CategoryRow(style:UITableViewCellStyle.Subtitle, reuseIdentifier:"cell")
        }
        else {
        }
        cell!.tag = indexPath.section
        cell?.collection.reloadData()
        return cell!
    }
}

MyCollectionViewCell

import UIKit

class MyCollectionViewCell: UICollectionViewCell {

    @IBOutlet var title: UILabel!
    @IBOutlet var data: UILabel!
}

类别行

import UIKit

class CategoryRow: UITableViewCell, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, UIScrollViewDelegate {

    var Title1 = ["1st Title 1", "1st Title 2", "1st Title 3", "1st Title 4", "1st Title 5", "1st Title 6", "1st Title 7", "1st Title 8"]
    var Data1 =  ["1st Data 1", "1st Data 2", "1st Data 3", "1st Data 4", "1st Data 5", "1st Data 6", "1st Data 7", "1st Data 8"]

    var Title2 = ["2nd Title 1", "2nd Title 2", "2nd Title 3", "2nd Title 4", "2nd Title 5", "2nd Title 6", "2nd Title 7", "2nd Title 8"]
    var Data2 =  ["2nd Data 1", "2nd Data 2", "2nd Data 3", "2nd Data 4", "2nd Data 5", "2nd Data 6", "2nd Data 7", "2nd Data 8"]

    var Title3 = ["3rd Title 1", "3rd Title 2", "3rd Title 3", "3rd Title 4", "3rd Title 5", "3rd Title 6", "3rd Title 7", "3rd Title 8"]
    var Data3 =  ["3rd Data 1", "3rd Data 2", "3rd Data 3", "3rd Data 4", "3rd Data 5", "3rd Data 6", "3rd Data 7", "3rd Data 8"]

    var Title4 = ["4th Title 1", "4th Title 2", "4th Title 3", "4th Title 4", "4th Title 5", "4th Title 6", "4th Title 7", "4th Title 8"]
    var Data4 =  ["4th Data 1", "4th Data 2", "4th Data 3", "4th Data 4", "4th Data 5", "4th Data 6", "4th Data 7", "4th Data 8"]

    var Title5 = ["5th Title 1", "5th Title 2", "5th Title 3", "5th Title 4", "5th Title 5", "5th Title 6", "5th Title 7", "5th Title 8"]
    var Data5 =  ["5th Data 1", "5th Data 2", "5th Data 3", "5th Data 4", "5th Data 5", "5th Data 6", "5th Data 7", "5th Data 8"]

    var Title6 = ["6th Title 1", "6th Title 2", "6th Title 3", "6th Title 4", "6th Title 5", "6th Title 6", "6th Title 7", "6th Title 8"]
    var Data6 =  ["6th Data 1", "6th Data 2", "6th Data 3", "6th Data 4", "6th Data 5", "6th Data 6", "6th Data 7", "6th Data 8"]

    var Title7 = ["7th Title 1", "7th Title 2", "7th Title 3", "7th Title 4", "7th Title 5", "7th Title 6", "7th Title 7", "7th Title 8"]
    var Data7 =  ["7th Data 1", "7th Data 2", "7th Data 3", "7th Data 4", "7th Data 5", "7th Data 6", "7th Data 7", "7th Data 8"]

    var Title8 = ["8th Title 1", "8th Title 2", "8th Title 3", "8th Title 4", "8th Title 5", "8th Title 6", "8th Title 7", "8th Title 8"]
    var Data8 =  ["8th Data 1", "8th Data 2", "8th Data 3", "8th Data 4", "8th Data 5", "8th Data 6", "8th Data 7", "8th Data 8"]

    @IBOutlet var collection: UICollectionView!


    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
        super.init(style: style, reuseIdentifier: reuseIdentifier)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

    func scrollViewDidScroll(scrollView: UIScrollView) {
        // Some logic here
    }


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

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

    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier("videoCell", forIndexPath: indexPath) as! MyCollectionViewCell

        switch (self.tag) {
            case 0:
                cell.title.text = self.Title1[indexPath.row]
                cell.data.text = self.Data1[indexPath.row]
                break

            case 1:
                cell.title.text = self.Title2[indexPath.row]
                cell.data.text = self.Data2[indexPath.row]
                break

            case 2:
                cell.title.text = self.Title3[indexPath.row]
                cell.data.text = self.Data3[indexPath.row]
                break

            case 3:
                cell.title.text = self.Title4[indexPath.row]
                cell.data.text = self.Data4[indexPath.row]
                break

            case 4:
                cell.title.text = self.Title5[indexPath.row]
                cell.data.text = self.Data5[indexPath.row]
                break

            case 5:
                cell.title.text = self.Title6[indexPath.row]
                cell.data.text = self.Data6[indexPath.row]
                break

            case 6:
                cell.title.text = self.Title7[indexPath.row]
                cell.data.text = self.Data7[indexPath.row]
                break

            case 7:
                cell.title.text = self.Title8[indexPath.row]
                cell.data.text = self.Data8[indexPath.row]
                break

            default:
                break
        }
        return cell
    }
}

编辑 - 1

项目链接可能有助于理解场景

https://drive.google.com/file/d/0B0drBRiVjY71Tl9vUER6Zk44VFk/view?usp=sharing

编辑 - 2 我试图实现下面的链接,但不能这样做

Synchronized horizontal scrolling of collection views in tableview rows

提前致谢

【问题讨论】:

  • 你能详细解释一下预期的行为吗?
  • 我认为这可以通过调用委托方法来滚动所有其他集合视图来实现,调用您实际滚动的集合视图的委托调用
  • Gihan,我已经上传了项目的链接,可能会帮助你获得场景。
  • 今晚我会检查你的代码并更新答案。现在工作有点忙

标签: ios swift uitableview uiscrollview uicollectionview


【解决方案1】:

假设您有 2 个集合视图。你能做的就是这样。

// say cv0 and cv1 are outlets to two table views

func scrollViewDidScroll(scrollView: UIScrollView) {
    if scrollView == self.cv0 {
        self.cv1.contentOffset = self.cv0.contentOffset
    }
    else {
        if scrollView == self.tv1 {
            self.cv0.contentOffset = self.cv1.contentOffset
        }
    }
}

如果你想获得更多的集合视图,你可以编写一个通用方法来处理它。您可以将 scrollView 传递给此方法,并且堆栈 contentOffSet 中的所有其他滚动视图都会相应地设置。

【讨论】:

  • Gihan,你能告诉我如何获得 cv0 和 cv1 吗?
  • 您可以在数组中保留对它们的引用。或者您可以使用 var indexPathsForVisibleRows: [NSIndexPath] 从 tableView 获取所有可见行? { get } 并获取单元格,然后是滚动视图
  • 我已经尝试过使用这个 var visibleItems = self.collection.indexPathsForVisibleItems() let currentItem = visibleItems[0] let nextItem = NSIndexPath(forItem: currentItem.item + 1, inSection: currentItem.section) self.collection.scrollToItemAtIndexPath(nextItem, atScrollPosition: UICollectionViewScrollPosition.Right, animated: true) 是否正确?任何代码将不胜感激。
  • 一会儿我会看看你的代码。现在有点忙。
  • @Gihan,我也有类似的问题。可以帮忙看看吗?
【解决方案2】:

感谢@Impossible 帮助问题现已解决。

首先我在cellForRowAtIndexPathUITableView 中设置了标签cell?.collection.tag 喜欢

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    var cell = tableView.dequeueReusableCellWithIdentifier("cell") as? CategoryRow
    if cell == nil {
        cell = CategoryRow(style:UITableViewCellStyle.Subtitle, reuseIdentifier:"cell")
    }
    else {
    }
    cell!.tag = indexPath.section
    cell?.collection.tag = (100 * indexPath.section) + 1
    cell?.collection.reloadData()
    cell?.collection.delegate = self
    return cell!
}

然后我通过在scrollViewDidScroll 中使用标签方法viewWithTag 来获取视图

func scrollViewDidScroll(scrollView: UIScrollView) {

    for var i = 0 ; i < 8 ; i++ {
        let cell2 = self.view .viewWithTag((100 * i) + 1) as? UICollectionView

        if cell2 != nil {
            cell2!.contentOffset = scrollView.contentOffset
        }
    }
}

【讨论】:

    猜你喜欢
    • 2016-09-17
    • 2013-10-18
    • 2014-11-15
    • 2015-05-31
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    相关资源
    最近更新 更多