Размер кадра UICollectionView больше, чем размер UIScreen

В viewDidLoad функции моего UIViewController я звоню

print("\(UIScreen.main.bounds.size.width) \(collectionView.frame.width)")

и он печатает

320.0 375.0

Как это возможно? UICollectionView должен иметь ту же ширину, мб меньше, но точно не больше

Настройки этого представления в раскадровке:

введите здесь описание изображения

каждое ограничение установлено как

введите здесь описание изображения

Поэтому я тестирую его на симуляторе iPhone SE, но в раскадровке у меня iPhone 8.

введите здесь описание изображения

введите здесь описание изображения

Но я считаю, что это не должно иметь никакого значения, когда я использую автомакет (ограничения, чтобы размер моего представления соответствовал размеру безопасной области)

Ширина iPhone 8 составляет 375 точек, а iPhone SE — 320:

введите здесь описание изображения

Обновить

Кажется, viewDidLoad возвращает размеры вашего последнего выбранного устройства в раскадровке (довольно уродливо)

Итак, чтобы получить правильные данные о просмотрах, мне нужно получить размеры в viewDidAppear

В Android, если размер какого-либо представления еще недоступен (представление еще не было увеличено), он просто возвращает нули (ширина == 0, высота == 0), но в iOS вы получаете ширину и высоту из раскадровки Xcode во время выполнения ... Действительно?


person user924    schedule 13.04.2019    source источник


Ответы (1)


Когда вы создаете экземпляр контроллера представления из раскадровки, размер его представления будет таким, какой в ​​данный момент установлен в раскадровке. Он будет иметь тот же размер, что и экран после добавления в иерархию представлений. viewDidLoad вызывается перед добавлением представления, поэтому оно по-прежнему будет иметь тот же размер, что и на раскадровке. Вы можете получить размер, который отображается во внутренних методах, viewWillApear, viewDidAppear и viewDidLayout. Просто имейте в виду, что эти методы могут вызываться несколько раз.

person riadhluke    schedule 13.04.2019
comment
Да.. уже выяснил это. Лучше возвращать нули, как в Android, потому что многие разработчики могут подумать, что размеры правильные в viewDidLoad, поэтому он очень плохо спроектирован. В Android, если размер какого-либо представления еще недоступен (представление еще не было увеличено), он просто возвращает нули (ширина == 0, высота == 0), но в iOS вы получаете ширину и высоту от последнего выбранного устройства в Раскадровка Xcode во время выполнения (в функции viewDidLoad)... - person user924; 13.04.2019
comment
Я думаю, что это может быть проблематично, если вы не используете Autolayout и просто хотите, чтобы ваши представления имели тот же размер, что и установленный вами в раскадровке. Я думаю, что раскадровки и перья на самом деле просто архив, который будет использоваться NSCoding реализацией UIKit классов. Таким образом, имеет смысл, что любые свойства, которые вы устанавливаете для них, отражаются, когда вы создаете экземпляры объектов из раскадровки. - person riadhluke; 13.04.2019
comment
хорошо.. они могли бы установить нули, если ограничения использовались для представления, и эти константы вместо нулей, если ограничения не использовались (когда они одинаковы в viewDidLoad, viewWillApear, viewDidAppear и viewDidLayout) - person user924; 13.04.2019