Scrollview не работает на xcode4 (работал на xcode3)

Я новичок, так что прости меня, если это глупое сомнение... Я недавно изменил свой проект с xcode3 на xcode4, и теперь есть некоторые проблемы, и я не знаю почему...

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

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

 if (toInterfaceOrientation == UIInterfaceOrientationLandscapeLeft ||

      toInterfaceOrientation == UIInterfaceOrientationLandscapeRight)     {

      scrollView.frame = CGRectMake(0,0,480,300);

      [scrollView setContentSize:CGSizeMake(480,560)];

 }

 else {

      scrollView.frame = CGRectMake(0,0,320,460);

      [scrollView setContentSize:CGSizeMake(320,560)];

 }

 [scrollView flashScrollIndicators];}

Я думаю, что с Xcode3 приложение вызывало этот метод при загрузке экрана, поэтому он отлично работал в любой ситуации.

Но в Xcode4 приложение не вызывает этот метод при загрузке экрана. Он вызывает это только тогда, когда меняется ориентация (я не знаю, почему существует эта разница). Таким образом, мой прокрутки не работает, когда экран загружен. Работает только когда меняю ориентацию устройства.

Затем я попробовал это:

- (void)viewDidLoad {

if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft ||

      [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)     {

      scrollView.frame = CGRectMake(0,0,480,300);

      [scrollView setContentSize:CGSizeMake(480,560)];

 }

 else {

      scrollView.frame = CGRectMake(0,0,320,460);

      [scrollView setContentSize:CGSizeMake(320,560)];

 }

[scrollView flashScrollIndicators];

 [super viewDidLoad];}

По-видимому, это работало, НО... происходит нечто очень странное...

Если я перехожу к другому виду (в книжной ориентации), а затем меняю ориентацию на альбомную и затем возвращаюсь к первому виду (в альбомной ориентации), маска автоматического изменения размера сходит с ума. Весь контент переходит на правую сторону, как будто представление имеет большую ширину, чем оно есть на самом деле. И я не могу получить доступ к части контента. Но если теперь я изменю ориентацию на Портрет, все снова в порядке, даже если я снова перейду в Пейзаж. Таким образом, это только неправильно, когда я прихожу к представлению из другого представления о альбомной ориентации.

Вот как я перехожу из вида в другой вид:

- (IBAction) btnUnVano:(id) sender {


 PE2100UnVano *controller = [[PE2100UnVano alloc] initWithNibName:@"PE2100UnVano" bundle:nil];

 controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;

 [self presentModalViewController:controller animated:YES];

 [controller release];}

Что я должен делать?

Pd: извините за мой английский


РЕДАКТИРОВАТЬ

ОК, эта часть исправлена. Я удалил willAnimateRotationToInterfaceOrientation, и теперь он работает правильно с этим:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Si la orientación es horizontal..
if ([[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeLeft ||
    [[UIApplication sharedApplication] statusBarOrientation] == UIInterfaceOrientationLandscapeRight)   {
    scrollView.frame = CGRectMake(0,0,480,300);
    [scrollView setContentSize:CGSizeMake(480,560)];
}
// Si la orientación es vertical..
else {
    scrollView.frame = CGRectMake(0,0,320,460);
    [scrollView setContentSize:CGSizeMake(320,560)];
}
// Mostrar durante un instante los indicadores de scroll
[scrollView flashScrollIndicators];
// Retorna YES para soportar todas las orientaciones posibles
return YES;}

Теперь есть еще одна проблема. На некоторых экранах я возвращаюсь к предыдущему экрану с этим кодом:

- (IBAction) btnAtrasTabla:(id) sender {
[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];}

В этом случае проблема автоматического изменения размера появляется снова. Я перехожу на этот экран в "Портрет", я изменяю на "Пейзаж", я возвращаюсь к предыдущему, и предыдущий отображается с неправильным автоматическим размером. Затем я меняю ориентацию, и все снова верно... есть идеи?

2 ответа

Решение

Вот что я наконец-то сделал по совету Беппе.

В представлении "ребенок", когда я покидаю его, я отправляю уведомление:

[[self presentingViewController] dismissViewControllerAnimated:YES completion:nil];
[[NSNotificationCenter defaultCenter] postNotificationName:@"resize" object:nil userInfo:nil];

Затем родительский вид - это наблюдатель:

- (void)viewDidLoad {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(shouldAutorotateToInterfaceOrientation:) name:@"resize" object:nil];
[super viewDidLoad];}

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

Любой viewController.view, добавленный к вашему rootViewController, наследует свое поведение от самого rootViewController.

[self.view addSubview:anotherViewController.view];

Это означает, что вам нужно включить shouldAutorotateToInterfaceOrientation только в вашем rootViewController.

Если вы представляете свой viewController как модальное представление, у вас другое поведение.

[self presentModalViewController:anotherViewController animated:YES];

Так что вам нужно включить shouldAutorotateToInterfaceOrientation в вашем родителе и в самом модальном представлении.

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

Другие вопросы по тегам