Плохое поведение автора UIScrollView - PullRequest
0 голосов
/ 22 января 2012

У меня есть этот контроллер вида со следующей иерархией: View hierarchy

Я просто пытаюсь загрузить фотографию и быть в состоянии прокрутить ее, изменить масштаб и сделать ее автоповоротом.Все работает хорошо, за исключением того, что у меня плохое поведение при авторотации.Я установил родительский UINavigationController, чтобы разрешить вращение (путем подкласса и переопределения 'shouldautororate ..'), и теперь я поворачиваю свое окно, но комбинация прокрутки / просмотра изображений просто не будет заполнять экран по мере необходимости (в альбомной ориентации это будетвырезать на ширине 320p).Распорки и пружины установлены правильно.пытаясь поиграться с scroll / imageview.autoresizesSubviews = YES - но это не поможет.

Кроме того, я должен сделать некоторые "уродливые" вещи, как:

CGPoint cntr;// = {self.view.bounds.size.width/2, self.view.bounds.size.height/2};

    if ([self interfaceOrientation] == UIInterfaceOrientationPortrait)
    {
        cntr.x = (self.view.bounds.size.width/2);
        cntr.y = (self.view.bounds.size.height/2);
    }
    else
    {
        cntr.y = (self.view.bounds.size.width/2);
        cntr.x = (self.view.bounds.size.height/2);
    }

    [spinner setCenter:cntr];
    [self.imageView addSubview:spinner];

, потому что self.view.bounds не будет обновляться для представления нового размера альбомной ориентации (всегда возвращает размеры портрета).Должно быть что-то более изящное.

Что я здесь не так делаю?

Ответы [ 2 ]

3 голосов
/ 22 января 2012

Проверьте свои флаги авторазмера, используя NSLog, например:

NSLog(@"scroll view = %@", self.scrollView); // or whatever the scroll view is named
NSLog(@"scroll view superview autoresizesSubviews = %d", self.scrollView.superview.autoresizesSubviews);

Вы хотите увидеть что-то вроде этого:

scroll view = <UIScrollView: 0xdbdf200; frame = (0 20; 320 460); clipsToBounds = YES; autoresize = W+H; layer = <CALayer: 0xd35efb0>; contentOffset: {0, 0}>
scroll view superview autoresizesSubviews = 1

Авторазмер будет "W + H"если флаги установлены правильно, а для суперпредставления свойство autoresizesSubviews должно иметь значение YES (зарегистрировано как 1).

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

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

  1. Система отправляет вам shouldAutorotateToInterfaceOrientation:.
  2. Система отправляет вам willRotateToInterfaceOrientation:duration:.
  3. Система изменяет границы корневого представления ипреобразовать, чтобы отразить новую ориентацию интерфейса.Благодаря автоматическому изменению размера и переопределению layoutSubviews, обычно выполняется разметка всей иерархии представления.
  4. Система отправляет вам willAnimateRotationToInterfaceOrientation:duration:.
  5. Система выполняет анимацию.
  6. Система отправляет вам didRotateFromInterfaceOrientation:.

Поэтому, если вам нужно настроить макет пользовательского интерфейса для поворота интерфейса, вы можете сделать это, переопределив layoutSubviews в подклассах пользовательского представления.или вы можете сделать это в willAnimateRotationToInterfaceOrientation:duration:, который отправляется после обновления корневого представления.

1 голос
/ 22 января 2012

Вам не нужно этого делать, вы можете использовать свойство autoresizing mask. Вы можете установить комбинацию из следующих свойств в соответствии с вашими потребностями: UIViewAutoresizingF FlexibleWidth, UIViewAutoresizingF FlexibleHeight, UIViewAutoresizingFurableLeftMargin, UIViewAutoresizingF FlexibleRightMargin, UIViewAutoresizingF FlexibleTopMargin, UIViewBargin * UM

...