2012-02-21 68 views
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. 当视图刚刚被加载之前,任何捏缩放scrollview不滚动一直到图像的末尾。

  2. 当捏合放大时,它会左右滚动并上下滚动图像,但它仍然不会向下滚动到图像的末端,但仍然超过原来的大小开始时。

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

我做了一些研究并找到了以下文章。 https://stackoverflow.com/a/6384834/1103257

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

回答

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 

希望这会有所帮助。

+0

谢谢@Mona。我也面临同样的上述问题。这个对我有用。 :) – iKT 2013-10-30 13:08:05

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功能是在这一点上不必要的。我实现了类似的功能,在整个图像可见时保持图像居中,但现在如果我是你,我不会担心。

+0

没有按预期工作 – Mona 2012-02-21 02:24:19

+1

只是可以肯定的是,你在iOS 5中工作吗?而你的视图控制器是的代表? – atreat 2012-02-21 02:26:17

+0

是的,对于这两个问题 – Mona 2012-02-21 09:11:01

1

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

[self.imageView setUserInteractionEnabled:YES]; 
0

对我来说,问题是我在使用自动布局,它不设置变焦委托UIScrollView。我使用的是也是UIScrollViewDelegate的自定义UIViewController。我发现你可以在代码中设置委托:

func viewDidLoad() { scrollView.delegate = self } 

或在选择UIScrolView和连接检查拖动委托设置委托故事板指向的UIViewController。