Я создаю приложение с быстрым.
Я сделал дочерние классы из UIView. Сделав их и написав туда какие-то процессы, я чувствую, что хочу, чтобы они обнаруживали сенсорные события.
Но они не дети UIButton.
Я бы не хотел заставлять их обнаруживать события касания с помощью UIGestureRecognizer. Потому что UIGestureRecognizer нужно использовать в UIViewController. Я хотел бы написать коды обнаружения касания только в представлении.
Есть ли способы обнаружения сенсорных событий только в UIView?
@Kamran ты знаешь как?
Неправда, что UIGestureRecognizer нужно использовать в UIViewController. Вы можете настроить свой пользовательский класс UIView для установки жеста касания в своем собственном коде установки, сделав себя целью методов жестов.





Вы можете добавить UIGestureRecognizer в UIView. Другой способ, которым вы можете добавить невидимый UIButton поверх вашего UIView.
Если вы используете подкласс UIView, вы можете использовать что-то следующее и обрабатывать нажатие в закрытии action
class TappableView: UIView {
var action: (()->())? = nil
init(frame: CGRect) {
super.init(frame: frame)
initialization()
}
func initialization() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
addGestureRecognizer(tapGesture)
}
@objc private func tapGesture() {
action?()
}
}
Вы можете просто добавить жест в подкласс UIView, как уже было сказано, но если вы хотите включить жест в определение подкласса и сделать его более модульным, вы можете использовать механизм отправки уведомлений для трансляции жеста в зарегистрированное представление. контроллер.
Сначала вы создаете имя для уведомления:
extension Notification.Name {
static let CustomViewTapped = Notification.Name("CustomViewTapped")
}
Затем вы добавляете жест в свой пользовательский вид:
class CustomView: UIView {
override init(frame: CGRect) {
super.init(frame: frame)
let tap = UIGestureRecognizer(target: self, action: #selector(tapped))
self.addGestureRecognizer(tap)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
@objc func tapped(_ sender: UIGestureRecognizer) {
NotificationCenter.default.post(name: .CustomViewTapped, object: self)
}
}
И, наконец, наблюдайте за трансляцией с вашего контроллера представления:
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
NotificationCenter.default.addObserver(self, selector: #selector(customViewTapped), name: .CustomViewTapped, object: nil)
let customView = CustomView()
self.view.addSubview(customView)
}
@objc func customViewTapped(_ sender: UIGestureRecognizer) {
}
}
class childView: UIView {
var action: (()->())? = nil
init(frame: CGRect) {
super.init(frame: frame)
initialization()
}
func initialization() {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(handleTap))
addGestureRecognizer(tapGesture)
}
@objc private func tapGesture() {
//Action called here
}
}
//MARK:- View Tap Handler
extension UIView {
private struct OnClickHolder {
static var _closure:()->() = {}
}
private var onClickClosure: () -> () {
get { return OnClickHolder._closure }
set { OnClickHolder._closure = newValue }
}
func onTap(closure: @escaping ()->()) {
self.onClickClosure = closure
isUserInteractionEnabled = true
let tap = UITapGestureRecognizer(target: self, action: #selector(onClickAction))
addGestureRecognizer(tap)
}
@objc private func onClickAction() {
onClickClosure()
}
}
Использование:
override func viewDidLoad() {
super.viewDidLoad()
let view = UIView(frame: .init(x: 0, y: 0, width: 80, height: 50))
view.backgroundColor = .red
view.onTap {
print("View Tapped")
}
}