label
をisUserInteractionEnabled
に設定したtrue
があります。次に、ラベルにUITapGestureRecognizer
を追加する必要があります。 Rx
の方法で追加する方法はありますか。
RxSwiftライブラリを見てきました こちら 。ジェスチャを追加するための拡張機能を提供していませんでした。 UILabel+Rx
ファイルには、text
とattributedText
のみが含まれます。
ラベルにジェスチャーを追加する回避策はありますか?
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)
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" })
}) )
})
タップジェスチャーにラベルをサブスクライブできます
label
.rx
.tapGesture()
.subscribe(onNext: { _ in
print("tap")
}).disposed(by: disposeBag)
これらの拡張機能は、技術的には現在RxSwiftにパッケージ化されているRxCocoaライブラリの一部です。
UITapGestureRecognizerをビューに追加し、そのジェスチャオブジェクトでrx.event(古い場合はrx_event)を使用することができるはずです。
UILabelのコンテキストでこれを行う必要がある場合は、UILabel + Rx内にもラップする必要がありますが、ジェスチャでrx.eventを使用するだけの簡単な要件がある場合は、回避策として適切です。