【问题标题】:How to enable zoom in UIScrollView如何在 UIScrollView 中启用缩放
【发布时间】:2011-04-09 02:50:08
【问题描述】:

如何启用 UIScrollView 的放大功能?

【问题讨论】:

    标签: iphone uiscrollview


    【解决方案1】:

    答案是here

    滚动视图还可以处理内容的缩放和平移。当用户做出捏合或张开手势时,滚动视图会调整内容的偏移量和比例。当手势结束时,管理内容视图的对象应根据需要更新内容的子视图。 (请注意,手势可以结束并且手指仍然可以向下。)在手势进行时,滚动视图不会向子视图发送任何跟踪调用。

    UIScrollView 类可以有一个必须采用 UIScrollViewDelegate 协议的委托。要使缩放和平移工作,代理必须同时实现 viewForZoomingInScrollView: 和 scrollViewDidEndZooming:withView:atScale:;另外,最大(maximumZoomScale)和最小(minimumZoomScale)缩放比例必须不同。

    所以:

    1. 您需要一个实现 UIScrollViewDelegate 并在您的 UIScrollView 实例上设置为 delegate 的委托
    2. 在您的委托上,您必须实现一种方法:viewForZoomingInScrollView:必须返回您对缩放感兴趣的内容视图)。您还可以选择实现scrollViewDidEndZooming:withView:atScale:
    3. 在您的UIScrollView 实例上,您必须将minimumZoomScalemaximumZoomScale 设置为不同(默认为1.0)。

    注意:有趣的是,如果你想打破缩放。在viewForZooming... 方法中返回nil 是否足够?它确实打破了缩放,但一些手势会被弄乱(两根手指)。因此,要中断缩放,您应该将最小和最大缩放比例设置为 1.0。

    【讨论】:

    • 很好的答案——这正是我所需要的。 (另外,我不必去看视频!;)
    • 谢谢。最重要的是这里的第二步,在原来的答案中没有找到
    • 这应该被标记为真正的答案!
    • appcoda.com/uiscrollview-introduction 也有一个很好的教程,描述了如何以编程方式设置最小和最大缩放级别,通过点击缩放等。
    • 我不明白为什么这些控件不具备所有功能
    【解决方案2】:

    阅读此 Ray Wenderlich 教程:

    http://www.raywenderlich.com/76436/use-uiscrollview-scroll-zoom-content-swift

    如果您按照“滚动和缩放较大的图像”部分进行操作,它将获得一张图像并让您可以捏合和缩放。

    如果链接被更改,以下是主要信息: 将此代码放在您的视图控制器中(这会设置主要功能):

    override func viewDidLoad() {
      super.viewDidLoad()
    
      // 1
      let image = UIImage(named: "photo1.png")!
      imageView = UIImageView(image: image)
      imageView.frame = CGRect(origin: CGPoint(x: 0, y: 0), size:image.size)
      scrollView.addSubview(imageView)
    
      // 2
      scrollView.contentSize = image.size
    
      // 3
      var doubleTapRecognizer = UITapGestureRecognizer(target: self, action: "scrollViewDoubleTapped:")
      doubleTapRecognizer.numberOfTapsRequired = 2
      doubleTapRecognizer.numberOfTouchesRequired = 1
      scrollView.addGestureRecognizer(doubleTapRecognizer)
    
      // 4
      let scrollViewFrame = scrollView.frame
      let scaleWidth = scrollViewFrame.size.width / scrollView.contentSize.width
      let scaleHeight = scrollViewFrame.size.height / scrollView.contentSize.height
      let minScale = min(scaleWidth, scaleHeight);
      scrollView.minimumZoomScale = minScale;
    
      // 5
      scrollView.maximumZoomScale = 1.0
      scrollView.zoomScale = minScale;
    
      // 6
      centerScrollViewContents()
    }
    

    将此添加到类中:

    func centerScrollViewContents() {
      let boundsSize = scrollView.bounds.size
      var contentsFrame = imageView.frame
    
      if contentsFrame.size.width < boundsSize.width {
        contentsFrame.origin.x = (boundsSize.width - contentsFrame.size.width) / 2.0
      } else {
        contentsFrame.origin.x = 0.0
      }
    
      if contentsFrame.size.height < boundsSize.height {
        contentsFrame.origin.y = (boundsSize.height - contentsFrame.size.height) / 2.0
      } else {
        contentsFrame.origin.y = 0.0
      }
    
      imageView.frame = contentsFrame
    }
    

    如果您希望识别双击手势,则如下:

    func scrollViewDoubleTapped(recognizer: UITapGestureRecognizer) {
      // 1        
      let pointInView = recognizer.locationInView(imageView)
    
      // 2
      var newZoomScale = scrollView.zoomScale * 1.5
      newZoomScale = min(newZoomScale, scrollView.maximumZoomScale)
    
      // 3
      let scrollViewSize = scrollView.bounds.size
      let w = scrollViewSize.width / newZoomScale
      let h = scrollViewSize.height / newZoomScale
      let x = pointInView.x - (w / 2.0)
      let y = pointInView.y - (h / 2.0)
    
      let rectToZoomTo = CGRectMake(x, y, w, h);
    
      // 4
      scrollView.zoomToRect(rectToZoomTo, animated: true)
    }
    

    如果您想了解更多详细信息,请阅读教程,但这几乎涵盖了它。

    【讨论】:

    • 虽然这可能是一个很好的答案,但它本质上是一个“仅链接” 的答案。您应该包含链接中的一些信息,以便如果链接背后的信息曾经更改/丢失,答案仍然有意义。见this link
    【解决方案3】:

    确保将 viewController 设置为 scrollViews 委托并实现:

    func viewForZooming(in scrollView: UIScrollView) -> UIView? {
        return imageView
    }
    

    【讨论】:

      【解决方案4】:

      我认为这不适用于 iOS 5.0 和 Xcode 4.3+ 我在这里寻找相同的东西,我发现这是用于图像的,但它可能会对您有所帮助。

      http://www.youtube.com/watch?v=Ptm4St6ySEI

      【讨论】:

      • 无需设置滚动视图的内容大小,上述解决方案在 Xcode 4.3+ 和 iOS 5.0 上也能完美运行
      • 虽然这可能是一个很好的答案,但它本质上是一个“仅链接” 的答案。您应该包含链接中的一些信息,以便如果链接背后的信息曾经更改/丢失,答案仍然有意义。见this link
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多