置换所有用户 UIGestures

Displace ALL user UIGestures

我有一个占满屏幕一半的 UIScrollView。在另一半,我有另一个 UIView。

当用户在 UIView 中点击、平移、捏合时;我希望这些手势在 UIScrollView 中生效,就像它们发生在那里一样。

这可能吗?

免责声明:这是一个相当轻量级的解决方案,但根据您想要实现的目标,它可能已经足够了。

您可以尝试子类化 UIScrollView 以提供一些自定义识别,以识别任何给定的触摸事件是滚动视图框架的 "in" 还是 "out",并简单地声明它 "in" 每当触摸发生在屏幕的下半部分,或任何其他 "control area" 您想要的地方。

 class CustomScrollView: UIScrollView {

     var targetFrame: CGRect? // set this to the frame of your "Other View"

     override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
         return targetFrame?.contains(point) == true
     }
 }

注意:如果您不提供 CGRect 而只是 return true,则在屏幕上任意位置的拖动或捏合手势都会在 scrollView 上注册。

我创建了一个名为 PassGesturesView 的 UIView,它覆盖了 hitTest 方法。接收手势的 UIView,必须扩展它:

//
//  PassGesturesView.swift
//  pass-gestures
//
//  Created by Sergio Rodríguez Rama on 23/11/2019.
//  Copyright © 2019 Sergio Rodríguez Rama. All rights reserved.
//

import UIKit

class PassGesturesView: UIView {

    var sisterView: UIView?

    override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
        return sisterView
    }

    // MARK: - Init

    override init(frame: CGRect) {
        super.init(frame: frame)
    }

    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
    }

}

然后,只需将滚动视图(或您要发送手势的任何其他 UIView)设置为您的 PassGesturesView 的姐妹视图。

passGesturesView.sisterView = scrollView