UIScrollView压缩UIImageView图像

时间:2012-11-10 17:47:51

标签: ios uiscrollview uiimageview uiimage

我在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的背景设置为紫色:

Squashed by UIScrollView http://i1219.photobucket.com/albums/dd427/Dave_Chambers/IMG_0315.png

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

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

此外,当我下载我的应用数据时,图像看起来正确并且确实是iPad图像的正确尺寸 - {1936,292} - 我的NSLog行报告的尺寸NSLog(@"Size of image: %@", NSStringFromCGRect(rect));

此外,在我需要UIScrollView(用于在全尺寸视图控制器中缩放照片)之前,我访问相同的图像并通过动画从一个视图控制器显示到另一个视图控制器,并使用以下代码正确显示。至关重要的是,第二部分代码缺少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];
    }

对此的任何帮助都会很棒。感谢

1 个答案:

答案 0 :(得分:0)

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

之上的[self centerScrollViewContents];
self.scrollView.zoomScale = 2.0;
self.scrollView.zoomScale = 1.0;

问题解决了