2013-08-26 1 views
5

Я реализую программный замок вращения в своем приложении, подобный тому, который был найден в приложении Kindle от Amazon: когда устройство повернуто, отображается кнопка блокировки; нажмите кнопку, и ориентация будет заблокирована для ориентации, в которой находился интерфейс, когда была нажата кнопка.Force iOS ViewController для поворота на ориентацию устройства после разблокировки программной блокировки вращения

После разблокировки я хотел бы, чтобы интерфейс вращался в соответствии с текущей ориентацией устройства. Предположим, вы заблокировали поворот в портрете, поверните устройство влево, а затем откройте; Я бы хотел, чтобы интерфейс затем вращался влево. Вот метод, который переключает блокировку:

- (IBAction)toggleRotationLock:(UIButton *)sender { 
BOOL rotationLocked = [_defaults boolForKey:@"RotationLocked"]; 
if (rotationLocked) { //unlock rotation 
    [_defaults setBool:NO forKey:@"RotationLocked"]; 
    /* force rotation to current device orientation here? 
    * ... 
    */ 
} else { //lock rotation to current orientation 
    [_defaults setBool:YES forKey:@"RotationLocked"]; 
    [_defaults setInteger:self.interfaceOrientation forKey:@"RotationOrientation"]; 
} 
    [_defaults synchronize]; 
    [self setupRotationLockButton]; 
} 

Любой способ сделать это?

ответ

2

Ключ 1) сохранение текущей ориентации пользователя по умолчанию точно так же, как вы делаете 2) все остальное, что вам нужно сделать, это переопределенные методы контроллеров вида, которые вы хотите заблокировать (для ios 6+ , supportedInterfaceOrientations). Используйте сохраненные пользовательские значения по умолчанию, чтобы вернуть то, что вы разрешаете, исходя из того, заблокировано или нет.

Затем позвоните attemptRotationToDeviceOrientation Чтобы сообщить контроллерам своего вида о необходимости повторить их методы и переоценить, какое вращение им должно быть задано при текущем вращении устройств.

+0

Спасибо, попробуйтеRotationToDeviceOrientation делает трюк! – dysfunction

0

Вот как я могу заставить его работать, на всякий случай, если кто-то, кто приходит сюда, хочет посмотреть на код. :)

-(IBAction)lockOrientation:(UIButton*)sender 
{ 
if (orientationLocked) { //Unlock it, "orientationLocked" is a boolean defined in .h 
    orientationLocked = NO; 
    [sender setTitle:@"Unlocked" forState:UIControlStateNormal]; 
} 
else 
{ // Lock it. 

    //Save the orientation value to NSDefaults, can just be int if you prefer. 
    // "defaults" is a NSUserDefaults also defined in .h 

    [defaults setInteger:[[UIApplication sharedApplication] statusBarOrientation] forKey:@"orientation"]; 
    orientationLocked = YES; 
    [sender setTitle:@"Locked" forState:UIControlStateNormal]; 
} 
} 

- (NSUInteger)supportedInterfaceOrientations{ 
if (orientationLocked) { 

    return = [defaults integerForKey:@"orientation"]; 
} 
return UIInterfaceOrientationMaskAllButUpsideDown; 
} 
+0

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