【问题标题】:Zooming UIImageView in UIScrollView goes out of bounds在 UIScrollView 中缩放 UIImageView 超出范围
【发布时间】:2013-03-12 07:17:12
【问题描述】:

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

基本上,当我放大图像时

我可以平移视图以实际滚动到图像边框之外,并且留下一个黑色区域,如下所示:

当我进一步放大时,我可以让黑色边框填满整个屏幕! 同时在 iPhone 照片应用程序中,您无法缩小实际图像。我的实现有什么问题?

看起来像这样:

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

而且我也实现了这个方法:

- (UIView*)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
    return imageViewMain;
}

提前致谢!

编辑: 当我第一次加载视图时,我缩小 UIImageView 以适应滚动视图,图像看起来像这样:

【问题讨论】:

  • 为什么你使用滚动视图你可以用 UIPinchGestureRecognizer 来缩放图像
  • @SAMIRRATHOD 你那臭名昭著的手势识别器会允许我在这里和那里拖动 imageView 吗?我非常怀疑,先生。
  • 是的,您可以使用 GestureRecognizer 拖动您的图像视图
  • @SAMIRRATHOD 我向你保证,使用 UIScrollView 是一种更好的方法。
  • Sergious:也许这个GitHib project 可以帮助你。请试一试。我没有查看您的完整代码,所以只是建议链接。

标签: iphone ios objective-c cocoa-touch uiscrollview


【解决方案1】:

试试这个代码....在需要的地方更改一些代码...使用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]; 

只需将下面的代码粘贴到您的 .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];
}

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

CGFloat lastScale;

希望对你有帮助...

【讨论】:

  • 就我而言,这不会让我“拖动”图像,对吧?
  • 此代码对放大缩小 UIImage 没有帮助,但如果您想拖放图像,则需要另一个代码,伙计..
  • 那么,你的答案是错误的。这就是我使用滚动视图的原因。滚动内容而不仅仅是缩放它!
  • 老兄,您必须为此处的图像提供两种功能,您的一个代码不能使用整个功能。此代码放大,缩小您的图像,拖放我还有另一个代码这也是拖放您的同一张图片,两者都有效。
  • 什么样的设施,对不起?
【解决方案2】:

原始图像的顶部和底部是否包含该边框?如果实际图像包含黑色顶部和底部黑色区域,您可以在那里使用相同的代码输出没有错误。并添加此代码,

scrollView.scrollEnabled = YES

也变了,

scrollView.contentSize = imageView.bounds.size;

您还提供了 9 的缩放比例。您需要这么多吗?将其更改为 3 或 4 并尝试。您的问题将得到解决

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-12
    • 2019-05-23
    • 1970-01-01
    • 2012-08-16
    • 2012-11-24
    • 2017-01-06
    • 2017-09-23
    • 1970-01-01
    相关资源
    最近更新 更多