【问题标题】:uiscrollview zoom in and zoom out doesn't work properlyuiscrollview 放大和缩小不能正常工作
【发布时间】:2017-05-12 15:00:46
【问题描述】:

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

在添加缩放效果之前,我有以下代码,它可以按我的意愿工作,

-(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. 当我缩小时,整个事情都停止了。你不能放大或缩小,它甚至不再滚动。完全锁定。

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

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

【问题讨论】:

    标签: ios scroll imageview zooming


    【解决方案1】:

    我终于明白了。该解决方案完美运行!

    在您的 .h 文件中

    @interface scrollViewController : UIViewController <UIScrollViewDelegate>{
    
          float oldScale;
    
          IBOutlet UIScrollView *scrollView;
          IBOutlet UIImageView  *image;
    }
    
    @end
    

    只需将图像连接到具有您要放大和缩小的照片且位于滚动视图内的 uiimageview。然后将滚动视图连接到界面上的 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
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢@Mona。我也面临同样的上述问题。这个对我有用。 :)
    【解决方案2】:

    这是我如何实现滚动视图以在 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 功能。我实现了类似的东西,以在整个图像可见时保持图像居中,但现在如果我是你,我不会担心。

    【讨论】:

    • 确定一下,您是否在 iOS 5 中工作?而您的视图控制器是 ? 的代表
    • 当您尝试我上面列出的实现时,它的行为是什么?
    【解决方案3】:

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

    [self.imageView setUserInteractionEnabled:YES];
    

    【讨论】:

      【解决方案4】:

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

      func viewDidLoad() { scrollView.delegate = self }
      

      或者在情节提要中通过选择 UIScrollView 设置委托,然后在连接检查器中拖动委托以指向 UIViewController。

      【讨论】:

        猜你喜欢
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 2018-04-09
        • 2020-01-21
        • 1970-01-01
        • 2019-01-11
        • 2018-11-02
        相关资源
        最近更新 更多