我有一个简单的UICollectionViewController,其中FlowLayout嵌入在UINavigationController中。
在UICollectionViewFlowDelegate中,我尝试根据屏幕上集合视图的实际可用大小来计算单元格的大小。
iOS 9上的标准行为似乎是在纵向状态栏中,状态栏高20像素且可见,导航栏高44像素且可见。在横向中,状态栏被隐藏,导航栏的高度为32px。
问题是,当我尝试根据这些数字计算我的单元格大小时,我在collectionView:sizeForItemAtIndexPath函数中得到了错误的数据。
我在这个函数中添加了以下代码来演示我得到的值
print ("Device......: " + UIDevice.currentDevice().name)
print ("Model.......: " + UIDevice.currentDevice().localizedModel)
print ("Orientation.: " + String(UIDevice.currentDevice().orientation.rawValue))
print ("View width..: " + String(self.view.bounds.size.width))
print ("View height.: " + String(self.view.bounds.size.height))
print ("S.bar height: " + String(UIApplication.sharedApplication().statusBarFrame.height))
print ("S.bar hidden: " + String(UIApplication.sharedApplication().statusBarHidden))
print ("N.bar height: " + String(self.navigationController?.navigationBar.frame.height))
当应用程序在iPhone 6模拟器上以纵向方式启动时,我得到以下输出:
Device......: iPhone Simulator
Model.......: iPhone
Orientation.: 1
View width..: 375.0
View height.: 603.0
S.bar height: 20.0
S.bar hidden: false
N.bar height: Optional(44.0)
到目前为止,这是预期的好。当我将设备旋转到横向时,我得到了这个:
Device......: iPhone Simulator
Model.......: iPhone
Orientation.: 4
View width..: 667.0
View height.: 323.0
S.bar height: 20.0
S.bar hidden: false
N.bar height: Optional(32.0)
现在,视图高度与实际视图高度相差20px,状态栏的高度显示为20,而实际为0.此时状态栏在实际隐藏时显示为可见。但它变得更加奇怪。
当我将设备旋转回肖像时,我得到这个:
Device......: iPhone Simulator
Model.......: iPhone
Orientation.: 1
View width..: 375.0
View height.: 623.0
S.bar height: 0.0
S.bar hidden: true
N.bar height: Optional(44.0)
所以似乎状态栏的高度计算在某个地方延迟了。
现在的问题是如何计算函数中集合视图的可见部分的大小
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
注意:
UIApplication.sharedApplication().statusBarHidden
在iOS 9中已弃用。
编辑#1:
在iPhone 6 Plus和6s Plus模拟器上,我似乎得到了预期值。 4s,5,6和6s给出问题中显示的值。
为什么不直接访问UICollectionView框架属性?
在这种方法中
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize
只需访问colllectionView.frame
并根据它计算大小。
您不应该依赖硬编码值来获得高度,因为这些内容可能会在iOS的新版本中发生变化。
你需要使用:
dispatch_async(dispatch_get_main_queue())
{
println("height :(view.bounds.size.height)")
println("width :(view.frame.size.width)")
// all other code depends on UIDevice.current.orientation
}
旋转完成后(在主队列中)将执行此代码,并且新的大小可用。