UICollectionView Cell Spacing 基于设备屏幕大小
Posted
技术标签:
【中文标题】UICollectionView Cell Spacing 基于设备屏幕大小【英文标题】:UICollectionView Cell Spacing based on device screen size 【发布时间】:2015-03-05 07:11:29 【问题描述】:我已经实现了一个 UICollectionView,单元格大小是 w90 h90。当我在 iPhone 6 上运行它时,我得到了单元格之间的适当间距,但是当我在 iPhone 5s 上运行它时,我得到了更多单元格之间的间距。 我的问题是如何根据设备屏幕尺寸更改单元格大小,假设如果单元格大小为 w80 h80,我在 iPhone 5s 上也能得到正确的结果。我现在正在做的是
override func viewWillAppear(animated: Bool)
var scale = UIScreen.mainScreen().scale as CGFloat
println("Scale :\(scale)")
var cellSize = (self.collectionViewLayout as UICollectionViewFlowLayout).itemSize
println("Cell size :\(cellSize)")
imageSize = CGSizeMake(cellSize.width * scale , cellSize.height * scale)
println("Image size : \(imageSize)")
// sizeForItemAtIndexPath
func collectionView(collectionView: UICollectionView,layout collectionViewLayout: UICollectionViewLayout,sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
return imageSize!
iPhone 6 上的结果:
iPhone 5s 上的结果
Objective-C / Swift 都适合解决问题。 谢谢。
【问题讨论】:
使用以下方法 collectionView(_:layout:sizeForItemAtIndexPath:) 并根据屏幕定义单元格大小 【参考方案1】:第 1 步: 实施 UICollectionViewDelegateFlowLayout(如果未完成)。
第二步:使用UICollectionViewDelegateFlowLayout的委托方法。
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/4,120); //use height whatever you wants.
第 3 步:转到您拥有 CollectionView 的 XIB 或 StoryBoard。
第 4 步:在 XIB 或 StoryBoard 中,您有 CollectionView,点击 CollectionView。
第 5 步: 转到 InterfaceBuilder,然后在倒数第二个选项卡(即:Size Inspector)中设置 Min Spacing
对于单元格 = 5
对于线 = 5
那个。
并设置最小间距注意:
此解决方案适用于您希望单元格之间的间距 = 5。 如果您的间距与 5 不同,则需要在委托方法中更改值 15。 例如:单元格之间的间距 = 10,然后将委托 15 更改为 10x3 = 30
return CGSizeMake((UIScreen.mainScreen().bounds.width-30)/4,120);
For Cells = 10
For Lines = 10
反之亦然。
Swift 3 版本
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize
let width = UIScreen.main.bounds.width
return CGSize(width: (width - 10)/3, height: (width - 10)/3) // width & height are the same to make a square cell
【讨论】:
太棒了!!!!这是一个完美的解决方案。搜索并尝试了很多答案,但都失败了。 拯救了我的一天!感谢您的回答:)【参考方案2】:更灵活的答案
允许您调整列数和间距,扩展 Zaid Pathan 的答案
// MARK: UICollectionViewDelegateFlowLayout delegate method
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
let cellSpacing = CGFloat(2) //Define the space between each cell
let leftRightMargin = CGFloat(20) //If defined in Interface Builder for "Section Insets"
let numColumns = CGFloat(3) //The total number of columns you want
let totalCellSpace = cellSpacing * (numColumns - 1)
let screenWidth = UIScreen.mainScreen().bounds.width
let width = (screenWidth - leftRightMargin - totalCellSpace) / numColumns
let height = CGFloat(110) //whatever height you want
return CGSizeMake(width, height);
【讨论】:
【参考方案3】:我想要在 iPad 和 iPhone 的一个部分中包含 3 个项目。我使用以下代码进行了计算。希望对您有所帮助!
实现 UICollectionViewDelegateFlowLayout 委托
添加此代码
var device = UIDevice.currentDevice().model
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
if (device == "iPad" || device == "iPad Simulator")
return CGSizeMake((UIScreen.mainScreen().bounds.width-15)/3,230)
return CGSizeMake((UIScreen.mainScreen().bounds.width-10)/3,120)
`
【讨论】:
感谢这些数据,它帮助我增加了 ipad 的 UICollectionView 项目的大小【参考方案4】:Objective-c
示例:
使用这个功能
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
return CGSizeMake(Your desired width, Your desired height);
// example: return CGSizeMake(self.view.frame.size.width-20, 100.f);
【讨论】:
【参考方案5】:为了扩展Tim's answer,有一个关于部分点宽度的小警告:部分点宽度的舍入可能会导致宽度比允许的所需列数更宽。解决此问题的一种方法是使用 trunc() 截断宽度:
return CGSizeMake(trunc(width), height)
【讨论】:
以上是关于UICollectionView Cell Spacing 基于设备屏幕大小的主要内容,如果未能解决你的问题,请参考以下文章
ios . -- UICollectionView --cell 自适应
UICollectionView cell间距调整以及常用代理方法
UICollectionview 不工作,我没有得到任何 Cell
iOS解决UICollectionView中使用reloadItemsAtIndexPaths进行局部cell更新导致视图重叠问题