uiscrollview放大和缩小功能无法正常工作

时间:2012-02-21 00:47:58

标签: ios scroll imageview zoom

我有一个uiscrollview,里面有一个uiimageview。我希望习惯能够放大图像,因为它是一个很大的图像。 scrollview只需要垂直滚动而不是水平滚动。

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

-(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. 当视图刚刚在任何夹点之前加载时,scrollview不会一直滚动到图像的末尾。

  2. 当捏合放大时,它会左右上下滚动图像,但它仍然不会一直向下滚动到图像的末尾,但仍然比原来的更多在开始。

  3. 当我缩小时,整个事情就停止了。你不能放大或缩小,它甚至不再滚动。完全锁定。

  4. 我做了一些研究,发现了以下帖子。 https://stackoverflow.com/a/6384834/1103257

    但我不知道在哪里可以找到NSDefaultRunLoopMode,甚至不知道如何搜索它以确定是否可以解决它。

4 个答案:

答案 0 :(得分:5)

我终于明白了。这个解决方案非常有效!

你的.h文件中的

@interface scrollViewController : UIViewController <UIScrollViewDelegate>{

      float oldScale;

      IBOutlet UIScrollView *scrollView;
      IBOutlet UIImageView  *image;
}

@end

并将图像连接到uiimageview,其中包含要放大和缩小的照片,并且位于滚动视图中。然后将scrollview连接到界面上的uiscrollview。

你的.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

希望这会有所帮助。

答案 1 :(得分: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函数。我实现类似的东西,以便在整个图像可见时保持图像居中,但是现在如果我是你,我不会担心。

答案 2 :(得分:1)

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

[self.imageView setUserInteractionEnabled:YES];

答案 3 :(得分:0)

对我来说问题是我使用自动布局而没有为UIScrollView设置缩放委托。我使用的是自定义UIViewController,它也是一个UIScrollViewDelegate。我发现你可以在代码中设置委托:

func viewDidLoad() { scrollView.delegate = self }

或者在故事板中通过选择UIScrolView设置委托,并在连接检查器中将委托拖动到指向UIViewController。