Scrollview не работает на xcode4 (работал на xcode3) - PullRequest
0 голосов
/ 31 января 2012

Я новичок, так что прости меня, если это глупое сомнение ... Я недавно изменил свой проект с 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: Извините за мой английский


EDIT

OK, эта часть исправлена.Я удалил 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 ]

0 голосов
/ 02 февраля 2012

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

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

[[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.Помните, что в этом методе я изменяю размер всего, чтобы соответствовать текущей ориентации приложения.

0 голосов
/ 31 января 2012

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

[self.view addSubview:anotherViewController.view];

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

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

[self presentModalViewController:anotherViewController animated:YES];

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

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

...