web-dev-qa-db-ja.com

RxSwift:ジェスチャーをUILabelに追加する方法は?

labelisUserInteractionEnabledに設定したtrueがあります。次に、ラベルにUITapGestureRecognizerを追加する必要があります。 Rxの方法で追加する方法はありますか。

RxSwiftライブラリを見てきました こちら 。ジェスチャを追加するための拡張機能を提供していませんでした。 UILabel+Rxファイルには、textattributedTextのみが含まれます。

ラベルにジェスチャーを追加する回避策はありますか?

12
Rugmangathan

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)
37
RvdB

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" })
            }) )
        })
11
George Quentin

タップジェスチャーにラベルをサブスクライブできます

    label
        .rx
        .tapGesture()
        .subscribe(onNext: { _ in
            print("tap")
        }).disposed(by: disposeBag)
1
Booharin

これらの拡張機能は、技術的には現在RxSwiftにパッケージ化されているRxCocoaライブラリの一部です。

UITapGestureRecognizerをビューに追加し、そのジェスチャオブジェクトでrx.event(古い場合はrx_event)を使用することができるはずです。

UILabelのコンテキストでこれを行う必要がある場合は、UILabel + Rx内にもラップする必要がありますが、ジェスチャでrx.eventを使用するだけの簡単な要件がある場合は、回避策として適切です。

1
Evan Anger