【问题标题】:Passing only some touch events from one view to another view仅将一些触摸事件从一个视图传递到另一个视图
【发布时间】:2017-01-26 22:55:42
【问题描述】:

我正在尝试实现一个可以缩放的图像视图,并且可以在顶部滚动文本。在我的视图控制器中,我有一个包含图像视图的滚动视图并设置为没有问题的缩放。

class ViewController: UIViewController, UIScrollViewDelegate {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var scrollView: UIScrollView!


    //First try getting the image setup correctly

    override func viewDidLoad() {
        super.viewDidLoad()
        setupImageView()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func setupImageView() {

        scrollView.contentSize = imageView.bounds.size
        scrollView.minimumZoomScale = 0.5
        scrollView.maximumZoomScale = 2.0

    }

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


    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)
    }


}

现在我想在顶部放置另一个滚动视图,以便在拖动文本标签时可以滚动,但在触摸图像时仍然可以捏合和缩放。我在图像顶部放置了另一个滚动视图(不在内部),然后在其中放置了一个内容视图和UILabel,就像我在 IB 中设置滚动视图时通常所做的那样。文本当然会滚动,但除非我将内容视图和顶部滚动视图子类化为:

override func pointInside(point: CGPoint, withEvent event: UIEvent?) -> Bool {
        for subview in subviews as [UIView] {
            if !subview.hidden && subview.alpha > 0 && subview.userInteractionEnabled && subview.pointInside(convertPoint(point, toView: subview), withEvent: event) {
                return true
            }
        }
        return false
    }

这会将触摸传递给下面的滚动视图。但是现在我无法滚动文本!有什么方法可以设置这个,所以带有测试的UILabel 没有通过触摸并且可以滚动但外部确实通过并允许图像缩放?对此的任何指示将不胜感激!

【问题讨论】:

    标签: ios swift uiscrollview


    【解决方案1】:

    ScrollView 黑客攻击并不总是最直观的过程。但是在这种情况下,为什么不让你的UIViewController 实现UIScrollViewDelegate 协议并使用UIScrollview 中内置的zoomFeature

    UIScrollView 设置minimumZoomScalemaximumZoomScale 并使您的scrollViewDelegate 实现以下功能并将您希望的imageView 返回到zoom

    func viewForZooming(in: UIScrollView)
    

    API 参考 - UIScrollView - UIScrollViewDelegate

    【讨论】:

    • 我在图像的第一个滚动视图上使用内置缩放。对于我要滚动的文本,图像顶部有第二个滚动视图。我想传递触摸,以便它可以缩放下面的滚动视图,但在触摸文本时不传递它们,因此文本可以滚动。
    猜你喜欢
    • 1970-01-01
    • 2014-06-06
    • 1970-01-01
    • 2011-01-31
    • 2017-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多