0

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

Я просто пытаюсь загрузить фотографию и быть в состоянии прокрутить его и увеличить его & авторотацией его. Все работает хорошо, за исключением того, что я получаю плохое поведение при авторотации. Я установил родительский UINavigationController для разрешения вращения (путем подкласса и overridng «shouldautororate ..»), и теперь я поворачиваю свое окно, но комбинация прокрутки/изображения просто не заполняет экран по мере необходимости (на ландшафте это будет разрезать на ширину 320p). Стойки и пружины установлены правильно. пытаясь возиться с прокруткой/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 не будет обновляться, чтобы представить новый размер альбомной ориентации (всегда возвращает Portait размеры). Должно быть что-то более элегантное.

Что я здесь делаю неправильно?

ответ

1

Вам не нужно это делать, что вы можете сделать, это использовать свойство авторезистирования маски. Вы можете установить комбинацию следующего свойства в соответствии с вашим need- UIViewAutoresizingFlexibleWidth, UIViewAutoresizingFlexibleHeight, UIViewAutoresizingFlexibleLeftMargin, UIViewAutoresizingFlexibleRightMargin, UIViewAutoresizingFlexibleTopMargin, UIViewAutoresizingFlexibleBottomMargin

3

Проверьте флаги с помощью автоматического изменения 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», если флаги установлены c правильно, и надзор должен иметь свойство autoresizesSubviews, установленное на YES (зарегистрировано как 1).

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

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

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

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

+0

ОК, я получаю это: ' scroll view = ; contentOffset: {0, 0}> scroll view superiew autoresizesSubviews = 1 ' так что no autoresize = W + H для меня ... Вещи [self] - это Viewcontroller, который содержит view-> scrollview-> imageview , Образ/scrollview - это IBOutlets в контроллере view и являются классами по умолчанию. Вы говорите, что я должен подклассировать их обоих? или добавить категорию в файл h для изменения их 'willAnimateRotationToInterfaceOrientation: duration:' ... Я потерян. – mindbomb

+0

Нельзя добавлять категорию. Вы должны установить маску autoresizingMask в режиме прокрутки. Возможно, у вас не было правильного вида, выбранного в наконечнике, когда вы считали, что устанавливаете флаги. Вы можете попробовать установить их в 'viewDidLoad'. –

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