【问题标题】:scrollViewDidEndZooming not called while zooming in a UIScrollView放大 UIScrollView 时未调用 scrollViewDidEndZooming
【发布时间】:2016-12-19 18:46:57
【问题描述】:

这可能是 Xcode 错误?我在 UIScrollView 中有一个 UIImage 以编程方式在代码中完成。用户可以使用缩放手势或双击图像来放大图像。这部分一切正常。

接下来,我尝试使用以下函数scrollViewDidEndZooming 在缩放手势或双击后检测滚动视图何时完成缩放。但是,scrollViewDidEndZooming 永远不会被调用,并且不会打印 I just finished zooming!

代码不工作:

func scrollViewDidEndZooming(scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
    print("I just finished zooming!")
}

问题:

这里可能发生了什么,为什么不是scrollViewDidEndZooming(...) 被叫了?

注意:我没有运气就参考了以下文档。 https://developer.apple.com/reference/uikit/uiscrollviewdelegate/1619407-scrollviewdidendzooming


完整代码:

class ScrollViewController: UIViewController, UIScrollViewDelegate {
    var scrollView: UIScrollView!
    var imageView: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        imageView = UIImageView(image: UIImage(named: "image.png"))

        scrollView = UIScrollView(frame: view.bounds)
        scrollView.backgroundColor = UIColor.blackColor()
        scrollView.contentSize = imageView.bounds.size
        scrollView.autoresizingMask = [UIViewAutoresizing.FlexibleWidth, UIViewAutoresizing.FlexibleHeight]

        scrollView.contentOffset = CGPoint(x: 1000, y: 450)

        scrollView.addSubview(imageView)
        view.addSubview(scrollView)

        scrollView.delegate = self
        setZoomScale()
        setupGestureRecognizer()
    }

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

    override func viewWillLayoutSubviews() {
        setZoomScale()
    }

    func setZoomScale() {
        let imageViewSize = imageView.bounds.size
        let scrollViewSize = scrollView.bounds.size
        let widthScale = scrollViewSize.width / imageViewSize.width
        let heightScale = scrollViewSize.height / imageViewSize.height

        scrollView.minimumZoomScale = min(widthScale, heightScale)
        scrollView.zoomScale = 1.0
    }

    func scrollViewDidZoom(scrollView: UIScrollView) {
        let imageViewSize = imageView.frame.size
        let scrollViewSize = scrollView.bounds.size
        let verticalPadding = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
        let horizontalPadding = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0

        scrollView.contentInset = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
    }

    func scrollViewDidEndZooming(scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
        print("I just finished zooming!")
    }

    func setupGestureRecognizer() {
        let doubleTap = UITapGestureRecognizer(target: self, action: "handleDoubleTap:")
        doubleTap.numberOfTapsRequired = 2
        scrollView.addGestureRecognizer(doubleTap)
    }

    func handleDoubleTap(recognizer: UITapGestureRecognizer) {
        if (scrollView.zoomScale > scrollView.minimumZoomScale) {
            scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
        } else {
            scrollView.setZoomScale(scrollView.maximumZoomScale, animated: true)
        }
    }
}

【问题讨论】:

    标签: ios swift xcode optimization uiscrollview


    【解决方案1】:

    你犯了一个小错误。试试这个代码:

        func scrollViewDidEndZooming(scrollView: UIScrollView, withView view: UIView?, atScale scale: CGFloat) {
        print("I just finished zooming!")
    }
    

    【讨论】:

    • 我不知道正确的术语是什么来捕捉被代码蒙蔽的感觉,但我遭受了这种痛苦。非常感谢,成功了!
    • 有什么区别?
    • @WilliamEntriken 我想,问题是苹果改变了 API 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多