ios - 多行的 UICollectionView

标签 ios swift uicollectionview

我使用 UICollectionView(带有 UIButton 的 View )来预定时间:

    override func viewDidLoad() {
        super.viewDidLoad()        
        collectionViewTime.register(UINib(nibName: "TimeCollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "timecell")
        collectionViewTime.dataSource = self
        collectionViewTime.delegate = self        
        if let layout = collectionViewTime.collectionViewLayout as? UICollectionViewFlowLayout {
            layout.scrollDirection = .vertical
        }

    }

    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }

    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return Timeline.count
    }

    func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {            
        let flowLayout = collectionViewLayout as! UICollectionViewFlowLayout
        let numberOfItems = CGFloat(collectionView.numberOfItems(inSection: 0))
        let combinedItemWidth = (numberOfItems * flowLayout.itemSize.width) + ((numberOfItems - 1)  * flowLayout.minimumInteritemSpacing)
        let padding = (collectionView.frame.width - combinedItemWidth) / 2
        return UIEdgeInsets(top: 0, left: padding, bottom: 0, right: padding)
    }

    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {            
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "timecell", for: indexPath) as! TimeCollectionViewCell            
        let time = Timeline[indexPath.row][0]
        cell.btnTime.setTitle(DateManager.dateToTime(date: time.0), for: .normal)            
        return cell
    }

我在一行中获得了所有 View (UIButtons): UICollectionView 如何设置在新行中自动移动 UIView? 所以,在我的例子中(iPad),一行将包含 7 个 UIView,而 iPhone 将在一行中包含 4-5 个 UIView。

最佳答案

为此,您需要实现 UICollectionViewDelegateFlowLayout 方法 collectionView(_:layout:sizeForItemAt:) 并更改 collectionView滚动方向垂直

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    let minCellSpace: CGFloat = 10 //Set minimum cell space that you want
    if UIDevice.current.userInterfaceIdiom == .pad {
         //For iPad return 7 cell as you mention in question
         return CGSize(width: (collectionView.frame.size.width / 7) - minCellSpace, height: yourCellHeight)
    }
    else {
         //For iPhone return 4 cell, if you want to return 5 cell divide width to 5
         return CGSize(width: (collectionView.frame.size.width / 4) - minCellSpace, height: yourCellHeight)
    }
}

关于ios - 多行的 UICollectionView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42087702/

相关文章:

iOS 7 通过点击推送通知查看特定的View Controller

ios - 加载 txt 文件 Swift

ios - 使用 swift : [SimpleRunner. 运行 setTime:] 时出现核心数据错误:无法识别的选择器发送到实例

ios - 如果 cellForItemAtIndexPath : is called in didSelectItemAtIndexPath: 有什么问题

ios - 当应用程序不在ios中运行时,是否可以调用方法?

ios - 使用 UIWebView 和/或 UITableView 创建下拉效果

ios - 如何从其他 ViewController 访问 MapView 实例? ( map 框, swift )

swift - 将 TableView 中的 Textfield 中的值保存到 UserDefults : Swift

ios - 重用自定义 Collection View 单元格保留旧的大小属性

ios - 如何匹配水平 collectionView 单元格的宽度与其内容大小