RxSwift筆記 - RxCocoa 基礎 (二) : UIGestureRecognizer


UIGestureRecognizer

RxCocoa + UIGestureRecognizer

let tapGesture = UITapGestureRecognizer()
view.addGestureRecognizer(tapGesture)

Tap

// 訂閱方式實現
tapGesture.rx.event.subscribe(onNext: { _ in
    print("tapped")
}).disposed(by: disposeBag)

// 綁定方式實現
tapGesture.rx.event.bind { _ in
    print("tapped")
}.disposed(by: disposeBag)

Swipe

// 添加一個上滑的手勢
let swipe = UISwipeGestureRecognizer()
swipe.direction = .up
self.view.addGestureRecognizer(swipe)

// 訂閱方式實現
swipe.rx.event.subscribe(onNext: { [weak self] recognizer in
    let point = recognizer.location(in: self?.view)
    print("向上滑動 \(point.x) - \(point.y)")
}).disposed(by: disposeBag)

// 綁定方式實現
swipe.direction = .down
swipe.rx.event.bind { [weak self] recognizer in
    let point = recognizer.location(in: self?.view)
    print("向下滑動 \(point.x) - \(point.y)")
}.disposed(by: disposeBag

RxGesture + UIGestureRecognizer

tapView = UIView()
// ...
view.addSubview(tapView)

Tap

// tap
tapView.rx.tapGesture().when(.recognized)
    .subscribe(onNext: { _ in
    print("Tapped!!!")
}).disposed(by: disposeBag)

// double tap
tapView.rx.tapGesture(numberOfTapsRequired: 2).when(.recognized)
    .subscribe(onNext: { _ in
    print("double tapped!!!")
}).disposed(by: disposeBag)

Swipe

// swipe down
tapView.rx.swipeGesture(.down).when(.recognized)
    .subscribe(onNext: { _ in
    print("Swipe down")
}).disposed(by: disposeBag)

// swipe horizontal
tapView.rx.swipeGesture([.left, .right])
    .subscribe(onNext: { _ in
    print("Swipe horizontal")
}).disposed(by: disposeBag)

Long press

// long press
tapView.rx.longPressGesture().when(.began)
    .subscribe(onNext: { _ in
    print("long press")
}).disposed(by: disposeBag)

Pan

// pan gesture
let panGesture = tapView.rx.panGesture().share(replay: 1)

panGesture.when(.changed).asTranslation()
    .subscribe(onNext: { [unowned self] translation, _ in
    self.tapView.transform = CGAffineTransform(translationX: translation.x, y: translation.y)
}).disposed(by: disposeBag)

panGesture.when(.ended).subscribe(onNext: { _ in
    print("pan gesture end")
}).disposed(by: disposeBag)

Rotation Gesture

// rotation gesture
let rotationGesture = tapView.rx.rotationGesture().share(replay: 1)

rotationGesture.when(.changed).asRotation()
    .subscribe(onNext: { [unowned self] rotation, _ in
    self.tapView.transform = CGAffineTransform(rotationAngle: rotation)
}).disposed(by: disposeBag)

rotationGesture.when(.ended)
    .subscribe(onNext: { _ in
    print("rotation gesture end")
}).disposed(by: disposeBag)

Pinch

// 縮放 pinch
let pinchGesture = tapView.rx.pinchGesture().share(replay: 1)

pinchGesture.when(.changed)
    .asScale()
    .subscribe(onNext: { [unowned self] scale, _ in
    self.tapView.transform = CGAffineTransform(scaleX: scale, y: scale)
}).disposed(by: disposeBag)

pinchGesture.when(.ended)
    .subscribe(onNext: { _ in
        print("pinch end")
    }).disposed(by: disposeBag)

Edge Pan

// 邊緣平移 EdgePan
view.rx.screenEdgePanGesture(edges: .right)
    .when(.recognized)
    .subscribe(onNext: { _ in
    print("rigjt edge")
}).disposed(by: disposeBag)

tapView.rx.anyGesture(.tap(), .swipe([.up, .right]))
    .when(.recognized)
    .subscribe(onNext: { _ in
    print("tap or up down")
}).disposed(by: disposeBag)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章