Как правильно заменить изображение в UIImageView в UIScrollView на iOS - PullRequest
7 голосов
/ 14 февраля 2012

У меня интересная проблема. У меня есть один UIScrollView и внутри только один UIImageView с изображением. Мне это нужно для масштабирования и панорамирования. Хорошо. При нажатии кнопки я хочу заменить изображение в UIImageView (которое находится в UIScrollView, как упомянуто) на следующее в строке.

Пока я сделал это так:

self.imageView = nil;
self.imageView = [[UIImageView alloc] initWithImage:nextImage];

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

Но я не думаю, что это хорошее решение для эффективности памяти.

Есть ли другой способ установить новое изображение в UIImageView с опцией «reset» для масштабирования, масштабирования и т. Д.? *

UPDATE: Код, который все еще не работает:

[self.scrollView setZoomScale:1.0];
[self.imageView setImage:photoImage];
[self.imageView setFrame:rect];
[self.scrollView setContentSize:[self.imageView frame].size];
CGFloat minZoomScale = [self.scrollView frame].size.width / [self.imageView frame].size.width;
if (minZoomScale < [self.scrollView frame].size.height / [self.imageView frame].size.height) {
    minZoomScale = [self.scrollView frame].size.height / [self.imageView frame].size.height;
}
[self.scrollView setMinimumZoomScale:minZoomScale];
[self.scrollView setZoomScale:[self.scrollView minimumZoomScale]];

ОБНОВЛЕНИЕ 2 Просто понял, что я делаю не так. Я не сбросил минимальный масштаб увеличения.

[self.scrollView setMinimumZoomScale:1.0];

Теперь это работает!

Ответы [ 4 ]

7 голосов
/ 14 февраля 2012

Существует свойство с именем zoomScale в UIScrollView

Установите значение 1,0 для zoomScale вашего прокрутки.Нет необходимости освобождать старый UIImageView и выделять новый UIImageView каждый раз.Вы можете напрямую установить изображение для просмотра изображений и установить zoomScale для UIScrollView на 1.0.

1 голос
/ 12 мая 2014

Просто хочу прояснить одну вещь, потому что я столкнулся с той же проблемой: сбросить минимальный масштаб увеличения до 1,0 ПЕРЕД изменением изображения imageView:

[self.scrollView setMinimumZoomScale:1.0];
[self.scrollView setZoomScale:1.0];
[self.imageView setImage:photoImage];
[self.photoView setFrame:(CGRect){.origin=CGPointMake(0.0f, 0.0f), photoImage.size=photo.size}];
[self.scrollView setContentSize:[self.imageView frame].size];
CGFloat minZoomScale = MIN([self.scrollView frame].size.width / [self.imageView frame].size.width,  [self.scrollView frame].size.height / [self.imageView frame].size.height)
[self.scrollView setMinimumZoomScale:minZoomScale];
[self.scrollView setMaximumZoomScale:1.0];
[self.scrollView setZoomScale:[self.scrollView minimumZoomScale]];
[self centerScrollViewContents];

и для центрирования изображения:

- (void)centerScrollViewContents {
    CGSize boundsSize = self.scrollView.bounds.size;
    CGRect contentsFrame = self.imageView.frame;

    if (contentsFrame.size.width < boundsSize.width) {
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0f;
    } else {
        contentsFrame.origin.x = 0.0f;
    }

    if (contentsFrame.size.height < boundsSize.height) {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0f;
    } else {
        contentsFrame.origin.y = 0.0f;
    }

    self.imageView.frame = contentsFrame;
}
1 голос
/ 14 февраля 2012

Вы можете просто использовать свойство zoomScale объекта scrollView и устанавливать его равным 1,0 при каждом изменении изображения. Это, вероятно, пойдет до загрузки нового изображения. Таким образом, вам не нужно выделять и инициировать новый объект UIIMageVIew каждый раз, когда вы хотите изменить только изображение. Кроме того, вы можете поместить это изменение в блок анимации, чтобы сделать изображение не резким, а постепенным.

0 голосов
/ 14 февраля 2012

Когда вы используете этот код, каждый раз, когда создаете новый объект, но предыдущий UIImageView остается на вашем UIScrollView.Это неэффективно при использовании памяти.

Используйте следующий код:

[self.imageView removeFromSuperview];
[self.imageView release];
self.imageView = [[UIImageView alloc] initWithImage: nextImage];
[self addSubview: imageView];

или

[self.imageView setImage: nextImage];
[self.imageView setFrame: CGRectMake(0, 0, nextImage.size.width, nextImage.size.height)];

, а затем вы можете установить размер содержимого для вас ScrollView:

topScrollView.contentSize = CGSizeMake(nextImage.size.width, nextImage.size.height);
...