Ориентация: портрет и пейзаж в Xcode 4.2 - PullRequest
0 голосов
/ 31 октября 2011

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

Warning

это код:

#import "OrientationTutorialViewController.h"

@implementation OrientationTutorialViewController

@synthesize portraitView, landscapeView;


- (void)viewDidLoad 
{
    [super viewDidLoad];

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];

}

- (void) orientationChanged:(id)object
{  
    UIInterfaceOrientation interfaceOrientation = [[object object] orientation];

    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) 
    {
        self.view = self.portraitView;
    } 
    else 
    {
        self.view = self.landscapeView;
    }
}

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



- (void)dealloc 
{
    [super dealloc];
}

@end

Есть ли способ исправить это предупреждение?

Ответы [ 3 ]

3 голосов
/ 01 ноября 2011

Полагаю, вы скопировали этот код из этого урока . Это показывает опасность простого копирования и вставки кода из случайного человека в Интернете.

Есть несколько проблем с этим кодом. Во-первых, есть проблема, которую вы описываете здесь, когда уведомление UIDeviceOrientationDidChangeNotification передает UIDevice, чей метод -orientation возвращает перечисление UIDeviceOrientation. По какой-то причине автор этого кода присваивает это значение перечислению UIInterfaceOrientation, а не рассматривает его как значение UIDeviceOrientation. Это можно исправить, используя соответствующий тип перечисления и сравнивая с этими значениями.

Во-вторых, почему они используют уведомление об изменении ориентации, когда они так же легко могут использовать метод делегата UIViewController -didRotateFromInterfaceOrientation:? Это действительно перечисление UIInterfaceOrientation. Я рекомендую заменить уведомление и метод ответчика выше на -didRotateFromInterfaceOrientation:. О том, как это сделать, можно узнать во многих примерах Apple по поводу авторотации контроллера представления, а также об их документации.

В-третьих, если они собираются, чтобы метод отвечал на уведомление, как в -orientationChanged: выше, он должен принимать объект NSNotification, а не просто общий идентификатор.

0 голосов
/ 18 июня 2012

Я перепробовал очень много таких альтернатив, а потом обнаружил, что вы также должны обязательно изменить переменную Initial interface orientation на то, что вы хотите в дополнение к добавлению

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{

return (self.interfaceOrientation == UIInterfaceOrientationLandscapeRight);  
}

где-нибудь в вашем файле реализации. Вначале работал только фрагмент, но при добавлении новых представлений и контроллеров все запуталось, пока я не изменил .plist.

0 голосов
/ 02 ноября 2011

проверить этот пост , это хорошо объясняет.

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

deviceOrientation = (UIDeviceOrientation)[UIApplication sharedApplication].statusBarOrientation;
...