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?
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)
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" })
}) )
})
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.