Как я могу сделать пользовательское действие блокировки ориентации?

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

Для начала у меня есть этот метод:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
return YES;
 }

И тогда я подумал, что смогу справиться с фактической блокировкой в ​​методе действия, например так:

- (IBAction) screenLock:(id)sender{

if([UIDevice currentDevice].orientation == UIDeviceOrientationPortrait){

    [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationPortrait];

}else{

            [[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

}

  }

Но, увы, этот код не будет господствовать над первым, который заставляет представление вращаться...

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

Мысли? Спасибо!!

1 ответ

Решение

shouldAutorotateToInterfaceOrientation упрощает иерархию представлений, поэтому вашу логику необходимо поместить в делегат приложения (или как самый старший ViewController, который может возвращать YES). Поместите свойство BOOL в ваш appDelegate и установите его с помощью кнопки блокировки (например, целевые указатели / делегаты (AppDelegate)), затем в вашем appDelegate сделайте что-то вроде этого:

#define ROTATION_MASTER_ENABLED 1

//Setting MASTER_ROTATION_LOCK_ENABLED to 0 will stop the device rotating
//Landscape UP>landscape DOWN and Portrait UP>Portrait DOWN, 
//This is not generally desired or app store safe, default = 1

-(BOOL)compareOrientation:(UIInterfaceOrientation)interfaceOrientation
{

    UIInterfaceOrientation actual = [[UIDevice currentDevice] orientation]; 
    if(UIInterfaceOrientationIsLandscape(interfaceOrientation) && UIInterfaceOrientationIsLandscape(actual))return YES; 
    else if(UIInterfaceOrientationIsPortrait(interfaceOrientation)&& UIInterfaceOrientationIsPortrait(actual))return YES;
    else return NO;   

}


- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{   
    if(!MASTER_ROTATION_LOCK_ENABLED)return NO;
    else if(self.rotationEnabled || [self compareOrientation:interfaceOrientation])return YES;
    return NO;//self.rotationEnabled is a BOOL
}
Другие вопросы по тегам