【问题标题】:Double Tap to Zoom In/Out双击放大/缩小
【发布时间】:2017-10-27 17:08:21
【问题描述】:

我有一个应用程序,当用户从文本列表视图屏幕按下按钮时,它会显示一堆图片。我有一个特定的子类,允许用户捏合和放大,但我很好奇我需要在我的特定 swift 文件中输入什么代码以允许用户双击放大和缩小。使用此代码时出现三个错误。两个说“'ZoomingScrollView'类型的值没有成员'scrollview'或'imageview'”并且“'CGRectZero'在Swift中不可用”我允许用户放大的子类的代码以及我的代码如下我用来双击放大。

import UIKit

class ZoomingScrollView: UIScrollView, UIScrollViewDelegate {

 @IBOutlet weak var viewForZooming: UIView? = nil {
didSet {
    self.delegate = self
} }

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

@IBAction func userDoubleTappedScrollview(recognizer:  UITapGestureRecognizer) {
if let scrollV = self.scrollview {
    if (scrollV.zoomScale > scrollV.minimumZoomScale) {
        scrollV.setZoomScale(scrollV.minimumZoomScale, animated: true)
    }
    else {
        //(I divide by 3.0 since I don't wan't to zoom to the max upon the double tap)
        let zoomRect = self.zoomRectForScale(scrollV.maximumZoomScale / 3.0, center: recognizer.locationInView(recognizer.view))
        self.scrollview?.zoomToRect(zoomRect, animated: true)
    }
} }

func zoomRectForScale(scale : CGFloat, center : CGPoint) -> CGRect {
var zoomRect = CGRectZero
if let imageV = self.imageView {
    zoomRect.size.height = imageV.frame.size.height / scale;
    zoomRect.size.width  = imageV.frame.size.width  / scale;
    let newCenter = imageV.convertPoint(center, fromView: self.scrollview)
    zoomRect.origin.x = newCenter.x - ((zoomRect.size.width / 2.0));
    zoomRect.origin.y = newCenter.y - ((zoomRect.size.height / 2.0));
}
return zoomRect; }}

【问题讨论】:

  • CGRectZero 在 Swift 3 中是 .zero
  • @leo 或者更确切地说,在这种情况下,它必须是 CGRect.zero,因为无法推断类型。
  • var zoomRect: CGRect = .zero

标签: ios swift zooming pinchzoom


【解决方案1】:

问题似乎是您从具有 scrollView 和 imageView 插座的视图控制器中复制了一些代码。我猜你的 viewForZooming: UIView 是你正在放大的图像视图。您也不必再引用 self.scrollView 因为 self 是滚动视图,因为您是滚动视图的子类:) 我认为下面的代码应该可以解决您的问题(注意:它采用最新的 swift 语法。您发布的是不是,所以你可能必须在必要时将代码切换回旧样式。不过你应该尝试使用最新的 Swift)。祝您好运,如果您有任何问题,请告诉我。

import UIKit

class ZoomingScrollView: UIScrollView, UIScrollViewDelegate {

    @IBOutlet weak var viewForZooming: UIView? = nil {
        didSet {
            self.delegate = self
        } }

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

    @IBAction func userDoubleTappedScrollview(recognizer:  UITapGestureRecognizer) {
        if (zoomScale > minimumZoomScale) {
            setZoomScale(minimumZoomScale, animated: true)
        }
        else {
            //(I divide by 3.0 since I don't wan't to zoom to the max upon the double tap)
            let zoomRect = zoomRectForScale(scale: maximumZoomScale / 3.0, center: recognizer.location(in: recognizer.view))
            zoom(to: zoomRect, animated: true)
        }
    }

    func zoomRectForScale(scale : CGFloat, center : CGPoint) -> CGRect {
        var zoomRect = CGRect.zero
        if let imageV = self.viewForZooming {
            zoomRect.size.height = imageV.frame.size.height / scale;
            zoomRect.size.width  = imageV.frame.size.width  / scale;
            let newCenter = imageV.convert(center, from: self)
            zoomRect.origin.x = newCenter.x - ((zoomRect.size.width / 2.0));
            zoomRect.origin.y = newCenter.y - ((zoomRect.size.height / 2.0));
        }
        return zoomRect;
    }
}

【讨论】:

  • 代码没有错误!惊人的!但是,当我尝试单击按钮以显示具有 UIScroll 和 Delegate 的 jpeg 的活动时,应用程序崩溃。我是否需要将“点击手势识别器”分配给任何东西?
  • 它在哪里崩溃?或者当它崩溃时它在控制台中说什么?您必须在您的 xib/storyboard 中设置识别器并将该操作与它挂钩。
  • 我刚刚开始着手处理这个问题,并且取得了一些进展。如果我向您发送有关崩溃及其内容的最新信息,您介意帮助我吗?
  • 我试一试
  • 谢谢!实际上,不久前我提出了一个新问题。链接为:stackoverflow.com/questions/48942010/zoom-in-on-imageview
猜你喜欢
  • 2012-02-19
  • 2013-03-28
  • 2019-09-25
  • 1970-01-01
  • 2013-12-18
  • 2011-12-03
  • 2022-08-12
  • 1970-01-01
  • 2011-04-27
相关资源
最近更新 更多