Не удается отследить изменения ориентации с «перевернутого» на ландшафты на iOS - PullRequest
0 голосов
/ 28 мая 2019

Мне нужно сделать недействительным макет представления моей коллекции при изменении ориентации экрана Так как iPhone X и другие имеют вставки безопасной зоны; Мне нужно, чтобы мои подвиды ячеек располагались в соответствии со вставками в безопасных зонах экрана.

При переключении между лево-правым пейзажем из портрета проблем не возникает. Но если вы переключаетесь с перевернутого положения, я не могу уловить изменение ориентации и автоматически не могу

Я попробовал два существующих подхода.

Сначала используется NotificationCenter. Вторая переопределяет viewWillTransitionToSize:withTransitionCoordinator: функция. Это все то же самое.

в CollectionViewController:

    NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: nil) { (notif) in
      self.collectionViewLayout.invalidateLayout()
    }

в ячейке:

  override func layoutSubviews() {
    super.layoutSubviews()

    let orientation = UIDevice.current.orientation
    if let insets = UIApplication.shared.keyWindow?.safeAreaInsets {
      if orientation == .landscapeLeft {
        titleLabelLeadingConstraint.constant = insets.left + 20
        titleLabelTrailingConstraint.constant = 20
      } else if orientation == .landscapeRight {
        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = insets.right + 20
      } else {
        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = 20
      }
    }

    print("orin: \(orientation.rawValue) | left: \(titleLabelLeadingConstraint.constant) | right: \(titleLabelTrailingConstraint.constant)")

  }

Функция print() не вызывается при переключении с / на вверх. Но функция collectionviewlayout s invalidateLayout() вызывается.

Ответы [ 2 ]

0 голосов
/ 28 мая 2019

OK. Наконец-то я придумал то, чего не хотел делать. Наблюдаемые изменения ориентации от самих клеток.


 override func awakeFromNib() {
    super.awakeFromNib()

    NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: nil) { (notif ) in
      // doing my things already stated in the question's itself.
    }
  }

Теперь они могут наблюдать за всеми изменениями. Но я не знаю, мудро ли это регистрировать; несмотря на то, что представление коллекции повторно использует ячейки, а в моем случае на экране отображается не более 7-8 ячеек.

0 голосов
/ 28 мая 2019

Как вы уже попробовали, вы можете обнаружить изменение ориентации, используя viewWillTransitionToSize:withTransitionCoordinator:.

Я не знаю вашу первую попытку, однако, попробуйте это:

      override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
         //If you need to invalidate your collectionView layout, do it in this function
         super.viewWillTransition(to: size, with: coordinator)
         if UIDevice.current.orientation.isLandscape {
          //
         } else {
           //
         }
      }

Если вам нужно узнать разницу между landscapeLeft или Right, попробуйте свой код следующим образом:

      override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
         //If you need to invalidate your collectionView layout, do it in this function
    super.viewWillTransition(to: size, with: coordinator)

     if let insets = UIApplication.shared.keyWindow?.safeAreaInsets {
        if UIDevice.current.orientation == .landscapeLeft {

        titleLabelLeadingConstraint.constant = insets.left + 20
        titleLabelTrailingConstraint.constant = 20

      } else if UIDevice.current.orientation == .landscapeRight {

        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = insets.right + 20

      } else {

        titleLabelLeadingConstraint.constant = 20
        titleLabelTrailingConstraint.constant = 20

      }
    }
  }

ПРИМЕЧАНИЕ: Вам не нужно регистрировать наблюдателя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...