1

Я создаю полноэкранную галерею изображений, используя UICollectionView. Когда пользователь поворачивает устройство, я выполнять обновления в пределах UICollectionViewSwift viewWillTransition не называется

func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator)

я представить эту UIViewController модален и имею UICollectionView занимает весь экран. В viewDidLoad, я создаю макет потока как:

let flowLayout = UICollectionViewFlowLayout() 
flowLayout.scrollDirection = .horizontal 
flowLayout.minimumInteritemSpacing = 0 
flowLayout.minimumLineSpacing = 0 
photosCollectionView.isPagingEnabled = true 
photosCollectionView.setCollectionViewLayout(flowLayout, animated: true) 

Я также имеют размер, как:

func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 
    return photosCollectionView.frame.size 
} 

Когда я повернуть мое устройство, viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) никогда не называется, что заставляет UICollectionViewLayout не обновлять. В то время как я повернуть устройство, я не делаю получаю сообщение:

The behavior of the UICollectionViewFlowLayout is not defined because: the item height must be less than the height of the UICollectionView minus the section insets top and bottom values, minus the content insets top and bottom values. 

Я прочитал в Интернете, что я могу добавить:

self.automaticallyAdjustsScrollViewInsets = false 

к UIViewController, но это уже не влияет. На вкладке UICollectionView нет вложений содержимого или раздела.

У меня также есть super.viewWillTransition, вызываемый внутри функции. Может ли кто-нибудь помочь мне в том, что может вызвать эту проблему?

+0

Сообщение об ошибке говорит о «высоте элемента».Я не вижу, чтобы ваш код определял это. Не могли бы вы показать его? – matt

+0

Когда я устанавливаю размер, это высота и ширина. Я установил 'sizeForItem' в' IndexPath' = 'photosCollectionView.frame.size'. –

+0

Хорошо, но если вы скажете, что в неподходящее время, я могу представить, что вы можете получить размер, где одно или оба измерения больше, чем в конечном итоге становится просмотр коллекции. – matt

ответ

2

Если вы только забота о макете, когда устройство вращается, то, пожалуйста, используйте:

override func viewDidLayoutSubviews() { 
    super.viewDidLayoutSubviews() 

    collectionView.collectionViewLayout.invalidateLayout() 
    collectionView.layoutIfNeeded() 
} 

От яблока документы:

public func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) 

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

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

работы вокруг будет также зарегистрироваться для вращения устройства:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    NotificationCenter.default.addObserver(self, selector: #selector(deviceOrientationDidChange), name: NSNotification.Name.UIDeviceOrientationDidChange, object: nil) 
} 

override func viewWillDisappear(_ animated: Bool) { 
    super.viewWillDisappear(animated) 

    NotificationCenter.default.removeObserver(self) 
} 

func deviceOrientationDidChange(_ notification: Notification) { 
    let orientation = UIDevice.current.orientation 
    print(orientation) 
} 
+0

Это возможность, но это не объясняет, почему функция viewWillTransition не вызывается. Заставляет меня задаться вопросом, не настроен ли я неправильно. –

+0

как говорится в документах, он должен быть вызван, если вы не вызвали его на родителя без вызова супер, поэтому вместо того, чтобы идти в ваш код, я бы предложил способ выше – zombie

+0

Я дважды проверил все функции 'super'. Я также тестировал iPad, и по какой-либо причине «viewWillTransition» вызывается без проблем на iPad, а не iPhone. –

0

Это, как я зафиксировано, что:

Перейти к Цели проекта - Общий - информация о развертывании

Orient Tick устройство ations приложение поддерживает

Кроме того, необходимо (изменение UIInterfaceOrientationMask.all по каким-либо уместно):

override var supportedInterfaceOrientations : UIInterfaceOrientationMask { 
    get { 
     return UIInterfaceOrientationMask.all; 
    } 
} 

для ViewController.