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

问题描述 投票:1回答:2

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

swift uicollectionview height ios9 statusbar
2个回答
0
投票

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

在这种方法中

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

只需访问colllectionView.frame并根据它计算大小。

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


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 
    }

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

© www.soinside.com 2019 - 2024. All rights reserved.