我在集合视图单元格中遇到横向问题。当应用程序处于纵向状态时,它会为我提供每行正确的单元格数,即2.当我将应用程序旋转到横向时,每行显示1个单元格。这是我得到的屏幕:
这是我添加单元格大小的代码:
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)
}
答案 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()
}