2013-02-17 2 views
0

Я создаю приложение, которое отображает изображение в ландшафтном и портретном режимах. Вращение работает отлично. Изображение также идеально расположено в ландшафтном режиме. Однако он сохраняет свои ландшафтные координаты в портрете, что приводит к его неправильному использованию. Пожалуйста, найдите мой код ниже. Не могли бы вы сообщить мне, что мне не хватает? Есть ли способ добиться этого строго из файла Xib?UIImageView вращается, но неправильно репозиционируется

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 
// Do any additional setup after loading the view. 
[[self navigationController] setNavigationBarHidden:YES animated:NO]; 

UIImage *startImage = [UIImage imageNamed:@"title.png"]; 
UIImageView *startImageView = [[UIImageView alloc] initWithImage:startImage]; 

if (curOrientation == UIInterfaceOrientationPortrait || curOrientation == UIInterfaceOrientationPortraitUpsideDown) { 

    [startImageView setFrame:CGRectMake(-128, 0, 1024, 1024)]; 

}else{ 

    [startImageView setFrame:CGRectMake(0, -128, 1024, 1024)]; 

} 

[self.view addSubview:startImageView]; 


} 

ответ

3

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

  • всякий раз, когда вид появляется на экране (в случае, если устройство вращали это было закадровый)
  • всякий раз, когда вращают устройство

но вы должны держать создание вида код в viewDidLoad, поскольку вы только хотите создать его один раз.

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

@property (nonatomic, weak) UIImageView* startImageView; 

Создать его в viewDidLoad (но не волнуйтесь, то о геометрии, как вы можете сделать это в viewWillAppear):

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
     // Do any additional setup after loading the view. 
    [[self navigationController] setNavigationBarHidden:YES animated:NO]; 
    UIImage *startImage = [UIImage imageNamed:@"title.png"]; 
    UIImageView *startImageView = [[UIImageView alloc] initWithImage:startImage]; 
    self.startImageView = startImageView; 
    [self.view addSubview:startImageView]; 
} 

сделать общий метод ориентации:

- (void) orientStartImageView 
    { 
     UIInterfaceOrientation curOrientation = [UIApplication sharedApplication].statusBarOrientation; 
     if (curOrientation == UIInterfaceOrientationPortrait || curOrientation == UIInterfaceOrientationPortraitUpsideDown) { 
      [self.startImageView setFrame:CGRectMake(-128, 0, 1200, 1200)]; 
     }else{ 
      [self.startImageView setFrame:CGRectMake(0, -128, 1200, 1200)]; 
     } 
    } 

Вызывается из viewWillAppear (срабатывает каждый раз, когда представление появляется на экране):

- (void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self orientStartImageView]; 
} 

вызов из viewWillLayoutSubviews (срабатывает каждый раз, когда представление на экране и устройство вращается):

- (void)viewWillLayoutSubviews 
{ 
    [super viewWillLayoutSubviews]; 
    [self orientStartImageView]; 
} 

К Кстати, я не уверен, что ваши рамки правильные - в портрете вы перемещаете левый край на экране, в ландшафте вы перемещаете верхний край за кадром. Это то, что вы хотите? Вполне возможно, что вы можете достичь того, чего хотите в Interface Builder, но из вашего кода неясно, что это такое - возможно, вы можете опубликовать изображение. Также проверьте, что вы отключили автозапуск (флажок в инспекторе файлов Interface Builder), чтобы упростить проблемы.

обновление

Вы можете быть в состоянии сделать это из XIb, без кода: Центр ImageView в это SuperView, установить его размер до конечного размера (например, 1200x1200), отключить Autolayout, снимите все пружины и распорки, установите режим просмотра надлежащим образом (например, center или scaleToFill)

enter image description here

enter image description here

enter image description here

+0

большое спасибо. Он отлично работает! Теперь о краях за кадром это именно то, что я хочу. Позвольте мне объяснить: я показываю изображения, которые я хочу посмотреть на один и тот же портрет или пейзаж.Никакой изменения размера не требуется, даже если какая-то часть будет сокращена. Идея состоит в том, чтобы иметь все важные элементы изображения в центре экрана и менее важные по краям. Центрированные элементы будут отображаться независимо от режима. И нам было все равно, о разных элементах, оставшихся без внимания ... например, Джо Блау на снимке фильма Коби Брайанта. Если вы не Джо Блов :-) Теперь, как это делается с Xib? – Armand

+0

@Armand, см. Обновленный ответ – foundry

+0

Спасибо @ Он был. Я попробую. Мне также нужно будет добавить кнопки. Мне интересно, можно ли комбинировать подходы? Подобно позициям некоторые элементы через Xib и другие программно. Например, скажем, я хочу разместить некоторые кнопки на вашем представлении выше. Могу ли я запрограммировать представление, а затем поместить кнопки в Xib. Разве изображение не покрыло бы их? Извините за недостаток знаний на этом уровне :-) – Armand

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