Gesture & Keyboard
๐ ์ ์ค์ฒ & ํค๋ณด๋ RxCocoa ํจํด ๊ฐ์ด๋
โUIKit ์ด๋ฒคํธ๋ฅผ ์ ์ธํ์ผ๋ก ๋ค๋ฃจ์.โ
์ด ๋ฌธ์์์๋ **์ ์ค์ฒ ์ธ์๊ธฐ(Gesture Recognizer)**์ ํค๋ณด๋ ๋ ธํฐํผ์ผ์ด์ ์ RxCocoa๋ก ์ฐ์ํ๊ฒ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ํ๊ตญ์ด๋ก ์ ๋ฆฌํฉ๋๋ค.
1๏ธโฃ UITapGestureRecognizer ๋ฐ์ธ๋ฉ
let tap = UITapGestureRecognizer()
view.addGestureRecognizer(tap)
tap.rx.event
.withUnretained(self)
.subscribe(onNext: { vc, _ in
vc.view.endEditing(true) // ํญ ์ ํค๋ณด๋ ๋ด๋ฆฌ๊ธฐ
})
.disposed(by: bag)
rx.event
๋Observable<UITapGestureRecognizer>
withUnretained
๋ก ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐฉ์ง๋์ผ ํจํด์ผ๋ก UISwipeGestureRecognizer, UIPanGestureRecognizer ํ์ฉ ๊ฐ๋ฅ
ํ ๋ฒ๋ง ๋์์ํค๊ธฐ
tap.rx.event
.take(1)
.bind(to: viewModel.firstTap)
.disposed(by: bag)
2๏ธโฃ RxGesture ๋ผ์ด๋ธ๋ฌ๋ฆฌ (์ ํ)
RxGesture๋
view.rx.tapGesture()
๋ฑ ๊ฐ๋จ ๋ฌธ๋ฒ ์ ๊ณต์์:
view.rx.tapGesture() .when(.recognized) .subscribe(onNext: { _ in print("Tapped!") }) .disposed(by: bag)
3๏ธโฃ ํค๋ณด๋ ๋์ด ์คํธ๋ฆผํ
extension Reactive where Base: UIView {
var keyboardHeight: Observable<CGFloat> {
let willShow = NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.map { ($0.userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? CGRect)?.height ?? 0 }
let willHide = NotificationCenter.default.rx.notification(UIResponder.keyboardWillHideNotification)
.map { _ in CGFloat(0) }
return Observable.merge(willShow, willHide)
.distinctUntilChanged()
}
}
์ฌ์ฉ ์
view.rx.keyboardHeight
.observe(on: MainScheduler.instance)
.subscribe(onNext: { [weak self] height in
self?.bottomConstraint.constant = height
self?.view.layoutIfNeeded()
})
.disposed(by: bag)
4๏ธโฃ ํค๋ณด๋ ์์ ์์ญ ์ ๋๋ฉ์ด์
view.rx.keyboardHeight
.withLatestFrom(view.rx.layoutIfNeeded(), resultSelector: { h, _ in h })
.bind(to: scrollView.rx.keyboardAnimatedInsets)
.disposed(by: bag)
keyboardAnimatedInsets
๋ ์ปค์คํ Extension์ผ๋ก, ์ ๋๋ฉ์ด์ ๊ณก์ ์ ๋ ธํฐ์์ ์ถ์ถํด ์ฌ์ฉ
5๏ธโฃ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ & ์ฃผ์์ฌํญ
์ ์ค์ฒ ์ธ์๊ธฐ
View deinit ์ gesture.view
retain ํ์ธ
ํค๋ณด๋ ๋ ธํฐ
.takeUntil(self.rx.deallocated)
๋ก ์๋ ํด์ ๊ฐ๋ฅ
RxGesture
when(.recognized)
ํํฐ๋ง ์ ํ๋ฉด ์ค๋ณต ์ด๋ฒคํธ ๋ฐ์
6๏ธโฃ Mini Quiz
๋ ์๊ฐ๋ฝ ํญ ์ ์ค์ฒ๋ฅผ Rx๋ก ๋ง๋ค๊ณ , ์ฒซ ์ธ์ ํ ์๋ ํด์ ํ๋ ค๋ฉด?
ํค๋ณด๋ ๋์ด ์คํธ๋ฆผ์์ ๋์ด๊ฐ ๋์ผํด๋ ์ค๋ณต ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น?
RxGesture ๋์ ๊ธฐ๋ณธ
rx.event
๋ฅผ ์จ์ผ ํ๋ ์ํฉ ํ ๊ฐ์ง๋?
๐ Operators ์ฑํฐ ๋! ์ด์ ํ ์คํธ ์ผ์ด์ค ์์ฑ์ผ๋ก ํ์ต์ ๊ฐํํด ๋ณด์ธ์. ๐
Last updated