Сохранение элементов управления в ландшафтном режиме, но разрешение переключения uitabbar

У меня есть UITabBar, переключающий места, когда iphone меняет ориентацию, и это работает нормально, но я хочу, чтобы элементы управления в представлении первой вкладки оставались статичными независимо от положения телефона. Я чувствую, что упускаю что-то очевидное?

Редактировать: в основном элементы управления всегда ландшафтные, но панель вкладок должна менять ориентацию. Это возможно?


person irco    schedule 27.04.2011    source источник


Ответы (3)


Для представления, в котором вы не хотите перенастраивать элементы управления, отключите автоматическое изменение размера: [self.view setAutoresizesSubviews:NO];. Это предотвратит реакцию всех элементов управления (подвидов) на изменения ориентации интерфейса, но вкладка по-прежнему будет реагировать. Возможно, вам также придется установить autoresizingMask текущего представления: [self.view setAutoresizingMask:UIViewAutoresizingNone];

Дополнение. Попробуйте выполнить следующие действия для всех элементов управления, которые вы не хотите поворачивать.

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{
   switch (toInterfaceOrientation) {
      case UIInterfaceOrientationLandscapeLeft:
         label.transform = CGAffineTransformMakeRotation(M_PI_2); // 90 degress
         break;
      case UIInterfaceOrientationLandscapeRight:
         label.transform = CGAffineTransformMakeRotation(M_PI + M_PI_2); // 270 degrees
         break;
      case UIInterfaceOrientationPortraitUpsideDown:
         label.transform = CGAffineTransformMakeRotation(M_PI); // 180 degrees
         break;
      default:
         label.transform = CGAffineTransformMakeRotation(0.0);
         break;
   }
}
person Wolfgang Schreurs    schedule 01.05.2011
comment
Я добавляю это в viewDidLoad представления, которое я не хочу переключать, но элементы управления все еще перемещаются... должен ли я сделать это где-то еще? - person irco; 02.05.2011
comment
Странный. Ваше приложение запускается в ландшафтном режиме? - person Wolfgang Schreurs; 02.05.2011
comment
на самом деле это так, если у меня есть ключ поддерживаемой ориентации интерфейса в info.plist, чтобы быть ландшафтным, но даже если я удалю его, и приложение запустит портрет. Элементы управления видом перемещаются - person irco; 02.05.2011
comment
о, чувак, так близко ... когда я поворачиваю его с помощью кнопки «Домой» вправо, фоновое изображение смещается влево и оставляет пустой пробел. На самом деле я заменяю label.transform на self.view.transform. - person irco; 02.05.2011
comment
Вероятно, это backgroundView, возможно, вам также придется предотвратить его вращение (используя self.view.transform = ...;) - person Wolfgang Schreurs; 02.05.2011
comment
Я заменил label.transform на self.view.transform и больше ничего не делаю... и вот две картинки того, что получилось Вот в портрет и вот что происходит в пейзаж (извините за глупое размытие.. я подписал NDA) - person irco; 02.05.2011
comment
Я предполагаю, что вид на заднем плане слишком мал при создании основного вида. Вероятно, вам придется увеличить размер кадра при инициализации. - person Wolfgang Schreurs; 02.05.2011
comment
На самом деле это имеет смысл. У меня есть панель вкладок слева от нее, когда она находится в портретной ориентации, а когда она переходит в альбомную, вкладка перемещается вниз и оставляет зазор. Спасибо за вашу помощь - person irco; 02.05.2011

пример пейзажа

[[UIDevice currentDevice] setOrientation:UIInterfaceOrientationLandscapeRight];

OR

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationLandscape);
}
person Pooja    schedule 27.04.2011
comment
Я понимаю это, и это то, что я делаю, чтобы панель вкладок внизу реагировала на переключение ориентации, но я хочу, чтобы элементы управления в представлении не перемещались, но не панель вкладок - person irco; 28.04.2011
comment
setOrientation - это частный API, и его не следует использовать, он также перестал работать, я думаю, это была IOS 4. - person Grady Player; 07.05.2011

К сожалению, это не совсем просто. Вы не можете заставить UITabBarController реагировать на изменения интерфейса, пока контроллер представления содержимого не отвечает.

Но есть способ сделать это. В контроллере представления содержимого willAnimateRotationToInterfaceOrientation:duration: вы можете применить противоположное вращение (используя свойство transform) к подпредставлениям, которые вы не хотите поворачивать. Например, UIInterfaceOrientationLandscapeLeft — это поворот на 90° по часовой стрелке, поэтому, если вы примените поворот на 90° против часовой стрелки к transform представления, будет казаться, что он не повернулся.

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

person Anomie    schedule 01.05.2011
comment
это мой первый раз, когда я делаю что-то подобное... Я пытаюсь повернуть его, как это CGAffineTransform transform = self.view.transform; преобразование = CGAffineTransformRotate (преобразование, - (M_PI / 2.0)); self.view.transform = преобразование; Но есть изображение bkgnd, которое движется вниз и вправо.. я не знаю, почему - person irco; 02.05.2011
comment
@irco: я вижу, вы разместили фотографии в другом комментарии выше. Похоже, вы не принимаете во внимание тот факт, что область просмотра контента в портретной ориентации, вероятно, составляет что-то вроде 320x416, а в альбомной ориентации, вероятно (после противодействия повороту), что-то вроде 268x480. Кроме того, кстати, вы можете использовать константу M_PI_2 вместо M_PI / 2.0, хотя компилятор, вероятно, сгенерирует идентичный код по модулю возможной неточности в последней цифре. - person Anomie; 02.05.2011