UICollectionView Cell Spacing 基于设备屏幕尺寸
UICollectionView Cell Spacing based on device screen size
我已经实现了一个 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!
}
iPhone6 的结果:
结果 iPhone 5 秒
Objective-C / Swift 都可以解决。
谢谢
第 1 步:实施 UICollectionViewDelegateFlowLayout(如果未完成)。
步骤 2:使用 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 步:转到 XIB 或 StoryBoard 那里有您的 CollectionView。
第 4 步: 在 XIB 或 StoryBoard 中,您有 CollectionView,点击 CollectionView。
第 5 步: 转到 InterfaceBuilder,然后在倒数第二个选项卡(即:Size Inspector)中设置 Min Spacing
对于单元格 = 5
行 = 5
就是它。
Note:
- This solution is for if you wants to make spacing between cell = 5.
- If your spacing is different then 5, then you need to change value 15 in delegate method.
- Ex: Spacing between cell = 10, then change delegate 15 to 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
}
稍微灵活一点的回答
允许您调整列数和间距,扩展 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);
}
我想要 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)
}
`
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);
}
为了扩展 ,有一个与部分点宽度相关的小警告:部分点宽度的舍入可能导致宽度比允许的所需列数更宽。解决此问题的一种方法是使用 trunc():
截断宽度
return CGSizeMake(trunc(width), height)
我已经实现了一个 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!
}
iPhone6 的结果:
结果 iPhone 5 秒
Objective-C / Swift 都可以解决。 谢谢
第 1 步:实施 UICollectionViewDelegateFlowLayout(如果未完成)。
步骤 2:使用 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 步:转到 XIB 或 StoryBoard 那里有您的 CollectionView。
第 4 步: 在 XIB 或 StoryBoard 中,您有 CollectionView,点击 CollectionView。
第 5 步: 转到 InterfaceBuilder,然后在倒数第二个选项卡(即:Size Inspector)中设置 Min Spacing
对于单元格 = 5
行 = 5
就是它。
Note:
- This solution is for if you wants to make spacing between cell = 5.
- If your spacing is different then 5, then you need to change value 15 in delegate method.
- Ex: Spacing between cell = 10, then change delegate 15 to 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
}
稍微灵活一点的回答
允许您调整列数和间距,扩展 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);
}
我想要 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) }
`
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);
}
为了扩展
return CGSizeMake(trunc(width), height)