31

我有一个labelwith isUserInteractionEnabledset to true。现在,我需要添加UITapGestureRecognizer标签。有没有办法加进去Rx

我在这里查看了 RxSwift 库。他们没有为添加手势提供任何扩展。该UILabel+Rx文件只有textattributedText

是否有任何解决方法可以将手势添加到标签?

4

6 回答 6

73

UILabel 没有配置开箱即用的点击手势识别器,这就是为什么 RxCocoa 不提供直接在标签上收听手势的方法。您必须自己添加手势识别器。然后你可以使用 Rx 来观察来自识别器的事件,像这样:

let disposeBag = DisposeBag()
let label = UILabel()
label.text = "Hello World!"

let tapGesture = UITapGestureRecognizer()
label.addGestureRecognizer(tapGesture)

tapGesture.rx.event.bind(onNext: { recognizer in
    print("touches: \(recognizer.numberOfTouches)") //or whatever you like
}).disposed(by: disposeBag)
于 2017-06-23T16:08:33.407 回答
15

Swift 5(使用RxGesture库)。

最好和最简单的选择恕我直言。

     label
        .rx
        .tapGesture()
        .when(.recognized) // This is important!
        .subscribe(onNext: { [weak self] _ in
            guard let self = self else { return }
            self.doWhatYouNeedToDo()
        })
        .disposed(by: disposeBag)

小心!如果您不使用.when(.recognized)点击手势,标签初始化后将立即触发!

于 2020-02-07T13:47:08.173 回答
12

Swift 4与 RxCocoa + RxSwift + RxGesture

let disposeBag = DisposeBag()
let myView = UIView()

myView.rx
  .longPressGesture(numberOfTouchesRequired: 1,
                    numberOfTapsRequired: 0,
                    minimumPressDuration: 0.01,
                    allowableMovement: 1.0)
            .when(.began, .changed, .ended)
            .subscribe(onNext: { pan in
                let view = pan.view
                let location = pan.location(in: view)
                switch pan.state {
                case .began:
                    print("began")
                case .changed:
                    print("changed \(location)")
                case .ended:
                    print("ended")
                default:
                    break
                }
            }).disposed(by bag)

或者

myView.rx
.gesture(.tap(), .pan(), .swipe([.up, .down]))
.subscribe({ onNext: gesture in
    switch gesture {
    case .tap: // Do something
    case .pan: // Do something
    case .swipeUp: // Do something 
    default: break       
    }        
}).disposed(by: bag)

事件聪明,返回一个事件。即字符串

var buttons: Observable<[UIButton]>!

let stringEvents = buttons
        .flatMapLatest({ Observable.merge($0.map({ button in
            return button.rx.tapGesture().when(.recognized)
                .map({ _ in return "tap" })
            }) )
        })
于 2018-06-07T21:28:34.580 回答
1

这些扩展在技术上是 RxCocoa 库的一部分,该库目前与 RxSwift 一起打包。

您应该能够将 UITapGestureRecognizer 添加到视图中,然后只需在该手势对象上使用 rx.event(如果较旧,则为 rx_event)。

如果您必须在 UILabel 的上下文中执行此操作,那么您可能也需要将其包装在 UILabel+Rx 中,但如果您有更简单的要求,只需在手势上使用 rx.event 应该是一个很好的解决方法。

于 2017-06-21T09:32:37.587 回答
1

您可以为点击手势订阅标签

    label
        .rx
        .tapGesture()
        .subscribe(onNext: { _ in
            print("tap")
        }).disposed(by: disposeBag)
于 2019-07-25T12:12:56.487 回答
1

正如写乔治昆汀。所有工作。

    view.rx
        .longPressGesture(configuration: { gestureRecognizer, delegate in
            gestureRecognizer.numberOfTouchesRequired = 1
            gestureRecognizer.numberOfTapsRequired = 0
            gestureRecognizer.minimumPressDuration = 0.01
            gestureRecognizer.allowableMovement = 1.0
        })
        .when(.began, .changed, .ended)
        .subscribe(onNext: { pan in
            let view = pan.view
            let location = pan.location(in: view)
            switch pan.state {
            case .began:
                print(":DEBUG:began")
            case .changed:
                print(":DEBUG:changed \(location)")
            case .ended:
                print(":DEBUG:end \(location)")
                nextStep()
            default:
                break
            }
        })
        .disposed(by: stepBag)
于 2021-04-28T16:27:39.323 回答