2015-03-29 8 views
0

Теперь я вытаскиваю свои волосы, пытаясь решить то, что, как я думал, будет простой функцией. Я использую Xcode 6.2 для создания приложения iOS 8 для iPad с 3 контроллерами. Моя цель - сразу после запуска приложения, оно блокирует все представления в этой ландшафтной ориентации. Если он закрыт и снова открыт в другой ландшафтной ориентации, все виды используют это. Я получил эту работу с кодом ниже, но мне пришлось добавить контроллер навигации, потому что мне нужна панель навигации, и теперь она всегда вращается. Я нашел некоторую информацию, что это может быть ошибка в iOS8. Предложения, которые я пробовал, не разрешили проблему, так как Object-C, это было интересно, но поскольку это не для быстрой, я теряюсь.Shouldautorotate не вызывается после добавления NavigationBar & NavigationController в Swift

iOS 6 shouldAutorotate: is NOT being called

Есть простой способ для достижения этой цели, заставляя Навигационный контроллер, чтобы остановить вращение? Вот фрагмент, который используется для работы и код блокировки экрана в каждом ВК: -

 // Get orintation of screen if 'true' Home button on RIGHT 
     if (UIDevice.currentDevice().orientation == UIDeviceOrientation.LandscapeLeft) { 
      Oriention_Number = HomeButtonRight 
      Screen_Orient_Vert = -1 
      Screen_Orient_Horiz = 1 
     } else { 
      Oriention_Number = HomeButtonLeft 
      Screen_Orient_Vert = 1 
      Screen_Orient_Horiz = -1 
     } 
     preferences.setInteger(Oriention_Number, forKey: "Oriention_Number_Prefs") 


// Lock Screen 
override func shouldAutorotate() -> Bool { 
    return false 
} 

override func supportedInterfaceOrientations() -> Int { 
    return Oriention_Number // Landscape HomeButtonLeft = 16 HomeButtonRight = 8 
} 
+0

Я обновил Xcode & Swift до 1.2 и добавил исходный код в контроллер корневого представления, и теперь все работает правильно. // Lock Screen override func shouldAutorotate() -> Bool {return false} – Andy

ответ

0

Подкласс UINavigationController:

class LandscapeNC2:UINavigationController { 
    override func supportedInterfaceOrientations() -> Int { 
    var s:UIInterfaceOrientationMask = .LandscapeRight 
    let o:UIDeviceOrientation = UIDevice.currentDevice().orientation 
    if (o == .LandscapeRight) || (o == .PortraitUpsideDown) { s = .LandscapeLeft } 
     return Int(s.rawValue) 
    } 
} 

ли это работа? Я его не тестировал.

Вам необходимо изменить определение UINavigationController как LandscapeNC2. Контроллер, который определяет возможность вращения, является самым корневым из набора контроллеров, которые в настоящее время охватывают весь экран. Если у вас есть UINavigationController, это обычно тот, который определяет вращение.

Вы найдете, что методы supportedInterfaceOrientations VC, управляемые UINavigationController, никогда не вызываются. Это потому, что, когда они находятся на экране, панель вкладок UINavigationController также находится на экране, и это также относится к корню стека VC.

+0

Спасибо за ваш быстрый ответ и предложение, я попробовал сначала, потому что это было быстро. Я добавил класс и код, которые вы предложили корневому навигационному контроллеру (начальный VC), и он работает правильно во всех моих представлениях, но мне нужно найти ориентацию приложения при его запуске, а затем заблокировать его. Я добавил свой код, который получает ориентацию (фрагмент выше), но он уже заблокировал экран, когда ваш код запускается первым. Кроме того, экран запуска не имеет ориентации только на первый основной VC, можно ли их решить, пожалуйста? – Andy

+0

Работает ли отредактированный ответ? – emrys57

+0

Спасибо emrys57, но я должен что-то делать неправильно. Я добавил предлагаемый код & print statement: -println ("s = \ (s.rawValue)") return Int (s.rawValue) Контроллер навигации имеет набор Class LandscapeNC2, но когда его запуск я получаю выходы, показанные ниже , Почему это происходит так много раз и после запуска Main VC? Homebutton Слева: - S = 16 S = 16 S = 16 S = 16 S = 16 Ее запустили 36 (Println в основной VC) S = 8 S = 8 S = 8 с = 8 s = 8 Результат: - Экран обеда и все VC правильные. Homebutton право: - з = 16 s = 16 s = 16 s = 16 s = 16 s = 16 Ее запустили 37 s = 16 s = 16 s = 16 s = 16 s = 16 s = 16 Результат: - Экран обеда OK, но все VC перевернуты. – Andy

1

UINavigationController не передает shouldAutorotate звонки своим детям. Добавить категорию UINavigationController (или подкласс), а также осуществлять следующие действия:

- (BOOL)shouldAutorotate 
{ 
    return [self.topViewController shouldAutorotate]; 
} 

Это будет использовать существующую shouldAutorotate логику.

+0

Спасибо за предложение, но я новичок в быстром, поэтому не могли бы вы объяснить, какой быстрый код я должен добавить и где. – Andy

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