2012-02-01 3 views
3

У меня есть пользовательский UIViewController, на который я добавил UIImageView (на StoryBoard), а затем встроил UIImageView в UIScrollView. Моя программа загружает изображение в изображениеView и масштабирует его для правильной установки. Соответствующего припадке, я имею в виду это:Сброс свойства zoomScale UIScrollView на авторотации

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

В настоящее время я делаю это в представленииWillAppear. Ниже приведен код для этого метода и вспомогательный метод, который вычисляет правильную zoomScale:

-(float) findZoomScale {  
    float widthRatio = self.view.bounds.size.width/self.imageView.image.size.width; 
    float heightRatio = self.view.bounds.size.height/self.imageView.image.size.height; 
    float ratio; 
    if (widthRatio > heightRatio) ratio = widthRatio; 
    else ratio = heightRatio; 
     return ratio; 
} 

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:YES]; 
    self.imageView.image = self.image; 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 
    self.scrollView.contentSize = self.imageView.image.size; 
    self.scrollView.zoomScale = [self findZoomScale]; 
     [self.scrollView flashScrollIndicators]; 
} 

- (void)viewDidLoad {  
    [super viewDidLoad]; 
    self.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:self.photoURL]]; 
    self.imageView.image = self.image; 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, 
     self.imageView.image.size.height); 
    self.scrollView.delegate = self; 
    self.scrollView.zoomScale = 1.0; 
    self.navigationItem.title = self.photoTitle; 
    self.scrollView.autoresizesSubviews = YES; 
    self.scrollView.autoresizingMask = (UIViewAutoresizingFlexibleBottomMargin | 
     UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleLeftMargin | 
     UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth | 
     UIViewAutoresizingFlexibleHeight); 
} 

Этот код работает как я предназначен для первоначальной загрузки образа, будь то iPhone в альбомной или портретной ориентации. Но когда я поворачиваю iPhone с уже загруженным изображением, он не масштабируется должным образом. Я попытался выполнить перемасштабирование в didRotateFromInterfaceOrientation, играя с свойством zoomScale scrollView, но я не могу заставить его работать. Это правильное место для повторного масштабирования? И если да, то как мне это сделать? Благодарю.

Дуэйн

ответ

16

У меня просто была эта точная проблема (я полагаю, что вы тоже в назначении CS193p 4), и решил ее, установив zoomScale назад до 1, прежде чем настраивать UIScrollView contentSize при вращении.

Например:

- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 
{ 
    //reset zoomScale back to 1 so that contentSize can be modified correctly 
    self.scrollView.zoomScale = 1; 

    // reset scrolling area equal to size of image 
    self.scrollView.contentSize = self.imageView.image.size; 

    //reset the image frame to the size of the image 
    self.imageView.frame = CGRectMake(0, 0, self.imageView.image.size.width, self.imageView.image.size.height); 

    //set the zoomScale to what we actually want 
    self.scrollView.zoomScale = [self findZoomScale]; 
} 
+0

Это мне очень помогло. –

0

Вы можете использовать

-(void)viewWillLayoutSubviews 

в вашем UIViewController. Это будет вызвано всякий раз, когда представление будет загружено/повернуто/изменено.

+0

Тот же результат, как и раньше. Я думаю, что это может быть КАК Я пытаюсь перемасштабировать, а не ГДЕ. Я добавил NSLogs, чтобы увидеть «коэффициент», рассчитанный в методе findZoomScale. Я могу загрузить изображение в портретном виде и отметить соотношение, затем загрузить одно и то же изображение в альбомном режиме, а затем повернуть в портретный вид; Я получаю одинаковое соотношение в обоих портретных случаях, но применяемый уровень масштабирования отличается. Очевидно, что что-то происходит за кулисами, которые мне нужно сбросить. Нужно ли мне что-то делать непосредственно перед преобразованием до или после завершения вращения? –

+0

Является ли scrollview подвид представлений Viewcontrollers? Если ваш scrollView не относится к вашему представлению UIViewControllers, он не получит уведомление о ротации. Кроме того, если ваш ScrollView является подпунктом представления, убедитесь, что маски авторезистировки настроены правильно. – Rich86man

+0

Да, scrollview является подзором представления по умолчанию контроллера представления. Что касается авторезистирующих масок, я не использовал их, думая (возможно, ошибочно), что стюарсы и пружины позаботились об этом. (Я создал все представления в раскадровке.Но теперь я добавил маски autoresizing к моему методу viewDidLoad, и я добавил этот метод к моему первоначальному сообщению выше.Я никогда не использовал маски, поэтому я надеюсь, что они верны.Во всяком случае, ничего не изменилось. –