В настоящее время вы вызываете этот код только при первом просмотре. Вы на самом деле нужно вызвать его
- всякий раз, когда вид появляется на экране (в случае, если устройство вращали это было закадровый)
- всякий раз, когда вращают устройство
но вы должны держать создание вида код в 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
)
большое спасибо. Он отлично работает! Теперь о краях за кадром это именно то, что я хочу. Позвольте мне объяснить: я показываю изображения, которые я хочу посмотреть на один и тот же портрет или пейзаж.Никакой изменения размера не требуется, даже если какая-то часть будет сокращена. Идея состоит в том, чтобы иметь все важные элементы изображения в центре экрана и менее важные по краям. Центрированные элементы будут отображаться независимо от режима. И нам было все равно, о разных элементах, оставшихся без внимания ... например, Джо Блау на снимке фильма Коби Брайанта. Если вы не Джо Блов :-) Теперь, как это делается с Xib? – Armand
@Armand, см. Обновленный ответ – foundry
Спасибо @ Он был. Я попробую. Мне также нужно будет добавить кнопки. Мне интересно, можно ли комбинировать подходы? Подобно позициям некоторые элементы через Xib и другие программно. Например, скажем, я хочу разместить некоторые кнопки на вашем представлении выше. Могу ли я запрограммировать представление, а затем поместить кнопки в Xib. Разве изображение не покрыло бы их? Извините за недостаток знаний на этом уровне :-) – Armand