`
iaiai
  • 浏览: 2203734 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RxSwift学习之旅 - RxGesture

 
阅读更多
简介
RxGesture是RxSwift社区的产物,是对view手势的封装。

项目地址:RxGesture

话不多说,直接来看它的用法吧。

点击
tapView.rx
    .tapGesture()
    .when(.recognized)
    .subscribe(
        onNext:{
            _ in
            print("tapped!!!")
        }
    )
    .disposed(by: disposeBag)


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


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


水平划动
tapView.rx
    .swipeGesture([.left, .right])
    .when(.recognized)
    .subscribe(
        onNext:{
            _ in
            print("swipe left or right!!!")
        }
    )
    .disposed(by: disposeBag)


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


拖动
let panGesture = tapView.rx.panGesture().shareReplay(1)
        
panGesture
    .when(.changed)
    .asTranslation()
    .subscribe(
        onNext: {
            [unowned self] translation, _ in
            self.label.text = String(format: "(%.2f, %.2f)",translation.x, translation.y)
            self.tapView.transform = CGAffineTransform(translationX: translation.x, y: translation.y)
        }
    )
    .disposed(by: disposeBag)
panGesture
    .when(.ended)
    .subscribe(
        onNext: { _ in
            print("panGesture end")
        }
    )
    .disposed(by: disposeBag)


旋转
let rotationGesture = tapView.rx.rotationGesture().shareReplay(1)
        
rotationGesture
    .when(.changed)
    .asRotation()
    .subscribe(
        onNext: {
            [unowned self] rotation, _ in
            self.label.text = String(format: "%.2f rad", rotation)
            self.tapView.transform = CGAffineTransform(rotationAngle: rotation)
        }
    )
    .disposed(by: disposeBag)
rotationGesture
    .when(.ended)
    .subscribe(
        onNext: { _ in
            print("rotationGesture end")
        }
    )
    .disposed(by: disposeBag)


缩放
let pinchGesture = view.rx.pinchGesture().shareReplay(1)
        
pinchGesture
    .when(.changed)
    .asScale()
    .subscribe(
        onNext: {
            [unowned self] scale, _ in
            self.label.text = String(format: "x%.2f", scale)
            self.tapView.transform = CGAffineTransform(scaleX: scale, y: scale)
        }
    )
    .disposed(by: disposeBag)
pinchGesture
    .when(.ended)
    .subscribe(
        onNext: { _ in
            print("pinchGesture end")
        }
    )
    .disposed(by: disposeBag)


变换
let transformGestures = view.rx.transformGestures().shareReplay(1)
        
transformGestures
    .when(.changed)
    .asTransform()
    .subscribe(
        onNext: {
            [unowned self] transform, _ in
            self.label.numberOfLines = 3
            self.label.text = String(format: "[%.2f, %.2f,\n%.2f, %.2f,\n%.2f, %.2f]", transform.a, transform.b, transform.c, transform.d, transform.tx, transform.ty)
            self.tapView.transform = transform
        }
    )
    .disposed(by: disposeBag)
transformGestures
    .when(.ended)
    .subscribe(
        onNext: {
            [unowned self] _ in
            self.label.numberOfLines = 1
            print("transformGestures end")
        }
    )
    .disposed(by: disposeBag)


屏幕边缘
view.rx
    .screenEdgePanGesture(edges: .right)
    .when(.recognized)
    .subscribe(
        onNext: {
            _ in
            print("right edge")
        }
    )
    .disposed(by: disposeBag)


组合
tapView.rx
    .anyGesture(.tap(), .swipe([.up, .down]))
    .when(.recognized)
    .subscribe(
        onNext: {
            _ in
            print("tap or up down")
        }
    ).disposed(by: disposeBag)



过滤
默认对手势是没有过滤的,所以你会收到初始化的第一个手势事件。

下面是几种手势对应的状态:


还可以组合不同条件的手势:
tapView.rx
    .anyGesture(
        (.tap(), when: .recognized),
        (.pan(), when: .ended)
    )
    .subscribe(onNext: { gesture in
        // Called whenever:
        // - a tap is recognized (state == .recognized)
        // - or a pan is ended (state == .ended)
        print("tap is recognized or pan is ended")
    })
    .disposed(by: disposeBag)


代码
代码见github:

RxSwiftRxGesture
  • 大小: 9.6 KB
分享到:
评论

相关推荐

    RxSwift Reactive Programming with Swift

    ### RxSwift:Swift语言下的响应式编程 #### 核心概念与原理 **RxSwift**是一种基于Swift语言的响应式编程框架,它提供了一种处理异步数据流的...无论是新手还是有经验的开发人员,都可以从学习RxSwift中获益匪浅。

    The-introduction-to-RxSwift-you-have-been-missing, 关于RxSwift的介绍你已经错过了.zip

    The-introduction-to-RxSwift-you-have-been-missing, 关于RxSwift的介绍你已经错过了 :介绍了你所缺少这个工作受到的启发,介绍了你缺少的反应性编程:来自 @andrestaltz的。 我在RxSwift中为那些正在努力学习...

    RxSwift.Reactive.Programming.with.swift+Source

    《RxSwift:Swift中的响应式编程与源码解析》 RxSwift是Swift编程语言中一个强大的响应式编程库,它引入了ReactiveX的概念,使得处理异步操作、事件流和数据流变得更加简洁和优雅。这个资料包包含了RxSwift的理论...

    用RxSwift和MVVM-C实现的Github客户端

    通过学习SwiftHub的源代码,开发者可以深入理解如何在iOS应用中有效地运用RxSwift和MVVM-C架构,同时也能了解到如何处理网络请求、数据持久化以及UI设计等问题。这对于提升iOS开发技能和掌握现代Swift开发实践非常有...

    GitHub iOS client in RxSwift and MVVM-C clean architecture.zip

    标题 "GitHub iOS client in ...总的来说,这个项目提供了一个学习iOS开发、RxSwift实践和MVVM-C架构的实例。通过这个项目,开发者可以了解如何在iOS应用中有效地处理异步操作,以及如何构建可维护、可扩展的代码结构。

    RxSwift-Tutorial:RxSwift 学习资料(学习教程、开源项目)

    RxSwift-Tutorial RxSwift QQ 交流群: 424180219 Rx 教程 推荐 RxSwift进阶与实战 基于RxSwift的MVVMR架构(一)思想、基本原理及初步实现 一个基于MVVM架构模式的RxSwiftDemo,旨在掌握RxSwift较为进阶的内容 【漫谈...

    iOS-RxSwift-Observable的使用-Demo

    在iOS开发中,RxSwift是一个强大的响应式编程库,它为Swift编程引入了ReactiveX的概念,使得异步操作和事件处理变得更加简洁和易于管理。本Demo主要关注RxSwift中的核心概念——`Observable`(可观察序列),我们将...

    RxSwift.Reactive.Programming.with.Swift IOS11

    8. **电子书**:RxSwift.Reactive.Programming.with.Swift.v2.0.epub 和 RxSwift.Reactive.Programming.with.Swift.v2.0.pdf 文件提供了书籍的电子版,方便读者随时随地学习。 通过学习这本书,开发者不仅可以掌握...

    RxSwift-MVVM-iOS:SwiftMVVM是使用MVVM架构以Swift编写的示例iOS应用

    git clone git@github.com:yokurin/RxSwift-MVVM-iOS.git在Xcode中打开RxSwiftMVVM.xcworkspace 。 跑描述RxSwiftMVVM是使用MVVM架构以RxSwift编写的示例iOS应用。 使用 , , 查看源代码单元测试在制品...Xcode...

    RxSwift:RxSwift学习空间

    RxSwift 最后,我们开始我们仅听说的RxSwift研究。内容工具 :closed_book: 用Swift进行RxSwiftReact式编程作者:Martin Todorov( ) :hammer: Xcode 9或更高版本课程它总共包括5个部分和24个章节。 首先,我打算...

    SwiftRex:Swift + Redux +(Combine | RxSwift | ReactiveSwift)-> SwiftRex

    单向数据流为您最喜欢的React框架 介绍 SwiftRex是一个结合了单向数据流架构和React式编程( , 或 )的框架,为应用程序的整个状态提供了中央状态存储,您的SwiftUI Views或UIViewControllers可以观察和响应该状态...

    RxSwift_v1-2.zip_rx_rxswift

    《RxSwift在MVVM架构中的应用深度解析》 RxSwift,作为Swift编程语言中的一个强大的响应式编程库,已经在iOS开发领域中占据了重要的地位。它以其简洁、灵活的特性,为开发者提供了处理异步事件流的新方式。在MVVM...

    rxswift-to-combine-cheatsheet:RxSwift到Apple的合并备忘单

    RxSwift合并备忘单 这是一份对苹果新的框架感兴趣的开发人员的。 它基于以下博客文章: : RxSwift 结合 部署目标 iOS 8.0以上 iOS 13.0以上 支持平台 iOS,macOS,tvOS,watchOS,Linux 适用于Mac的iOS,macOS,...

    RxSwift-MVVM-PoP:我使用RxSwift的基于协议的MVVM方法

    RxSwift-MVVM-PoP 我使用RxSwift在MVVM上以协议为导向的方法ViewModelType这将是“最终的” ViewModelType protocol RxViewModelType { // setting up the structs as typealiases typealias Input = ...

    iOS-RxSwift-KVO、UI控件、手势、通知、定时器、网络请求的使用-Demo

    总之,"iOS-RxSwift-KVO、UI控件、手势、通知、定时器、网络请求的使用-Demo"这个项目旨在展示如何在实践中运用RxSwift进行全方面的功能开发,帮助开发者掌握函数响应式编程在iOS开发中的应用。通过学习和实践这个...

    RxSwift-VIPER-iOS:RxSwiftVIPER是使用VIPER架构以RxSwift编写的示例iOS应用。 同样,RxSwiftVIPER不是严格的VIPER架构

    git clone git@github.com:yokurin/RxSwift-VIPER-iOS.git在Xcode中打开RxSwiftVIPER.xcworkspace 。 跑描述RxSwiftVIPER不是严格的架构。 该项目的一部分是一种独特的方式。 这只是一个建议。 使用 , , 查看源...

    具有ReactiveX的单向MVC-Swift开发

    具有RxSwift的RxMVC模型-视图-控制器模式。 文档,请参见Wiki模式-视图-控制器RxMVC支持使用RxSwift实现模型-视图-控制器模式,如下所示:(来自维基百科)不是txxxRxRxMVC使用RxSwift的模型-视图-控制器模式。 文档...

    RxSwift: Reactive Programming with Swift (RxSwift 4.4版本 EPUB版本)

    Leverage the power of RxSwift in your reactive apps! In this RxSwift book, you'll learn how to integrate RxSwift into real-world iOS apps.

    高清彩版 RxSwift Reactive Programming with Swift(2nd)

    - **Observables**:观察者,是RxSwift中最核心的概念之一。它定义了一个接口,该接口能够发出数据项或通知(完成或错误)。在RxSwift中,`Observable`类代表了一个可观察的对象,它可以发射一系列的数据或错误,...

Global site tag (gtag.js) - Google Analytics