Swift中集合视图的横向方向

时间:2016-05-11 02:24:52

标签: ios xcode swift uicollectionview uicollectionviewcell

我在集合视图单元格中遇到横向问题。当应用程序处于纵向状态时,它会为我提供每行正确的单元格数,即2.当我将应用程序旋转到横向时,每行显示1个单元格。这是我得到的屏幕:

人像: enter image description here

风景: enter image description here

这是我添加单元格大小的代码:

func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {

        var screenSize = CGFloat()
        if UIDevice.currentDevice().orientation.isLandscape.boolValue {
            screenSize = UIScreen.mainScreen().bounds.size.width
        }
        else {
            screenSize = UIScreen.mainScreen().bounds.size.width
        }

        let cellWidth = screenSize / 2.0

        return CGSizeMake(cellWidth, cellWidth)
    }

5 个答案:

答案 0 :(得分:4)

这是你可以做的事情

let orientation = UIApplication.sharedApplication().statusBarOrientation
if(orientation == .LandscapeLeft || orientation == .LandscapeRight)
{
    return CGSizeMake((yourCollectionView.frame.size.width-10)/2, (yourCollectionView.frame.size.height-10)/2)
}
else{
    return CGSizeMake((yourCollectionView.frame.size.width-5)/2, (yourCollectionView.frame.size.height-10)/3)
}

此代码实现的目标: - 如果您的视图是纵向的,您将看到2列和3行,如果您的视图是横向的,您将看到3列和2行。您在代码中看到的推论是两个连续单元格之间的间距。因此,如果有3列,则扣除为15,如果有2列,则扣除为10,假设两个单元格之间的间距为5.同样适用于该行。

如果需要,您也可以使用屏幕尺寸,但我的集合视图中有自动布局约束以匹配屏幕的大小,因此结果相同。我希望这就是你要找的东西。

答案 1 :(得分:0)

Swift 4.2

let orientation = UIApplication.shared.statusBarOrientation
    if(orientation == .landscapeLeft || orientation == .landscapeRight) {
        return CGSize(width: (collectionView.frame.size.width-10)/2, height: (collectionView.frame.size.height-10)/2)
    }
    else {
        return CGSize(width: (collectionView.frame.size.width-5)/2, height: (collectionView.frame.size.height-10)/3)
    }

答案 2 :(得分:0)

只需在

中重新加载UICollectionView

覆盖

func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
        super.viewWillTransition(to: size, with: coordinator)

        yourCollectionView.reloadData()
    }

,方向更改后,您的收藏夹视图布局将再次刷新

更新: 这是collectionView布局的代码段,可在我的代码的每一行中显示4个图像视图,即使将方向从纵向更改为横向,反之亦然,也可以正常工作。您可以根据需要进行更改:

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    sizeForItemAt indexPath: IndexPath) -> CGSize {
    return CGSize(width: UIScreen.main.bounds.width / 4.8, height: UIScreen.main.bounds.width / 4.8)
}

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {

    return UIEdgeInsets(top: 0.0, left: 0.0, bottom: 0.0, right: 0.0)
}

func collectionView(_ collectionView: UICollectionView,
                    layout collectionViewLayout: UICollectionViewLayout,
                    minimumInteritemSpacingForSectionAt section: Int) -> CGFloat {

    return 0.0
}

func collectionView(_ collectionView: UICollectionView, layout
    collectionViewLayout: UICollectionViewLayout,
                    minimumLineSpacingForSectionAt section: Int) -> CGFloat {

    return 16.0
}

希望它会对您有所帮助。

干杯!

答案 3 :(得分:0)

雨燕5

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
    var flag:CGSize? = nil
    if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.pad
    {
        if UIApplication.shared.statusBarOrientation.isPortrait{

            let cellWidth = floor((collectionView.bounds.width - 5) / 2)
            flag = CGSize(width: cellWidth, height: cellWidth)
        }

        else if UIApplication.shared.statusBarOrientation.isLandscape{

            let cellwidth = floor((collectionView.bounds.width - 5) / 4)
            flag =  CGSize(width: cellwidth, height: cellwidth)

        }

    }
    else if UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiom.phone{

        if UIApplication.shared.statusBarOrientation.isLandscape {
          let cellWidth = floor((collectionView.bounds.width - 5) / 2)
            flag = CGSize(width: cellWidth, height: cellWidth)
        } else if UIApplication.shared.statusBarOrientation.isPortrait{
            //  let cellWidth = floor((collectionView.bounds.width - 5))
            flag = CGSize(width: 402 , height: 185)
        }

    }

    return flag!
}

答案 4 :(得分:0)

不要重新加载您的集合视图只会使您的集合视图 flowlayour Done 无效

如果您不明白这意味着什么,只需复制并粘贴此代码并更改您的集合视图名称

覆盖 func viewWillLayoutSubviews() { super.viewWillLayoutSubviews()

fiveCellCustomCollectionView 是我的自定义视图,customCollectionView 是集合视图

  guard let flowLayout = fiveCellCustomCollectionView.customCollectionView.collectionViewLayout as? UICollectionViewFlowLayout else { return }
  flowLayout.invalidateLayout()
}