在UIScrollView中缩放UIImageView超出范围

Ser*_*yov 9 iphone cocoa-touch objective-c uiscrollview ios

我已经成功实现UIImageView了我的缩放,UIScrollView但我遇到了一个令我恼火的奇怪问题.

基本上,当我放大图像时

在此输入图像描述

我可以平移视图实际滚动出图像边框,我留下了这样的黑色区域: 在此输入图像描述

随着我放大更多,我可以让黑色边框填满整个屏幕!同时在iPhone Photo应用程序中,您无法缩小实际图像.我的实施中有什么问题?

它看起来像这样:

UIImage *imageToDisplay = [UIImage imageWithData:tmpImageData];
imageViewMain.image = imageToDisplay;
imageViewMain.frame = CGRectMake(0, 0, scrollViewMain.frame.size.width, scrollViewMain.frame.size.height);
imageViewMain.contentMode = UIViewContentModeScaleAspectFit;

scrollViewMain.delegate = self;
scrollViewMain.minimumZoomScale = 1.0;
scrollViewMain.maximumZoomScale = 9.0;
scrollViewMain.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
scrollViewMain.contentSize = imageViewMain.frame.size;

[self.view addSubview:scrollViewMain];
[scrollViewMain addSubview:imageViewMain];
Run Code Online (Sandbox Code Playgroud)

我也实现了这个方法:

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageViewMain;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

编辑:当我第一次加载视图时,我收缩我的UIImageView以适应滚动视图,图像如下所示:

在此输入图像描述

Par*_*shi 2

只需尝试此代码....在需要的地方更改一些代码...用于UIPinchGestureRecognizer您的UIImageView然后将此图像添加到您的UIScrollView如下所示..

UIImageView *img = [[UIImageView alloc]init];
img.image = [UIImage imageWithData:tmpImageData];
img.userInteractionEnabled = YES;
img.frame = CGRectMake(210,100, 200, 200);/// define frame which you want...
[img sizeToFit];

UIPinchGestureRecognizer *pinchRecognizer = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(scale:)];
[pinchRecognizer setDelegate:self];
[img addGestureRecognizer:pinchRecognizer];
[pinchRecognizer release];
[scrollViewMain addSubview:img];
[scrollViewMain bringSubviewToFront:img];
[img release]; 
Run Code Online (Sandbox Code Playgroud)

并将以下代码粘贴到您的 .m 文件中...

#pragma mark GestureRecognizer Methods
-(void)scale:(id)sender 
{
    UIView *imgTempGest = [sender view];
    if([(UIPinchGestureRecognizer*)sender state] == UIGestureRecognizerStateEnded) 
    {
        lastScale = 1.0;
        return;
    }
    CGFloat scale = 1.0 - (lastScale - [(UIPinchGestureRecognizer*)sender scale]);

    CGAffineTransform currentTransform = [(UIPinchGestureRecognizer*)sender view].transform;
    CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);

    [[(UIPinchGestureRecognizer*)sender view] setTransform:newTransform];

    [imgTempGest setTransform:newTransform];

    lastScale = [(UIPinchGestureRecognizer*)sender scale];
}
Run Code Online (Sandbox Code Playgroud)

对于 LastScale,只需在.h文件中定义该变量,如下所示......

CGFloat lastScale;
Run Code Online (Sandbox Code Playgroud)

我希望这对你有帮助......