Сброс свойства zoomScale в UIScrollView при автоповороте - PullRequest
3 голосов
/ 02 февраля 2012

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

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

В настоящее время я делаю это в viewWillAppear. Ниже приведен мой код для этого метода и вспомогательный метод, который вычисляет правильный 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, играя со свойством scrollView zoomScale, но не могу заставить его работать. Это правильное место для масштабирования? И если да, то как мне это сделать? Спасибо.

Дуэйн

Ответы [ 2 ]

18 голосов
/ 07 июня 2012

У меня была именно эта проблема (я полагаю, что вы также используете назначение 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 голосов
/ 02 февраля 2012

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

-(void)viewWillLayoutSubviews

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

...