iOS 9:以纵向和横向确定集合视图的大小

时间:2016-03-13 10:51:29

标签: swift uicollectionview height ios9 statusbar

我有一个简单的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给出了问题中显示的值。

2 个答案:

答案 0 :(得分:0)

为什么不直接访问UICollectionView框架属性?

在这个方法中

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

只需访问colllectionView.frame并根据它计算尺寸。

您不应该依赖硬编码值来处理高度,因为这些内容可能会在iOS的新版本中发生变化。

答案 1 :(得分:0)

您需要使用:

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 
    }

此代码将在轮换完成之后(在主队列中)执行,并且新的大小可用。