iPad SDK, как справиться с ориентацией с помощью UIImageView - PullRequest
6 голосов
/ 24 сентября 2010

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

У этого UIImageView есть фоновое изображение, которое я установил в InterfaceBuilder. Когда я меняю ориентацию на альбомную, изображение обрезается.

Я бы хотел, чтобы UIImageView установил image-Portrait.png, когда ipad находится в портретном режиме, и image-landscape.png, когда он находится в ландшафтном режиме.

Спасибо за вашу помощь и советы!

Скриншоты:

alt text alt text

Ответы [ 6 ]

7 голосов
/ 24 сентября 2010

Я нашел решение:

В Интерфейсном Разработчике я установил авторазмер моего ImageView для автоматического заполнения экрана. В моем ViewController я добавляю метод обнаружения изменения ориентации и задаю подходящее изображение в зависимости от того, находится iPad в книжной или альбомной ориентации:

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
if((self.interfaceOrientation == UIDeviceOrientationLandscapeLeft) || (self.interfaceOrientation == UIDeviceOrientationLandscapeRight)){
    myImageView.image = [UIImage imageNamed:@"image-landscape.png"];
} else  if((self.interfaceOrientation == UIDeviceOrientationPortrait) || (self.interfaceOrientation == UIDeviceOrientationPortraitUpsideDown)){
    myImageView.image = [UIImage imageNamed:@"image-portrait.png"];
} }
5 голосов
/ 06 января 2011

Мне потребовалось некоторое время, чтобы понять эту концепцию.Я не хотел создавать одинаковые изображения портрета и пейзажа.Ключевым моментом здесь является то, что CGAffineTransformMakeRotation вращается из исходного состояния вашего UIImageView или любого UIView по этому вопросу.Это предполагает, что ваше фоновое изображение имеет ориентацию к нему.Например, вы хотите, чтобы ваш UIImageView оставался на месте, в то время как другие объекты ведут себя как обычное событие изменения ориентации.

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

    if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) {        
        backgroundImage.transform = CGAffineTransformMakeRotation(M_PI / 2);
    }
    else if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight){
        backgroundImage.transform = CGAffineTransformMakeRotation(-M_PI / 2);
    }
    else {
        backgroundImage.transform = CGAffineTransformMakeRotation(0.0);
    }
}
3 голосов
/ 02 марта 2012

Вы можете управлять ориентацией путем автоматического изменения размера представления.

UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"background-image"]];

imageView.frame = self.view.bounds;
imageView.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight
iimageView.contentMode = UIViewContentModeScaleAspectFill;

[self.view addSubview:imageView];
[self.view sendSubviewToBack:imageView];

[imageView release];

Это поможет решить вашу проблему.

1 голос
/ 22 февраля 2012

В то время как Салах, мой ответ выглядит хорошо для меня, я думаю, что вы можете сделать два улучшения здесь:

  1. Установите фоновое изображение в этой функции:

    -(void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
    

    длительность (NSTimeInterval) длительность

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

  2. Улучшение установки значения myImageView.image:

    _myImageView.image = UIInterfaceOrientationIsLandscape (interfaceOrientation)? [UIImage imageNamed: @ "image-landscape.png"]: [UIImage imageNamed: @ "имидж-portrait.png"];

0 голосов
/ 10 июня 2016

Интересно, что программистам так сложно думать нестандартно (буквально в этом случае).

Попробуй это (как я сам решил).

  1. Создать квадратное изображение.
  2. Установить ограничения представления uiimage для заполнения экрана (ведущий, трейлинг, верх, низ)
  3. Установите режим для аспектного заполнения (который увеличит изображение, но сохранит его соотношение сторон постоянным)

Готово.

Ключевым моментом здесь, конечно, является то, что вы должны создать квадратное изображение (которое, как я сказал выше, за пределами рамки; -)

0 голосов
/ 08 апреля 2012

Я бы на самом деле добавил еще одну ветвь к коду docchang, так как, когда iPad поворачивается в портретное положение вверх, он использует портретное изображение справа вверху, которое может выглядеть немного странно. Я добавил,

if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft) 
  {
  imageBackgroundView.transform = CGAffineTransformMakeRotation(M_PI / 2);
  }
else
  if (toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)
    {
    imageBackgroundView.transform = CGAffineTransformMakeRotation(-M_PI / 2);
    }
  else
    if (toInterfaceOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
    imageBackgroundView.transform = CGAffineTransformMakeRotation(M_PI);
    }
    else 
      {
      imageBackgroundView.transform = CGAffineTransformMakeRotation(0);
      }
...