2012-02-14 3 views
7

흥미로운 문제가 있습니다. 하나의 UIScrollView가 있고 이미지가있는 UIImageView가 하나 밖에 없습니다. 확대/축소 및 이동에이 기능이 필요합니다. 확인. 버튼 터치에서 UIImageView (위와 같은 UIScrollView 내에 있음) 내의 이미지를 다음 라인의 이미지와 바꾸기를 원합니다.iOS의 UIScrollView에서 UIImageView의 이미지를 올바르게 대체하는 방법

지금까지 그 같은 이런 짓을했습니다

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

난 항상 전무로 self.imageView을 설정 한 이유는 내가 다음 이미지보다 그렇게하지 않으면 확장 또는 이전처럼 확대되고 있다는 점이다 하나는.

하지만 메모리 효율성을위한 훌륭한 솔루션이라고 생각하지 않습니다.

확대/축소, 축척 등의 "재설정"옵션을 사용하여 UIImageView에서 새 이미지를 설정할 수있는 다른 방법이 있습니까?

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

이제 작동합니다!

답변

7

UIScrollView

에있는 ScrollView의 zoomScale로 설정 1.0 zoomScale라는 속성이 있습니다. 이전 UIImageView를 해제하고 매번 새로운 UIImageView를 할당 할 필요가 없습니다. 직접 이미지를 이미지 뷰로 설정하고 UIScrollView의 zoomScale을 1.0으로 설정할 수 있습니다.

+0

이 최적의 솔루션이다. 고마워요! –

+1

실제로 이것은 작동하지 않습니다. UIImageView 이전 이미지에서 크기가 잘못되었습니다. 어떻게하면 UIImageView를 재설정 할 수 있습니까? –

+1

'zoomScale'을 1로 설정 한 후 이미지 설정을 시도 했습니까? – Ilanchezhian

1

scrollView 개체의 zoomScale 속성을 사용하고 이미지를 변경할 때마다 1.0으로 설정할 수 있습니다. 새 이미지를로드하기 전에 이동합니다. 이렇게하면 이미지 만 변경할 때마다 새 UIIMageVIew 객체를 할당하고 초기화 할 필요가 없습니다. 또한이 변경 사항을 애니메이션 블록에 넣으면 이미지가 선명하지 않고 점진적으로 변경됩니다.

0

새로운 코드를 만들 때마다 유익하지만 이전 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); 
1

해서 한 가지 분명히 할 동일한 문제가 발생했습니다. 최소 줌 배율을 1로 재설정하십시오.

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

화상을 센터링 : 0 이미지 뷰의 이미지를 변경하기 전에

- (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; 
} 
관련 문제