web-dev-qa-db-fra.com

RxSwift: Comment ajouter un geste à UILabel?

J'ai une label avec isUserInteractionEnabled définie sur true. Maintenant, je dois ajouter UITapGestureRecognizer pour l'étiquette. Existe-t-il un moyen d’ajouter de manière Rx.

J'ai regardé la bibliothèque RxSwift ici . Ce qu'ils n'ont pas fourni d'extension pour l'ajout de geste. Le fichier UILabel+Rx contient uniquement text et attributedText.

Existe-t-il une solution de contournement pour ajouter un geste à une étiquette?

8
Rugmangathan

Un UILabel n’est pas configuré avec un identificateur de gestes tactiles prêt à l’emploi, c’est pourquoi RxCocoa ne permet pas d’écouter un geste directement sur l’étiquette. Vous devrez ajouter le dispositif de reconnaissance de geste vous-même. Vous pouvez ensuite utiliser Rx pour observer les événements à partir du programme de reconnaissance, comme suit:

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

Swift 4 avec 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)

ou

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)

ou event malin, pour retourner un évènement. i.e string

var buttons: Observable<[UIButton]>!

let stringEvents = buttons
        .flatMapLatest({ Observable.merge($0.map({ button in
            return button.rx.tapGesture().when(.recognized)
                .map({ _ in return "tap" })
            }) )
        })
5
George Quentin

Ces extensions font techniquement partie de la librairie RxCocoa qui est actuellement fournie avec RxSwift.

Vous devriez pouvoir ajouter le UITapGestureRecognizer à la vue, puis utilisez simplement le fichier rx.event (rx_event si ancien) sur cet objet de geste.

Si vous devez le faire dans le contexte de UILabel, vous devrez peut-être aussi l'envelopper dans UILabel + Rx, mais si vous avez des exigences plus simples, il suffit d'utiliser le paramètre rx.event sur le geste.

0
Evan Anger