2015-05-21 3 views
1

У меня есть пользовательская настройка в моем приложении, которая должна устанавливать ориентацию определенных контроллеров представления как в альбомной, так и в портретной ориентации. Пользователь нажимает кнопку на главном экране, чтобы переключать пейзаж/портрет для других контроллеров представления в приложении, установив глобальную переменную, которая должна считываться другими контроллерами.Ограничение ориентации на UIViewController для определенных контроллеров представления в Swift

я продлил UINavigationController следующим образом:

extension UINavigationController { 
    public override func supportedInterfaceOrientations() -> Int { 
    return visibleViewController.supportedInterfaceOrientations() 
    } 
} 

Я также попытался изменить visibleViewController к topViewController не повезло.

Во всех моих UIViewController файлов, которые я затем переопределить функцию:

override func supportedInterfaceOrientations() -> Int { 
    return appOrientation // global user setting 
} 

Проблема заключается в том, что единственный контроллер представления, что когда-либо получает эту функцию с именем является основным контроллером вид (первый вид пользователь видит и где пользователь может выбрать ориентацию). Почему эта функция не вызвана в контроллерах с последующим нажатием?

Глобальная переменная appOrientation устанавливается в одно из следующих действий, когда пользователь переключает его:

let orientationPortrait = Int(UIInterfaceOrientationMask.Portrait.rawValue | UIInterfaceOrientationMask.PortraitUpsideDown.rawValue) 
let orientationLandscape = Int(UIInterfaceOrientationMask.Landscape.rawValue) 

Если я вернуть один из этих определяет в функции supportedInterfaceOrientation главного контроллера представления, весь приложение ориентировано на определите (не то, что я хочу).

Должно быть, что-то здесь отсутствует.

+0

Вы ничего не пропустили. То, что вы пытаетесь сделать, просто не поддерживается, и не было такого, как iOS 5. – matt

+0

@matt Это немного разочаровывает. Знаете ли вы какие-либо возможные обходные пути, которые могут сделать что-то похожее на то, что я хочу? Благодаря! –

+0

Используйте представленный контроллер представления. Вы всегда можете контролировать ориентацию представленного контроллера представления. – matt

ответ

1

Думаю, у меня есть решение для вас. Я не знаю, получил ли я полное понимание вопроса, но я установил кнопку на главном экране (это будет симулировать вашу страницу настроек). Я сделал переменную, называемую нажатием, когда нажата кнопка, 1 добавлен к прессам , когда кнопка была нажата снова, 1 вычитали из прессов. (Я также изменил название кнопки, когда она нажата, потому что я такой OCD).

Затем на следующем представлении я сделал оператор if в функции viewwillappear. Я спросил, равен ли прессу один, задайте ориентацию ландшафта, а если нажимают равным 2, установите ориентацию на портрет. Я добавил навигационную панель, чтобы вы могли идти туда и обратно, пытаясь обе ориентации. Я поставил ориентацию основного вида на портрет, потому что вы задали всю ориентацию устройства, поэтому, если бы вы просто пошли вперед, а новый вид был ландшафтным, тогда, когда вы вернетесь, основной вид будет также ландшафтом.

Во всяком случае я построил быстрый проект для вас, и вот ссылка GitHub для вас: https://github.com/dombryan94/SetOrientationOfOtherViews

Позвольте мне знать, если это то, что вы ищете, я надеюсь, что это помогает!

+0

Спасибо за предложение! Будет ли это препятствовать авторитизации просмотров? По существу, когда вид направлен в эту ориентацию, я не хочу, чтобы он вращался (за исключением того, что это портрет, вращающийся к портретному upsidedown или от пейзажа слева до пейзажа справа). Кроме того, я думаю, что я где-то читал, чтобы не использовать setValue (value, forKey: "orientation"), потому что это частный API или что-то в этом роде. Будет ли это проблемой? Я буду тестировать этот код завтра в своем приложении. –

+0

Привет, Эван, я буду настаивать на проекте github. Вы должны установить поддерживаемую функциюInterfaceOrientation и сообщить контроллеру представления, какие ориентации он может быть включен. Следует иметь в виду, что автоматическое вращение должно быть включено (что по умолчанию). Я включу функцию автоматического поворота в коде , Если автоматическое вращение не включено, представления не будут ориентироваться вообще, программно или иначе. –

+0

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

Смежные вопросы