Как отключить определенную ориентацию в iOS

Я хочу отключить альбомную ориентацию в каком-то виде.

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

- (NSUInteger) supportedInterfaceOrientations {
    return UIInterfaceOrientationMaskPortrait;
}

- (UIInterfaceOrientation) preferredInterfaceOrientationForPresentation {
    return UIInterfaceOrientationPortrait;
}

Я что-то упускаю? Пожалуйста помогите.


person Mrugesh Tank    schedule 21.04.2015    source источник
comment
попробуйте это:   -  person Dheeraj Singh    schedule 21.04.2015
comment
Вы можете сделать это через конструктор интерфейсов.   -  person Ashok Londhe    schedule 21.04.2015
comment
@DheerajSingh, это мешает. Как я хочу. Но что, если я хочу поддерживать альбомную ориентацию в некоторых push-контроллерах?   -  person Mrugesh Tank    schedule 21.04.2015
comment
@AshokLondhe Я упоминаю об этом, я хочу предотвратить только некоторые виды. Через построитель интерфейса я могу либо отключить для всех, либо включить для или.   -  person Mrugesh Tank    schedule 21.04.2015
comment
Существует разная ориентация для каждого контроллера представления. Вы можете это сделать в конструкторе интерфейсов. Существует свойство Orientation каждого ViewController, и вы можете установить его вручную.   -  person Ashok Londhe    schedule 21.04.2015
comment
@AshokLondhe, можешь показать? Как я могу установить для каждого контроллера представления? Я использую файл .xib   -  person Mrugesh Tank    schedule 21.04.2015
comment
На самом деле мы можем установить его для каждого контроллера представления. но я не знаю работает он или нет.   -  person Ashok Londhe    schedule 21.04.2015


Ответы (3)


Создайте подкласс UINavigationController и переопределите эти методы, как показано ниже:

- (NSUInteger)supportedInterfaceOrientations
{
    if([self.topViewController respondsToSelector:@selector(supportedInterfaceOrientationsForThisContorller)])
    {
        return(NSInteger)[self.topViewController performSelector:@selector(supportedInterfaceOrientationsForThisContorller) withObject:nil];
    }
    return UIInterfaceOrientationPortrait | UIInterfaceOrientationLandscapeLeft | UIInterfaceOrientationLandscapeRight;
}

- (BOOL)shouldAutorotate
{
    if([self.visibleViewController respondsToSelector:@selector(shouldAutorotateNow)])
    {
        BOOL autoRotate = (BOOL)[self.visibleViewController
performSelector:@selector(shouldAutorotateNow)
                                 withObject:nil];
        return autoRotate;
    }
    return YES;
}

-(UIInterfaceOrientation)preferredInterfaceOrientationForPresentation
{
    return UIInterfaceOrientationPortrait;
}

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

- (NSUInteger) supportedInterfaceOrientationsForThisContorller {
    // Return a bitmask of supported orientations. If you need more,
    // use bitwise or (see the commented return).
    return UIInterfaceOrientationMaskPortrait;
    // return UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

-(BOOL)shouldAutorotateNow
{
    return YES;
}
person kiturk3    schedule 25.04.2015

Ознакомьтесь с этим ответом. Парень, вероятно, объяснил делегатам очень подробно.

Также попробуйте,

- (void)awakeFromNib
{
    isShowingLandscapeView = NO;
    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                 selector:@selector(orientationChanged:)
                                 name:UIDeviceOrientationDidChangeNotification
                                 object:nil];
}

- (void)orientationChanged:(NSNotification *)notification
{
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    if (UIDeviceOrientationIsLandscape(deviceOrientation) &&
        !isShowingLandscapeView)
    {
        [self performSegueWithIdentifier:@"DisplayAlternateView" sender:self];
        isShowingLandscapeView = YES;
    }
    else if (UIDeviceOrientationIsPortrait(deviceOrientation) &&
             isShowingLandscapeView)
    {
        [self dismissViewControllerAnimated:YES completion:nil];
        isShowingLandscapeView = NO;
    }
}
person Kaey    schedule 21.04.2015
comment
Этот метод устарел в iOS 6. Поэтому я не могу использовать этот метод. - person Mrugesh Tank; 21.04.2015
comment
Этот метод не вызывается во время изменения ориентации. - person Mrugesh Tank; 21.04.2015
comment
Да, я использую уведомления для изменения ориентации. Хотя, что я могу определить ориентацию. Но как я могу предотвратить?? - person Mrugesh Tank; 21.04.2015

Использовали ли вы метод ниже в своем коде, без этого supportInterfaceOrientations не будет вызываться

-(BOOL) долженАвтоповорот {

return YES; 

}

person Nikhil.T    schedule 21.04.2015
comment
Да, это написано мной - person Mrugesh Tank; 21.04.2015
comment
Хорошо, если вы используете Nav Controller, это должно работать, иначе, если это внутри подвида, только root получит вызов этого метода. Также проверьте правильность установки поддержки ориентации в информационном списке. - person Nikhil.T; 21.04.2015