Проблема с ориентацией iPad/iPhone

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

Для начала я установил этот код в свой menu.h

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

Строка состояния меняется в зависимости от ориентации, но представления не вращаются и не изменяются в размере. Чтобы попытаться сузить мою проблему, я решил попробовать переключить два вида в одном .xib на основе ориентации.

    - (void)viewDidLoad {
    [super viewDidLoad];

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil];
     }
    -(void) orientationChanged:(NSNotification *)object
{
   UIDeviceOrientation deviceOrientation = [[object object] orientation];

    if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
    else 
    {
        self.view = self.portraitView;
    }
}

В симуляторе iOS представление определенно меняется на определенные представления. Однако альбомный вид отображается так, как если бы он был портретным и боковым.

мой альбомный вид в IB введите здесь описание изображения

Мой альбомный вид в симуляторе iOS после изменения ориентации введите здесь описание изображения

Что я здесь делаю неправильно? Я не могу понять это, любая помощь будет принята с благодарностью. Заранее спасибо. ** РЕДАКТИРОВАТЬ: новый код ниже ** Хорошо. Моя проблема в том, что вид правильно загружается в ландшафте, он просто сбоку. Таким образом, ландшафтный вид загружается только сбоку. Мой исправленный код, основанный на @Seega:

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

    [[TTNavigator navigator] setCustomTarget:self];
    [[TTNavigator navigator] setCustomAction:@selector(photoAction)];
}

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
    if (toInterfaceOrientation == UIDeviceOrientationLandscapeLeft || toInterfaceOrientation == UIDeviceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
    else 
    {
        self.view = self.portraitView;
    }
}

-(void) orientationChanged:(NSNotification *)object
{
    UIDeviceOrientation deviceOrientation = [[object object] orientation];

    if (deviceOrientation == UIDeviceOrientationLandscapeLeft || deviceOrientation == UIDeviceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
    else 
    {
        self.view = self.portraitView;
    }
}

person Alex Naspo    schedule 16.04.2012    source источник
comment
удалите весь материал [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil]; и полную функцию -(void) orientationChanged:(NSNotification *)object. Используйте дополнительные UIInterfaceOrientationLandscapeLeft и UIInterfaceOrientationLandscapeRight, чтобы проверить, работает ли функция должным образом, измените цвет в операторе if вместо установки другого UIView.   -  person Seega    schedule 17.04.2012
comment
Не повезло с моей стороны. Я настроил его, как объяснено, и ввел точки останова внутри функции directionChanged, он вообще не вызывается.   -  person Alex Naspo    schedule 17.04.2012
comment
удалить чертову ориентацию Изменено: ВАМ ЭТО НЕ НУЖНО!!!! просто используйте - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { self.view = self.landscapeView; } else { self.view = self.portraitView; } }   -  person Seega    schedule 17.04.2012
comment
Это не работает. Раньше вид хоть менялся, теперь просто не работает.   -  person Alex Naspo    schedule 17.04.2012


Ответы (5)


Я бы посоветовал вставить ваш код:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

вместо создания нового метода. Это будет вызвано автоматически, если метод shouldAutorotateToInterfaceOrientation возвращает YES для этого поворота.

Также существует разница между UIDeviceOrientation и UIInterfaceOrientation, поэтому убедитесь, что вы ссылаетесь на правильный. Ваш существующий код будет изменен на следующее:

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
{
    self.view = self.landscapeView;
}
else 
{
    self.view = self.portraitView;
}

Также вы можете использовать макрос для проверки ориентации интерфейса, чтобы ваш код был чище.

if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) 
{
    self.view = self.landscapeView;
}
else 
{
    self.view = self.portraitView;
}
person RachelD    schedule 16.04.2012
comment
Должен ли я использовать UIDeviceOrientation или UIInterfaceOrientation? - person Shamoon; 16.04.2012
comment
Вы должны использовать UIInterfaceOrientation, потому что, если ваше приложение работает только в портретном режиме (например), и пользователь поворачивает свое устройство в альбомную ориентацию, теперь приложение по-прежнему выглядит как портретное и просто удерживается сбоку, когда вы проверяете UIDeviceOrientation, это будет в альбомной ориентации, потому что устройство повернуто, но когда вы проверяете UIInterfaceOrientation, оно будет читаться как портрет, потому что само приложение не поворачивалось. Имеет ли это смысл? Также подробнее - › stackoverflow.com/questions/6838706/iphone-screen-rotation< /а> - person RachelD; 16.04.2012
comment
Это имеет смысл, спасибо. Однако как настроить приложение для вращения вместе с устройством? - person Alex Naspo; 16.04.2012
comment
Хороший вопрос. я тоже не могу понять - person Shamoon; 16.04.2012
comment
Чтобы настроить ротацию приложения, вам необходимо (1) выбрать «Поддерживаемые ориентации устройств» на вкладке «Сводка» вашего приложения (см. изображение, опубликованное Гопалом Наиром на этой странице) и (2) вам нужно вернуть ДА; в методе -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation для любых ориентаций, которые вы хотите поддерживать для этого ViewController (Примечание: каждый контроллер представления может поддерживать разные ориентации устройства). - person RachelD; 16.04.2012
comment
Я сделал это и дважды проверил оба. Есть ли какие-либо другие возможные проблемы, которые могут помешать вращению приложения на моем устройстве? - person Alex Naspo; 16.04.2012
comment
Глядя на ваши снимки экрана, я вижу, что устройство вращается, потому что панель навигации вращается. Я думаю, что ваша проблема связана с настройкой представлений. (1) Поместите точку останова внутри вашего оператора if, чтобы увидеть, что происходит (if или else). (2) Где вы устанавливаете переменные landscapeView и PortraitView? Вы уверены, что там действительно устанавливается? (3) Где вы устанавливаете начальный вид контроллера представления? - person RachelD; 17.04.2012
comment
#import <UIKit/UIKit.h> #import <Three20/Three20.h> @interface IconsViewController : UIViewController <TTURLRequestDelegate, TTPostControllerDelegate, UIActionSheetDelegate,UIAlertViewDelegate> { IBOutlet UIView *portraitView; IBOutlet UIView *landscapeView; UIDeviceOrientation orientation; } @property (nonatomic, retain) IBOutlet UIView *portraitView; @property (nonatomic, retain) IBOutlet UIView *landscapeView; Исходный вид также установлен на портретный вид - person Alex Naspo; 17.04.2012

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

введите здесь описание изображения

person Gopal Nair    schedule 16.04.2012
comment
Да, выбраны все поля Поддерживаемая ориентация устройства. - person Alex Naspo; 16.04.2012

Вам лучше просто использовать

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
 if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
        self.view = self.landscapeView;
    }
    else 
    {
        self.view = self.portraitView;
    }
}

чтобы обрабатывать повороты вместо создания собственного.
И теперь вы можете удалить все уведомления.

person Seega    schedule 16.04.2012
comment
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(orientationChanged:) name:@"UIDeviceOrientationDidChangeNotification" object:nil]; } Это то, что вы имели в виду? Это не работает для меня. Спасибо за помощь - person Alex Naspo; 16.04.2012
comment
Проблема с приведенным выше кодом заключается в том, что UIDeviceOrientation и UIInterfaceOrientation различны, поэтому вы проверяете, является ли toInterfaceOrientation == UIDeviceOrientation, и они никогда не будут. Вот дополнительная информация о разнице - stackoverflow.com/questions/6838706/iphone-screen- ротация - person RachelD; 16.04.2012
comment
Это суперпростая опечатка, которая не вызывает никаких предупреждений/ошибок, так что она еще хитрее. - person RachelD; 16.04.2012
comment
никогда не было его раньше, поэтому не думал об этом. Но теперь есть ваша проблема ;) - person Seega; 17.04.2012

Идея!!!

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

Чтобы проверить это:

  • Откройте свой .xib в Интерфейсном Разработчике.
  • Нажмите на «вид» под объектами, чтобы выбрать весь вид.
  • Посмотрите в разделе «Смоделированные показатели» в правой части IB. Убедитесь, что в раскрывающемся списке «Ориентация» выбран «Пейзаж».

Если в вашем представлении указано «Портрет» для представления, которое вы хотите представить в своем ландшафтном представлении, возможно, xcode поворачивает ваш альбомный вид в портретный и возится с вашей презентацией.

Дайте мне знать, если это помогло.

person RachelD    schedule 16.04.2012
comment
Еще раз спасибо за вашу постоянную помощь, это очень ценится. Для портретного вида установлено значение portait, а для ландшафтного представления — ландшафтное. - person Alex Naspo; 17.04.2012
comment
Черт, я думал, что у меня что-то есть. - person RachelD; 17.04.2012

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

  1. Временно отключил нашу рекламу

  2. полностью удалил второй вид и пошел с исходной ориентацией и изменением размера

  3. добавил это почти в каждый файл .m.

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

    }

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

    -(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    {
         if (interfaceOrientation == UIDeviceOrientationLandscapeLeft || interfaceOrientation == UIDeviceOrientationLandscapeRight)
         {
              if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPhone) 
              {         
                   self.Button.frame = CGRectMake(27,96,86,86);
                   self.Label.frame  = CGRectMake(27,162,86,21);
              }
             else 
             {
                   self.Button.frame = CGRectMake(18,100,86,86);
                   self.Label.frame  = CGRectMake(18,164,86,21);
              }
         }
     } 
    

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

person Alex Naspo    schedule 28.04.2012