2016-03-13 1 views
1

У меня есть простой UICollectionViewController с FlowLayout, встроенный в UINavigationController.iOS 9: определение размера коллекции в портретной и ландшафтной картине

В UICollectionViewFlowDelegate я пытаюсь рассчитать размер ячейки в зависимости от фактического доступного размера вида коллекции на экране.

Стандартное поведение на iOS 9 похоже на то, что в портрете строка состояния имеет высоту 20 пикселей и видимую, а панель навигации высотой 44 пикселя и видимой. В ландшафте строка состояния скрыта, а панель навигации имеет высоту 32 пикселя.

Проблема заключается в том, что когда я пытаюсь вычислить размер моей ячейки на основе этих цифр, я получаю неправильные данные в функции 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 

осуждается в прошивке 9.

Edit # 1:

На симуляторе iPhone 6 Plus и 6s Plus я, кажется, получаю ожидаемые значения. 4s, 5, 6 и 6s дают значения, указанные в вопросе.

ответ

0

Почему бы просто не получить доступ к свойству рамки UICollectionView?

В этом методе

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

Просто доступа colllectionView.frame и рассчитать размер на его основе.

Вы никогда не должны полагаться на жестко закодированные значения высот, поскольку это может измениться в новой версии iOS.

+0

Не работает как 'collectionView.frame.height' возвращает то же (неправильное) значение как' self.view.bounds.size.height'. Также весь вопрос заключается в том, чтобы избежать жестко заданных значений. Вот почему я стараюсь рассчитать размер в первую очередь. – Georg

+1

Перезагружаете ли вы данные после завершения компоновки? –

+0

Нет, я этого не делал. Перезагрузка в 'didRotateFromInterfaceOrientation' сделала трюк. Благодаря!. Одна заметка на стороне: если я не перезагружаю данные в 'willRotateToInterfaceOrientation' (что я и сделал), то есть очень уродливые промежуточные эффекты визуального перехода. – Georg