RxSwift:如何向 UILabel 添加手势?
RxSwift: How to add gesture to UILabel?
我有一个 label
,isUserInteractionEnabled
设置为 true
。现在,我需要为标签添加 UITapGestureRecognizer
。有没有办法添加Rx
方式
我查看了 RxSwift 库 here。他们没有为添加手势提供任何扩展。 UILabel+Rx
文件只有 text
和 attributedText
.
是否有任何解决方法可以将手势添加到标签?
这些扩展在技术上是 RxCocoa 库的一部分,目前与 RxSwift 打包在一起。
您应该能够将 UITapGestureRecognizer 添加到视图,然后只需在该手势对象上使用 rx.event(rx_event,如果更旧)。
如果您必须在 UILabel 的上下文中执行此操作,那么您可能也需要将其包装在 UILabel+Rx 中,但如果您有更简单的要求,只需在手势上使用 rx.event是一个很好的解决方法。
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)
or事件巧,要return一个事件。即字符串
var buttons: Observable<[UIButton]>!
let stringEvents = buttons
.flatMapLatest({ Observable.merge([=12=].map({ button in
return button.rx.tapGesture().when(.recognized)
.map({ _ in return "tap" })
}) )
})
您可以为点击手势订阅标签
label
.rx
.tapGesture()
.subscribe(onNext: { _ in
print("tap")
}).disposed(by: disposeBag)
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)
标签初始化后点击手势将立即触发!
写乔治·昆汀。所有工作。
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)
我有一个 label
,isUserInteractionEnabled
设置为 true
。现在,我需要为标签添加 UITapGestureRecognizer
。有没有办法添加Rx
方式
我查看了 RxSwift 库 here。他们没有为添加手势提供任何扩展。 UILabel+Rx
文件只有 text
和 attributedText
.
是否有任何解决方法可以将手势添加到标签?
这些扩展在技术上是 RxCocoa 库的一部分,目前与 RxSwift 打包在一起。
您应该能够将 UITapGestureRecognizer 添加到视图,然后只需在该手势对象上使用 rx.event(rx_event,如果更旧)。
如果您必须在 UILabel 的上下文中执行此操作,那么您可能也需要将其包装在 UILabel+Rx 中,但如果您有更简单的要求,只需在手势上使用 rx.event是一个很好的解决方法。
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)
or事件巧,要return一个事件。即字符串
var buttons: Observable<[UIButton]>!
let stringEvents = buttons
.flatMapLatest({ Observable.merge([=12=].map({ button in
return button.rx.tapGesture().when(.recognized)
.map({ _ in return "tap" })
}) )
})
您可以为点击手势订阅标签
label
.rx
.tapGesture()
.subscribe(onNext: { _ in
print("tap")
}).disposed(by: disposeBag)
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)
标签初始化后点击手势将立即触发!
写乔治·昆汀。所有工作。
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)