UIScrollView挤压UIImageView图像

我在ViewDidLoad有下面的代码,它ViewDidLoad我的UIImage / UIImageView。 我想要图像填充UIScrollView。

 [super viewDidLoad]; _imageHolder = [[UIImageView alloc]initWithFrame:self.view.frame]; _scrollView = [[UIScrollView alloc]initWithFrame:self.view.frame]; [_scrollView setBackgroundColor:[UIColor purpleColor]]; // Tell the scroll view the size of the contents self.scrollView.contentSize = self.view.frame.size; self.scrollView.delegate = self; self.scrollView.scrollEnabled = YES; FfThumbnailData* thumbData = [self.arrayOfImages objectAtIndex:self.thisImageIndex]; UIImage* fullSizedImage = [[UIImage alloc]initWithContentsOfFile:thumbData.path]; [self.imageHolder setImage:fullSizedImage]; float x = fullSizedImage.size.width; float y = fullSizedImage.size.height; CGRect rect = CGRectMake(0, 0, x, y); NSLog(@"Size of image: %@", NSStringFromCGRect(rect)); // //[self.imageHolder setImage:[UIImage imageNamed:@"P1020486.png"]]; [self.scrollView addSubview:_imageHolder]; [self.view addSubview:self.scrollView]; _imageHolder.contentMode = UIViewContentModeScaleAspectFit; 

为了清晰起见,我将UIScrollView的背景设置为紫色:

被UIScrollView挤压 http://i1219.photobucket.com/albums/dd427/Dave_Chambers/IMG_0315.png

我应该补充说,放大后,然后缩小,图像是正确放置在滚动视图,而不是压扁。

奇怪的是,注释行[self.imageHolder setImage:[UIImage imageNamed:@"P1020486.png"]]; 正确显示伪图像P1020486.png。

此外,当我下载我的应用程序数据时,图像看起来是正确的,并确实是一个正确的大小的iPad图像 – {1936年,2592} – 我的NSLog线NSLog(@"Size of image: %@", NSStringFromCGRect(rect));报告的大小NSLog(@"Size of image: %@", NSStringFromCGRect(rect));

此外,在我需要一个UIScrollView(用于缩放全尺寸视图控制器中的照片)之前,我访问相同的图像,并通过从一个视图控制器到另一个视图控制器的animation显示,并显示正确。 至关重要的是,这个代码的第二部分缺less一个UIScollview。

 -(void)animateTransition:(int)buttonInPositon { @try { FfThumbnailData* thumbData = [self.images objectAtIndex:buttonInPositon]; UIImage* fullSizedImage = [[UIImage alloc]initWithContentsOfFile:thumbData.path]; fullSize = [[FullSizeViewController alloc]init]; fullSize.imageHolderGhost.contentMode = UIViewContentModeScaleAspectFit; fullSize.arrayOfImages = self.images; fullSize.imageToPresent = fullSizedImage; fullSize.numberOfImages = self.images.count; fullSize.thisImageIndex = buttonInPositon; [fullSize.imageHolderGhost setImage:fullSizedImage]; float screenWidth = self.view.bounds.size.width; float screenHeight = self.view.bounds.size.height; NSLog(@"ButtonFrame: %@", NSStringFromCGRect(buttonFrame)); [fullSize.view setFrame:CGRectMake(buttonFrame.origin.x, buttonFrame.origin.y, buttonFrame.size.width, buttonFrame.size.height-44)]; NSLog(@"ButtonFrame: %@", NSStringFromCGRect(fullSize.view.frame)); [self.view addSubview:fullSize.view]; fullSize.view.backgroundColor = [UIColor clearColor]; [UIView animateWithDuration:0.9 delay:0 options:UIViewAnimationCurveEaseIn animations:^{ [fullSize.view setFrame:CGRectMake(0, 0, screenWidth, screenHeight)]; } completion:^(BOOL finished){ [[self navigationController] pushViewController:fullSize animated:NO]; self.navigationController.navigationBarHidden = YES; }]; } @catch (NSException *exception) { NSLog(@"%@", exception); } } 

为了完整性,UIScrollView的代码在一个VC中具有以下方法:

 -(void)presentWithScrollview:(int)buttonInPositon { FfThumbnailData* thumbData = [self.images objectAtIndex:buttonInPositon]; UIImage* fullSizedImage = [[UIImage alloc]initWithContentsOfFile:thumbData.path]; fullSize = [[FullSizeViewController alloc]init]; fullSize.arrayOfImages = self.images; fullSize.imageToPresent = fullSizedImage; fullSize.numberOfImages = self.images.count; fullSize.thisImageIndex = buttonInPositon; [[self navigationController] pushViewController:fullSize animated:NO]; self.navigationController.navigationBarHidden = YES; } 

并在目标VC下面的方法可能与我的问题相关( ViewDidLoad粘贴在这个问题的顶部):

 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // Set up the minimum & maximum zoom scales CGRect scrollViewFrame = self.scrollView.frame; CGFloat scaleWidth = scrollViewFrame.size.width / self.scrollView.contentSize.width; CGFloat scaleHeight = scrollViewFrame.size.height / self.scrollView.contentSize.height; CGFloat minScale = MIN(scaleWidth, scaleHeight); // self.scrollView.minimumZoomScale = minScale; //Can set this bigger if needs be - match iPhoto self.scrollView.maximumZoomScale = 2.0f; [self centerScrollViewContents]; } - (void)centerScrollViewContents { CGSize boundsSize = self.scrollView.bounds.size; //NSLog(@"boundsSize: %@", NSStringFromCGSize(boundsSize)); CGRect contentsFrame = self.imageHolder.frame; //NSLog(@"contentsFrame: %@", NSStringFromCGRect(contentsFrame)); 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.imageHolder.frame = contentsFrame; } #pragma mark - UIScrollViewDelegate - (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView { // Return the view that we want to zoom return self.imageHolder; //return self.scrollViewBar; } - (void)scrollViewDidZoom:(UIScrollView *)scrollView { // The scroll view has zoomed, so we need to re-center the contents [self centerScrollViewContents]; } 

任何帮助,这将是伟大的。 谢谢

所以,我自己find了解决scheme。 出于某种原因,正如我在对问题的更新中所写的那样,任何放大,然后缩小图像,都会修正图像问题并正确显示。 我将这两行添加到viewWillAppear ,上面[self centerScrollViewContents];

 self.scrollView.zoomScale = 2.0; self.scrollView.zoomScale = 1.0; 

问题解决了