Изменение UIView при изменении ориентации - PullRequest
12 голосов
/ 29 апреля 2010

Привет всем. У меня довольно простой вопрос. Я разрабатываю «богатое» приложение для iPad, и у меня есть два фоновых изображения, специально разработанных для пейзажа и портрета. Я бы хотел, чтобы этот ImageView автоматически менялся в зависимости от ориентации устройства. (как и почти все приложения Apple для iPad).

Кто-нибудь может указать мне правильное направление? Я предполагаю, что это будет что-то, что я делаю на viewDidLoad ..

Ответы [ 4 ]

22 голосов
/ 29 апреля 2010

Лучшее, что вы можете сделать, это изменить кадры ваших кадров подвидов в соответствии с ориентацией вашего интерфейса. Вы можете сделать это как:

 #pragma mark -
 #pragma mark InterfaceOrientationMethods

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
    return (UIInterfaceOrientationIsPortrait(interfaceOrientation) || UIInterfaceOrientationIsLandscape(interfaceOrientation));
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    if(UIInterfaceOrientationIsPortrait(toInterfaceOrientation)){
        //self.view = portraitView;
        [self changeTheViewToPortrait:YES andDuration:duration];

    }
    else if(UIInterfaceOrientationIsLandscape(toInterfaceOrientation)){
        //self.view = landscapeView;
        [self changeTheViewToPortrait:NO andDuration:duration];
    }
}

//--------------------------------------------------------------------------------------------------------------------------------------------------------------------

- (void) changeTheViewToPortrait:(BOOL)portrait andDuration:(NSTimeInterval)duration{

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:duration];

    if(portrait){
        //change the view and subview frames for the portrait view
    }
    else{   
        //change the view and subview  frames for the landscape view
    }

    [UIView commitAnimations];
}

Надеюсь, это поможет.

9 голосов
/ 03 мая 2010

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

`

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation duration:(NSTimeInterval)duration {
    if (interfaceOrientation == UIInterfaceOrientationPortrait || interfaceOrientation ==
        UIInterfaceOrientationPortraitUpsideDown) { 
        [brownBackground setImage:[UIImage imageNamed:@"Portrait_Background.png"]];
    } else {
        [brownBackground setImage:[UIImage imageNamed:@"Landscape_Background.png"]];
    }
}

`

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

7 голосов
/ 13 декабря 2010

Одно небольшое дополнение к подходу Madhup, и это здорово.Я обнаружил, что мне нужно добавить это в viewDidLoad, чтобы установить исходное фоновое изображение для портрета или ландшафта:

// set background image
if (self.interfaceOrientation == UIInterfaceOrientationPortrait || self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"portraitBG.png"]];
} else {
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"landscapeBG.png"]];
}

еще раз спасибо Madhup

1 голос
/ 18 июня 2015

Вы можете полностью инкапсулировать это в свой UIView, просмотрев, bounds.width > bounds.height

Это может быть желательно, если вы пишете небольшой, самосознательный элемент управления.

class MyView: UIView {
  override func layoutSubviews() {
    super.layoutSubviews()
    if bounds.height > bounds.width {
      println("PORTRAIT. some bounds-impacting event happened")
    } else {
      println("LANDSCAPE")
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...