UIScrollView缩放无法正常工作

5

我有一个UIScrollView,里面有一个UIImageView。由于这是一张大图,我希望用户能够对其进行缩放。UIScrollView只需要在垂直方向上滚动,而不需要在水平方向上滚动。

在添加缩放效果之前,我有以下代码,它可以按照我的要求工作:

-(void)viewDidLoad
{
[scrollView setScrollEnabled:YES];
[scrollView setContentSize:CGSizeMake(320, 1690)];
}

因此,我进行了一些研究,并得出了以下代码,以实现缩放功能:

-(void)viewDidLoad
{
scrollView.scrollEnabled = YES;

[scrollView setContentSize:CGSizeMake(320, 1690)];
scrollView.delegate = self;
//    scrollView.contentSize = instImage.frame.size;
scrollView.minimumZoomScale = scrollView.frame.size.width / instImage.frame.size.width;
scrollView.maximumZoomScale = 2.0;
[scrollView setZoomScale:scrollView.minimumZoomScale];
[[NSRunLoop currentRunLoop] runMode:NSRunLoopCommonModes beforeDate:[NSDate distantFuture]];

 }


 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {

return instImage;
}


 - (CGRect)centeredFrameForScrollView:(UIScrollView *)scroll andUIView:(UIView *)rView {

CGSize boundsSize = scroll.bounds.size;
CGRect frameToCenter = rView.frame;

// center horizontally
if (frameToCenter.size.width < boundsSize.width) {

    frameToCenter.origin.x = ((boundsSize.width - frameToCenter.size.width) / 2);

}else {

    frameToCenter.origin.x = 0;
 }

return frameToCenter;
 }


 - (void)scrollViewDidZoom:(UIScrollView *)scrollV {

instImage.frame = [self centeredFrameForScrollView:scrollV andUIView:instImage];;
 }

现在我遇到了以下问题,但我无法弄清楚问题出在哪里:
1. 当视图刚加载时,在任何缩放之前,滚动视图不能滚动到图像的最底部。 2. 当缩放以进行缩放时,它会左右滚动和上下滚动图像,但仍然不能滚动到图像的底部,但比起开始时滚动更多。 3. 当我缩小时,整个界面都停止了。您无法再缩放或滚动。完全被锁定。
我进行了一些研究并找到了以下帖子。但我不知道在哪里可以找到NSDefaultRunLoopMode,甚至不知道如何搜索它以确定是否可以解决问题。 https://dev59.com/v1jUa4cB1Zd3GeqPQVRx#6384834
4个回答

5
我终于明白了。这个解决方案完美地解决了问题!
在你的.h文件中:
@interface scrollViewController : UIViewController <UIScrollViewDelegate>{

      float oldScale;

      IBOutlet UIScrollView *scrollView;
      IBOutlet UIImageView  *image;
}

@end

只需将要缩放的图片连接到包含它的UIImageView上,然后将UIScrollView连接到您界面上的UIScrollview。保留HTML标记。

在你的.m文件中

@implementation scrollViewController


-(void)viewDidLoad
{
[super viewDidLoad];

scrollView.scrollEnabled = YES;
scrollView.minimumZoomScale=1.0;
scrollView.maximumZoomScale=4.0;
[scrollView setContentSize:CGSizeMake(320, 1700)];
scrollView.delegate=self;

 }

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

 - (void)scrollViewDidEndZooming:(UIScrollView *)scrollV withView:(UIView *)view atScale:(float)scale
 {
     [scrollView setContentSize:CGSizeMake(scale*320, scale*1700)];
 }

  @end

希望这能有所帮助。

谢谢@Mona。我也遇到了同样的问题。它对我有用。 :) - Kirti Nikam

1

以下是我在viewDidLoad中实现滚动视图以滚动大图的方法

UIImage *img = [UIImage imageNamed:@"image_name.png"];
largeImageView = [[UIImageView alloc] initWithImage:img];

[self.view insertSubview: largeImageView atIndex:0];
[(UIScrollView *)self.view setContentSize:[img size]];
[(UIScrollView *)self.view setMaximumZoomScale:2.2];
[(UIScrollView *)self.view setMinimumZoomScale:0.3];
[(UIScrollView *)self.view setCanCancelContentTouches:YES];
[(UIScrollView *)self.view setBounces:YES];
[mapImageView setUserInteractionEnabled:YES];

然后我还有一个viewForZoomingInScrollView方法:

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

你的 scrollViewDidZoom 函数目前是不必要的。我实现了类似的功能,以保持图像在完全可见时居中,但如果我是你,现在我不会担心这个。


1
为确保一下,您是否在 iOS 5 中工作?您的视图控制器是否是 <UIScrollViewDelegate> 的委托? - atreat
当您尝试上述实现时,它的行为如何? - atreat

1

遇到了同样的问题,但找到了一个简单的解决方法,只需将图像视图设置为用户交互启用:

[self.imageView setUserInteractionEnabled:YES];

0
对我来说问题在于我使用了自动布局,但它没有为UIScrollView设置缩放代理。我使用的是一个自定义的UIViewController,它也是UIScrollViewDelegate。我发现你可以在代码中设置代理:
func viewDidLoad() { scrollView.delegate = self }

或者在Storyboard中,选择UIScrollView,在连接检查器中将代理拖动到指向UIViewController。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接