2012-02-14 18 views
7

Mam interesujący problem. Mam jeden UIScrollView i wewnątrz tylko jeden UIImageView z obrazem. Potrzebuję tego do powiększania i przesuwania. Ok. Po dotknięciu przycisku chcę zastąpić obraz w UIImageView (który jest w ramach UIScrollView, jak wspomniano) z następnym w linii.Jak poprawnie zastąpić obraz w UIImageView w UIScrollView na iOS

tej pory robiłem to tak:

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

Dlatego, że ja zawsze ustawiony self.imageView do zera jest to, że jeśli nie robić niż następnego obrazu jest skalowany lub powiększony jak poprzedni jeden był.

Ale nie sądzę, że to w porządku rozwiązanie dla wydajności pamięci.

Czy istnieje inny sposób ustawienia nowego obrazu w UIImageView z opcją "reset" do powiększania, skalowania, itp ...?

UPDATE: Kod, który nadal nie działa:

[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]]; 

UPDATE 2 Tylko zorientowali się, co robię źle. Nie zresetowałem minimalnej skali zoomu.

[self.scrollView setMinimumZoomScale:1.0]; 

Teraz działa!

Odpowiedz

7

Istnieje właściwość o nazwie zoomScale w UIScrollView

Set 1,0 do zoomScale swojej Scrollview. Nie trzeba zwolnić starego UIImageView i przydzielić nowego UIImageView za każdym razem. Możesz bezpośrednio ustawić obraz do widoku obrazu i ustawić wartość parametruw UIScrollView na 1.0.

+0

To jest dobrym rozwiązaniem. Dzięki! –

+1

W rzeczywistości to nie działa. UIImageView pobiera rozmiar z poprzedniego obrazu, który jest nieprawidłowy. Jak mogę zresetować UIImageView? –

+1

Czy próbowałeś ustawić obraz po ustawieniu "zoomScale" na 1? – Ilanchezhian

1

Możesz po prostu użyć właściwości zoomScale obiektu scrollView i ustawić ją na 1.0 za każdym razem, gdy zmieniasz obraz. Prawdopodobnie nastąpi przed załadowaniem nowego obrazu. W ten sposób nie będziesz musiał przydzielać i inicjować nowego obiektu UIIMageVIew za każdym razem, gdy chcesz zmienić tylko obraz. Dodatkowo możesz umieścić tę zmianę w bloku animacji, aby zmienić obraz nie ostrym, ale stopniowym.

0

Serwatkę używasz tego kodu, za każdym razem, gdy tworzysz nowy obiekt, ale poprzedni UIImageView pozostaje na twoim UIScrollView. To nie jest wydajne w użyciu pamięci.

Zastosowanie następny kod:

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

lub

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

a następnie można ustawić rozmiar zawartości dla ciebie Scrollview:

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

prostu chce zrobić jedną rzecz, bo Wystąpił ten sam problem: zresetuj minimalną skalę zoomu do 1.0 Przed zmianą wizerunku 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]; 

i do centrowania obrazu:

- (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; 
} 
Powiązane problemy