У меня есть простой 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 дают значения, указанные в вопросе.
Не работает как 'collectionView.frame.height' возвращает то же (неправильное) значение как' self.view.bounds.size.height'. Также весь вопрос заключается в том, чтобы избежать жестко заданных значений. Вот почему я стараюсь рассчитать размер в первую очередь. – Georg
Перезагружаете ли вы данные после завершения компоновки? –
Нет, я этого не делал. Перезагрузка в 'didRotateFromInterfaceOrientation' сделала трюк. Благодаря!. Одна заметка на стороне: если я не перезагружаю данные в 'willRotateToInterfaceOrientation' (что я и сделал), то есть очень уродливые промежуточные эффекты визуального перехода. – Georg