Swift 3 CollectionView缩放

时间:2016-11-26 19:26:29

标签: ios swift uicollectionview

我最近在应用程序中实现了一个集合视图,我遇到的唯一问题是集合视图在较小的设备上从2列变为1列,并且两侧都有大量填充

在比iPhone 6更小的显示屏上显示: enter image description here

并说明它在大于或等于iPhone 6的显示器上的外观: enter image description here

我确实尝试了几种方法,如果显示宽度小于一定数量,它会扩大单元格,但它无法解决,因为单元格确实按比例放大但没有居中并且重叠自身。< / p>

2 个答案:

答案 0 :(得分:2)

您需要根据手机尺寸计算尺寸 - 如果两个单元格的宽度大于屏幕尺寸(包括它们之间的所有偏移量),它们将按照第一张图片进行布局。

您有两种选择: 一种是根据设备尺寸处理尺寸和重新缩放单元 两个保持原样 - 对iphone6 / 6s / 7进行小的更改。

如果您选择退出第一个,则需要为这些尺寸设置约束 - 纵横比或水平中心(可以稍微裁剪图像)。

要动态更改尺寸,请查看: https://developer.apple.com/reference/uikit/uicollectionviewdelegateflowlayout

更具体: https://developer.apple.com/reference/uikit/uicollectionviewdelegateflowlayout/1617708-collectionview

答案 1 :(得分:2)

  

您需要计算单元格宽度。请尝试此代码。

class YourClass: UIViewController {
        //MARK:-Outlets
        @IBOutlet weak var yourCollectionView: UICollectionView!

        //Mark:-Variables
        var cellWidth:CGFloat = 0
        var cellHeight:CGFloat = 0
        var spacing:CGFloat = 12
        var numberOfColumn:CGFloat = 2


        //MARK:-LifeCycle
        override func viewDidLayoutSubviews() {
            super.viewDidLayoutSubviews()

            yourCollectionView.contentInset = UIEdgeInsets(top: spacing, left: spacing, bottom: spacing, right: spacing)

            if let flowLayout = yourCollectionView.collectionViewLayout as? UICollectionViewFlowLayout{
                cellWidth = (yourCollectionView.frame.width  - (numberOfColumn + 1)*spacing)/numberOfColumn
               cellHeight = cellWidth //yourCellHeight = cellWidth if u want square cell
                flowLayout.minimumLineSpacing = spacing
                flowLayout.minimumInteritemSpacing = spacing
            }
        }

     extension YourClass:UICollectionViewDelegateFlowLayout{
            func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
                return CGSize(width: cellWidth, height: cellHeight)
            }
    }