2012-04-16 2 views
0

Я понимаю, что есть много вопросов, связанных с этой проблемой, однако я не нашел того, что решает мою проблему.Проблема с ориентацией на 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 enter image description here

мой взгляд пейзаж в тренажере IOS после изменения ориентации enter image description here

Что я здесь делаю неправильно? Я не могу понять, любая помощь будет очень признательна. Заранее спасибо. ** EDIT: Новый код ниже ** Хорошо. Моя проблема в том, что представление правильно загружается в ландшафт, оно просто боком. Таким образом, пейзаж пейзаж загружается, только боком. Мой пересмотренный код, основанный на @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; 
    } 
} 
+0

удалить все '[[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (orientationChanged :) name: @ "UIDeviceOrientationDidChangeNotification" object: nil]; 'stuff и полная функция' - (void) orientationChanged: (NSNotification *) object'. Использование UIInterfaceOrientationLandscapeLeft и UIInterfaceOrientationLandscapeRight Дополнительная информация, чтобы проверить, работает ли функция, как ожидается, изменить цвет в инструкции if вместо установки другого UIView. – Seega

+0

Не повезло на моем конце. Я установил его, как объяснил, и ввел точки останова в функции orientationChanged, он не называется вообще. –

+0

Удалите проклятую ориентацию. Изменено: ВАМ НЕ НУЖНО ЭТО !!!! просто использовать '- (недействительными) willRotateToInterfaceOrientation: (UIInterfaceOrientation) Продолжительность toInterfaceOrientation: (NSTimeInterval) Продолжительность { , если (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft || toInterfaceOrientation == UIInterfaceOrientationLandscapeRight) { self.view = self.landscapeView; } прочее { self.view = self.portraitView; } } ' – Seega

ответ

0

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

  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.

1

Вы должны лучше просто использовать

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

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

+0

'- (void) willRotateToInterfaceOrientation: (UIInterfaceOrientation) toInterfaceOrentation duration: (NSTimeInterval) duration { [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector (orientationChanged :) name: @ "UIDeviceOrientationDidChangeNotification" object: nil]; } 'Это то, что вы имели в виду? Это не работает для меня. Спасибо за помощь –

+0

Проблема с приведенным выше кодом заключается в том, что UIDeviceOrientation и UIInterfaceOrientation отличаются друг от друга, поэтому вы проверяете, является ли toInterfaceOrientation == UIDeviceOrientation, и они никогда не будут. Heres больше информации о различии - http://stackoverflow.com/questions/6838706/iphone-screen-rotation – RachelC

+0

вы абсолютно правы, не узнали, что – Seega

1

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

enter image description here

+0

Да, выбрано поле «Поддерживаемые устройства». –

4

Я хотел бы предложить поставить свой код в:

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

вместо того, чтобы новый метод. Это будет вызвано автоматически, если метод toAutorotateToInterfaceOrientation возвращает 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; 
} 
+0

Должен ли я использовать 'UIDeviceOrientation' или' UIInterfaceOrientation'? – Shamoon

+0

Вы должны использовать UIInterfaceOrientation, потому что, если ваше приложение работает только в портрете (например), и пользователь поворачивает свое устройство в альбомное, теперь приложение по-прежнему выглядит как его портрет и просто удерживается боковыми способами, когда вы проверяете UIDeviceOrientation, он будет быть в ландшафте, потому что устройство повернуто, но когда вы проверяете UIInterfaceOrientation, он будет считать «Портрет», потому что само приложение не вращается. Имеет ли это смысл? Также более подробно -> http://stackoverflow.com/questions/6838706/iphone-screen-rotation – RachelC

+1

Это имеет смысл, спасибо. Однако как настроить приложение для поворота с помощью устройства? –

1

Идея !!!

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

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

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

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

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

+0

Еще раз спасибо за вашу помощь-константа, это очень ценится. PortraitView настроен на portait, а LandscapeView - на альбомный. –

+0

Darn Я думал, что у меня что-то есть. – RachelC

Смежные вопросы