UIScrollView не соблюдает минимальный масштаб масштаба после изменения подвида

Я столкнулся с проблемой правильного обновления UIScrollView в ответ на изменение минимального масштаба масштабирования.

Scrollview имеет UIImageView в качестве подпредставления, а свойство изображения UIImageView устанавливается в ответ на метод didFinishPickingMediaWithInfo UIPickerView:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {

    UIImage *takenImage = [info objectForKey:UIImagePickerControllerOriginalImage];

    [self.imageView setImage:takenImage];
    [self.imageView setFrame:CGRectMake(self.imageView.frame.origin.x, self.imageView.frame.origin.y, takenImage.size.width, takenImage.size.height)];

    [self.scrollView setContentSize:CGSizeMake(takenImage.size.width, takenImage.size.height)];

    [self.scrollView setMinimumZoomScale:[self.scrollView frame].size.width / takenImage.size.width];
    [self.scrollView setMaximumZoomScale:2.0];
    [self.scrollView setZoomScale:[self.scrollView minimumZoomScale] animated:YES];

    [self dismissModalViewControllerAnimated:YES];        

}

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

Я выгрузил contentSize, zoomScale, minimumZoomScale и maximumZoomScale из scrollView в журнал, и каждый раз они одинаковы. minimumZoomScale каждый раз рассчитывается правильно.

Это как если бы scrollView перерисовывался с minimumZoomScale равным 1,0, игнорируя тот факт, что он был явно установлен. Есть ли что-то очевидное, что мне здесь не хватает?


person TimD    schedule 14.05.2012    source источник
comment
Обновлено: я решил проблему, уничтожив scrollView, если выбор изображения отменен - ​​удалив его из superView, а затем установив значение nil. Затем метод didFinishPickingMediaWithInfo воссоздает его. Это работает, но кажется, что это неуклюжий способ решения проблемы...   -  person TimD    schedule 14.05.2012


Ответы (1)


Кажется, проблема заключается в том, что - не уверен, что это поведение где-то задокументировано - сброс размера содержимого, когда текущий масштаб масштабирования установлен на значение, отличное от 1,0.

Исправление простое: сбросьте свойство zoomScale на 1.0 перед установкой нового размера контента:

// See http://stackoverflow.com/questions/10586577
// first reset before new content size
scroller.zoomScale = 1.0f;
// set new content size
scroller.contentSize = newImage.size;
// ... adjust minimum/maximum zoom scales if needed
person Daniel Schneller    schedule 02.08.2012
comment
Спасибо, вы спасли меня от вырывания всех волос :) Большое спасибо и большое уважение! - person shabbirh; 04.11.2012