Это более или менее моя Main.storyboard
ситуация:Swift: правильно ли назначить пользовательский класс для всех UINavigationControllers?
, где у меня есть корень UITabBarController
с 5 вариантов possibile. Затем, я хочу, чтобы некоторые UIViewController
s могли поворачиваться к пейзажу, в то время как я хочу также некоторые другие UIViewController
s, чтобы иметь только ландшафтный режим. Поэтому я написал эту file.swift:
class CustomNavigationController: UINavigationController, UINavigationControllerDelegate {
override func shouldAutorotate() -> Bool {
if (self.topViewController?.isKindOfClass(HomeViewController) != nil) {return false}
else if (self.topViewController?.isKindOfClass(ServicesViewController) != nil) {return false}
else if (self.topViewController?.isKindOfClass(PhotoGalleryViewController) != nil) {return false}
else if (self.topViewController?.isKindOfClass(SelectMapViewController) != nil) {return false}
else if (self.topViewController?.isKindOfClass(MapViewController) != nil) {return false}
else {return true}
}
}
class CustomTabBarController: UITabBarController, UITabBarControllerDelegate {
override func shouldAutorotate() -> Bool {
return (self.selectedViewController as! UINavigationController).shouldAutorotate()
}
}
и я передал все UINavigationController
S тот же класс CustomNavigationController
в то время как я назначен CustomTabBarController
класс UITabBarController
. В результате контроллер просмотра не вращается. Это потому, что я назначил для них один и тот же класс? Должен ли я создать собственный класс контроллера навигации для каждого UINavigationController
У меня есть?
UPDATE
Частичное решение, которое я нашел, даже если это немного запутанным, состоит в следующем. Я изменил предыдущий файл так:
class CustomNavigationController: UINavigationController, UINavigationControllerDelegate {
override func shouldAutorotate() -> Bool {
return (self.topViewController?.shouldAutorotate())!
}
}
класс CustomTabBarController: UITabBarController, UITabBarControllerDelegate { переопределения Func shouldAutorotate() -> Bool { возвращение (self.selectedViewController в UINavigationController!) .shouldAutorotate() } }
Затем, в контроллерах зрения, когда вращение разрешено я просто:
override func shouldAutorotate() -> Bool {
return true
}
, а в контроллерах зрения, где вращение не допускается у меня есть:
override func shouldAutorotate() -> Bool {
return false
}
override func viewWillAppear(animated: Bool) {
let value = UIInterfaceOrientation.Portrait.rawValue
UIDevice.currentDevice().setValue(value, forKey: "orientation")
}
Во всяком случае, есть небольшая проблема, так как анимация, которая устанавливает режим портрета не правильное значение, что ширина экрана не регулируется. если я перехожу от контроллера ландшафтного вида к диспетчеру только для портрета, тогда рамка контроллера просмотра неверна. Я получаю
вместо этого:
Спасибо за ваше предложение, но я боюсь, что это не работает ... все они вращаются без исключения :( –
@LoryLory жаль, что я отредактировал свой ответ.Предыдущий работал только с представленным контроллером. Это должно работать. Кроме того, он будет работать даже без CustomNavigationController. Попробуйте это;) –
ОК, это работает, но теперь у меня есть проблема, описанная в моем обновлении вопроса: если я перехожу из контроллера ландшафтного представления к диспетчеру только для портрета, тогда рамка контроллера представления не верна. Сними новые изображения. –