日期: 2021 年 7 月 22 日

Android:MVC模式(下)

在上一篇文章中,我们将 View 类单独出来并完成了设计和编写。这次我们将完成 Model 类,并通过 Controller 将两者连接起来,完成这个计算器程序。

模型(Model)就是程序中封装了数据,并定义了操作和处理这些数据的逻辑的对象。在计算器的例子中,就是处理输入的操作数和运算符,并计算返回结果。Let’s Go
(注意:示例中直接使用 double 类型来处理数据,但严格来说很多语言的浮点数计算都是不精确的)

一,设计模型的接口

在程序构建之初,我们首先考虑的应该是各模块间的封装和扩展,设计好模块的接口,然后再实现模块的细节,*后把模块组合起来构成整个程序。这就是面向接口编程的概念。

思考一下 Model 类,它主要实现三个功能,1,接受操作数输入;2,接受运算符输入并返回计算结果;3,重置。这些功能主要都是被外部使用的,所以基于此来设计接口,对其它类而言,只需知道该接口定义了什么方法然后使用就行,而不需要了解实现细节。

创建 com.test.interfaces 包,并右键选择 New -> Interface 创建一个名为 ICalculator 的接口(一般接口命名都以大写字母 I 开头)

android_5_interface1

创建 com.test.model 包,并创建 CalModel 类,同时实现 ICalculator 接口。

android_5_calmodel

二,通过栈和递归函数实现计算器算法

计算器的计算规则很简单,从左到右计算,不考虑运算符的优先级,例如:2 + 1 * 2 – 3,相当于: (((2 + 1) * 2) – 3) = 3;这样保证编写的简易性。

我们知道,栈是一种后进先出的数据结构,我们通过一个栈 dataStack 记录输入的运算数和操作符。如图所示:android_5_datastack

所谓的递归函数,就是接受有限的自然数,通过重复调用自身,*终得到一个自然数结果的函数。算法的核心就是设计这样一个递归函数 popOpOffStack 来对 dataStack 进行求解,过程如图:

android_5_popstack

三,编写程序

按上面的思路,popOpOffStack 可以单独写出,并不需要实例化后才能使用,所以将 popOpOffStack 设为 CalModel 的静态方法则可,如图:

android_5_javapop

完成编写后,可以构建一个栈来测试一下,因为返回的是 double 类型,所以结果是 3.0,如图:

android_5_test1

android_5_test2

核心算法完成后,完成对运算数和操作符的输入的处理并补充其它细节。这样我们的 CalModel 就完成了。

android_5_javamodel

四,通过Controller将Model和View连接

在 Android 的文档中,Activity 是被推荐作为 Controller 的角色,负责视图和模型的协调、沟通。而从 Activity 所拥有的功能的角度看,也是*合适的选择。至此,代码结构也清晰了。MainActivity 将作为 Controller 协调视图和模型,并对一些数据及细节进行处理。其代码如下:

android_5_controller

通过 MainActivity 将模型和视图连接起来后,我们的计算器也*终完成了。可以运行测试一下。

五,结束及回答

本次要点:
1)通过 MVC 设计,使计算器程序有了较好的扩展和维护能力,假如使用另一种计算器算法,只需创建另一实现 ICalculator 接口的 Model 类,并代替原来的 CalMode 则可。当需要增加功能时,可以将代码增加到对应的模块处而不用随意写在一起。

2)这次只介绍了*基本的 MVC 知识,而至于 MVC 模式更高级的使用以及模块间的通信会在后面再讲。从代码的编写中,大家可能会发现 MainActivity 其实很难进行抽象,因为都是一些连接的逻辑和细碎代码。这也就是为什么 MVC 概念提出这么久以来,Model 和 View 的封装技术有了长足进步,而 Controller 却没什么突破的原因之一。作为前端,这方面大家可以对比一下现时流行起来的 MVC 库,对 Controller 角色的处理。而苹果在 Cocoa 中对 Controller 的封装也是很有特色,有机会会介绍对比一下。

3)例子中的细节处理还可以处理得更好,就留给大家修改。另外,有时间的话可以尝试使用经典的双栈算法来实现这个计算器,替换 CalModel 类。

在上几篇文章中大家提到的問题在这里总结回答一下:
1)什么时候用回调和 MVC 的设计为什么可以提高维护和扩展性:对于前者,当我们设计一个模块时,模块除提供方法外,自身发生的事是需要被外界了解时,或外界对这个模块发生的事是“渴望”得知的,这个时候就需要进行回调处理了。对于后者,在这次的文章中讲得比也较清晰了。

2)创建工程时,为什么会多出一些 support-v4、 support-v7 等这些包,这是 Android 的一些高级 API 或组件为在低版本中向下兼容实现而自动加载到工程中的,对自身程序并没有什么影响。

Android入门:MVC模式(中)

MVC 模式的*基本概念是分层设计,把我们的代码基于 View(视图)、Model(模型)、Controller(控制器)进行分类封装,这样做的目的是为了清晰结构,使代码更易维护和扩展。

在上一篇文章中,我们完成了计算器的界面还原,但严格来说并不是真正的 View 类,因为它还没反映视图的逻辑。在这次文章中,我们将编写计算器程序的 View 部分,Let’s Go!
(注意:这次在代码的注释中写了较多的点,所以可以多看注释部分)

一,初识 Activity

Activity(活动)作为 Android 四大组件之一,相当于应用中的整个界面,用前端的角度看,就像一个 web 页。而 Activity 的实质是什么呢?这次先简要描述,从 Google 大神中可知,Activity 起始继承于 Context 类,来看看它们的描述关键词:

android.content.Context

Interface to global information about an application environment … It allows access to application-specific resources and classes, as well as up-calls for application-level operation …
原来 Context 被定义为关于应用场景(上下文)的抽象类,具有访问应用层面资源和类的权限,并封装了一些应用级别的方法。

android.app.Activity

An activity is a single, focused thing that the user can do … interact with the user … takes care of creating a window (full-screen windows or floating windows) for place UI …
Activity 被定义为与用户交互(事件),负责创建加载视图的窗口等功能的功能类。可以说因 Context,使 Activity 具有强大的功能。

在开始编写前,先介绍一个重要的 Java 文件 – R.java,在前面介绍过,gen 目录会自动生成一些系统需要的文件,打开 R.java:

android_4_r

R 类通过 attr,color,drawable,id,layout 等静态内部类,记录了所有标识。
(注意:R类的标识会自动生成,不用去修改)

 二,在 onCreate 中编写我们的程序

Activity 有个明显的特点,就是有生命周期。可以想象一下平时应用的使用过程,从一个界面滑入至另一界面,又从当前界面返回,伴随的就是 Activity 周期的不同阶段。打开 Calculator 项目的 MainActivity.java 文件:

android_4_activity

在前端编程中,*重要的是获取操作对象(dom)。在 Android 中也如此,主要通过 id 标识获取操作对象。我们首先给activity_main.xml 中的 TextView 和 Button 加上以下 id 标识:
(@+id/{name} 的意思是在 R 类中增加为 {name} 的 id 标识)

  • TextView:@+id/ResultOutput
  • Button 数字 0 ~ 9:@+id/Operand0 ~  @+id/Operand9
  • Button 除号:@+id/Operate0
  • Button 乘号:@+id/Operate1
  • Button 减号:@+id/Operate2
  • Button 加号:@+id/Operate3
  • Button 等号:@+id/Operate4
  • Button 清除:@+id/Operate5

如图所示,请务必为元素加上正确的 id。

android_4_ids

在 Android 中,主要通过 findViewById() 方法获取操作对象,如TextView的获取:

android_4_find

在前端编程中,我们可以通过 getElementsByTagName() 方法获取一系列操作元素,但在 Android 中却没那么幸运了,没有这种方法。那有什么快捷点的方式不?答案是肯定的。我们知道 findViewById() 传入的是一个 int 类型的引用值,那么可否通过循环的方式找出这些引用值,然后直接获取呢?我们把 Button 元素分为两组,操作数的 id 以 Operand0 ~ 9 命名。而其余为运算符,则以 Operate0 ~ 5 命名(如上面提示的)。这样我们则可以:

android_4_reflect

这样,通过一个 TextView 和两个数组,我们就把需要的操作元素全部收集好了。

android_4_all

三,分离及定义 View 类的接口

从上面的代码看,一切似乎都很美好,但这种面向过程的思考方式是导致代码迅速膨胀,难以维护的原因之一。按 MVC 的设计思想,上面编写的代码应属于视图部分的逻辑,更好的办法应该封装在视图内,实现细节不被其它类所知。我们现在遵循这一思想从新组织一下代码:
(注意:这里只朴素地用 MVC 思想表达意图,至于划分及编写的合理性就不探究了)

计算器将由两个 View 类组成,一个是用于显示结果的 CaOutputView 类,一个是用于用户输入的 CaInputView 类。首先建立存放 View 类的包,通过包区分不同类型文件。

android_4_pkg

android_4_pkg2

然后我们建立这两个 View 类:

android_4_views

 

android_4_views2

接着,我们打开 CaInputView.java 文件。好了,现在我们来思考一个问题,CaInputView 负责与用户的交互,自然会知道用户按了什么按钮,但怎样通知 Activity 用户的行为呢? 这个就是我们准备要接触的回调机制的概念。

就好比,CaInputView 对 Activity 说:你把“联系方式”留我,用户输入了我就通知你。而“联系方式”有多种实现的方式。这次就通过委托的方式实现,相当于 iOS 中的代理(delegate)的概念:

android_4_interface

四,编写 View 类

现在我们继续编写 CaInputView类,把原先 Activity 类的代码逻辑归入 CaInputView 类:

android_4_input

继续编写 CaOutputView 类,CaOutputView 类比较简单,只用于显示:

android_4_outputview

五,在 Activity 中使用 View 类

两个 View 已经创建完毕,现在可以尝试在 Activity 中使用了:

android_4_controller1

上图提示错误,是因为实例化了 CaInputView,却没有实现接口,所以提示 MainActivity 应该实现 CaInputView 声明的接口:

android_4_controller2

实现 CaInputView 声明的接口后仍然会报错,因为没实现接口声明的方法,选择“Add unimplemented methods”则自动添加了方法,如下图:

android_4_controller3

*后当 CaInputView 与用户发生交互时,我们“通知” Activity,而 Activity 则调用 CaOutputView 将结果显示出来,MainActivity 类的*终代码如下图:

android_4_controller4

运行程序,点击每个按钮,看是否显示正确的值:

android_4_controller5

通过分层设计,MainActivity 中的代码变得简洁很多,它只需知道如何使用 View 类则可,使它可以专注于自己的责任部分。

六,总结

这次说了的点比较多,主要有:

  • MVC 的设计概念
  • 两种方式获取操作对象
  • Java 的类型及转型相关概念
  • 回调机制及接口
  • 如何使用 View 类

 

Android:MVC模式(上)

很多Android的入门书籍,在前面介绍完布局后就会逐个介绍组件,然后开始编写组件使用的例子。每每到此时小伙伴们都可能会有些疑问:是否应该先啃完一本《Java编程思想》学点 Java 知识呢?这些组件会使用了,但如何更好组织起来呢?

其实,Android 和 iOS 已经把应用层级别的东西封装得比较简单易用,也配有丰富的文档与之对应,所以倒不必担心如何使用。而实际上,我想让大家通过这个系列的文章更关注和学习下面两点,我也会在例子的选取上多涉及这些方面的知识。

  • 编程的思想。正如学会英语,并不一定就能写出好的英文文章。
  • 查找学习的能力。知道如何发现问题的关键点,然后去找方法解决。

MVC 是软件工程中*基本的设计模式,也是组织良好代码的基础,Android 和 iOS 中也一样,所以在接下来的三篇文章中,将会介绍如何通过 MVC 模式制作一个简易计算器应用,Let’s Go!

这个高大上(偷笑)的计算器界面如下,这次先完成界面部分。

android_3_calculator

一,界面还原准备

首先,打开 Eclipse,创建一个 Android 工程,并命名为:Calculator(如下图)

android_3_new

此时,会默认打开 MainActivity.java 和 activity_main.xml 两个文件,activity_main.xml 为界面布局文件,MainActivity.java 为程序入口文件(这次先不用编写)。
同时,我们将 res > values > styles.xml 文件打开,activity_main.xml 和 styles.xml 之间的关系就相当于 html 和 css。

android_3_files

我们知道,Android 中有 LinearLayout,RelativeLayout 等布局元素,这次我们就先用 LinearLayout 来完成界面的布局。

🙂 首先等我请出本系列课程的助教:Google 大神

LinearLayout(线性布局),大神给出的定义是:
将子视图元素按水平或垂直方向一个接一个排列的视图组合(布局)。

从上一篇文章中我们知道 View 类由两类属性控制其视觉呈现,所以 LinearLayout 有其自有属性,而处于其内的子元素则可以使用 LinearLayout.LayoutParams 定义的属性,那怎样去找这些属性呢?当然是去问我们的大神了。

LinearLayout 类参考

从 Summary 的 XML Attributes 中可以知道这些属性的信息概要,点击每个属性,下面都有详细的介绍。

android_3_attribute1

几个常用属性:
1,android:orientation  通过设置值为 “horizontal” 或 “vertical” 让子元素按水平或垂直排列。
2,android:gravity  设置其内容(文字、视图)在该元素内的位置,通过 “|” 号分隔多个值(top,bottom,left,right,center,center_vertical,center_horizontal)。
3,android:baselineAligned  设置为”false”则统一对齐的基线,主要用于设置了不同 gravity 的可显示文字的 View 元素。这里先不展开。

android_3_example1

那 LinearLayout.LayoutParams 有什么属性呢,同样我们从大神那找到:

LinearLayout.LayoutParams 类参考

android_3_attribute2

从上篇文章可知 xxx.LayoutParams 定义的属性是用于布局内的元素上的。

1,android:layout_gravity  让子元素设置其相对于父元素中的位置,其设值和 android:gravity 一样。可能有人就会疑问了,那这两个属性有什么区别呢?
简单点理解,android:gravity 是应用于自身所包含的内容(这个内容可以是文字或子视图),而 android:layout_gravity 则是应用在自身。

(这里还要指出一个大家在线性布局中可能会遇到的问题:android:layout_gravity 设值失效问题。例如在设定了 android:orientation = “vertical” 的 LinearLayout 中,设定一个 TextView 的 layout_grivity = “top” 或者 layout_grivity = “bottom” 是失效的。同样,在 android:orientation = “horizontal” 中设定元素的 “left” 或 “right” 也会一样。为什么会这样呢?就留给小伙伴们思考了,其实想想这样设定还算是合理的。)

2,android:layout_weight  大神也有偷懒的时候,这里竟然没有说明。大神把它放在另一个地方介绍了。性质类似 Css 的弹性盒,对 -webkit-flex 设值,相当于显示权重。情况会很多,篇幅问题只能留在以后的文章加以说明。这次界面制作使用 layout_weight 的策略是:每个元素都占用“足够大的空间”,然后各自权重为1,这样一来就平均了。

android_3_example2

请小伙伴们再看一次线性布局的介绍,   LinearLayout 线性布局

在准备部分,我没有直接列出所有属性来介绍。而是更想展示如何去思考和查找解决办法的过程。对于文章没展开部分,可以去查一查,培养阅读文档的习惯 🙂

二,界面的制作

前面废话多了, 既然用线性布局,界面就直接用一个 TextView + 4个LinearLayout 垂直排列做布局。如下图:

android_3_layout1

正如把 css 写在 html 中是“下流”的写法,那么我们应该“上流”点,把样式分离写在 styles.xml 中,activity_main.xml 中则通过@style/{ClassName} 的方式留下我们锚点则可。
这里,Eclipse 会提示xml 中存在若干错误,因为我们还没在 styles.xml 中建立相应的资源名,不用理会。也会提示了一个修改建议,说把字符硬编码进TextView了,也可不理。

此时转到 styles.xml 中,建立起相应的“类名”,(注意:这里先把 AppTheme 设置为:android:Theme.NoTitleBar )

android_3_style1

建立完“类名”后,我们就可以编写<body>的样式了,这里设置为垂直排列。
我们还将建立一个资源文件,用于设定颜色值,就如同 strings.xml 的作用一样。

android_3_color1

android_3_color2

android_3_color3

这里先把我们会用到的颜色值都设定了,包括按钮和文字的颜色。

android_3_color4

继续编写我们的 styles.xml 文件,通过 layout_weight 的设定,我们将 TextView 和 4个 LinearLayout 平分屏幕的空间。并且为我们的 TextView 添加相应的样式,而准备用于放置按钮的 LinearLayout 则设定为水平排列:

android_3_style2

此时转到 activity_main.xml 并在 xml 编辑框底部点选 Graphical Layout 这个tab,可以预览还原了的界面。和我们预想一样,TextView 占了空间的1/5。

android_3_ui1

好了,可以开始编写我们的按钮了,我们将用 Button 元素实现按钮,用 btn_operand 命名操作数的样式,用 btn_operate 命名操作符的样式,并且 btn_operate 将会继承 btn_operand 的样式,然后重新设置背景色和文字色,这些就和使用 Css 一样。

android_3_ui2

android_3_ui3

预览一下界面。和我们设想的一样。

android_3_ui4

剩下的就交由小伙伴继续完成啦 🙂  另外,鉴于个人能力有限,在文章中未免会出现错误,欢迎大家的指正,感谢大家!

后话:

下一篇文章开始将会涉及 Java 代码,有条件的同学请备一本《Java编程思想》,机械工业出版社的,网上应该有很多 pdf ,当然不会让你啃了它,太浪费时间。因为在编写代码的过程中,或多或少会涉及 Java 的东西,我会指出需要看的那部分,从而把基础的 Java 知识学了。另外,应小伙伴们的要求,我会找地方提供编写的代码下载。题外话,《Java编程思想》的确是本好书,作为参考或者学习也好,可以考虑备一本。

iOS每日一记————之 中级完美大整理

iOS、mac开源项目及库汇总

UI

下拉刷新
  • EGOTableViewPullRefresh – *早的下拉刷新控件。
  • SVPullToRefresh – 下拉刷新控件。
  • MJRefresh – 仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能。可以自定义上下拉刷新的文字说明。具体使用看“使用方法”。 (国人写)
  • XHRefreshControl – XHRefreshControl 是一款高扩展性、低耦合度的下拉刷新、上提加载更多的组件。(国人写)
  • CBStoreHouseRefreshControl – 一个效果很酷炫的下拉刷新控件。
  • BreakOutToRefresh – 一个下拉刷新打砖块的开源 Swift 库,能让用户在等待下拉刷新的时候边玩撞球游戏边等待。
  • KYJellyPullToRefresh – 实现弹性物理效果的下拉刷新,神奇的贝塞尔曲线,配合UIDynamic写的一个拟物的下拉刷新动画。
  • MHYahooParallaxView – 类似于Yahoo Weather和News Digest首屏的视差滚动。
  • SDRefreshView – 简单易用的上拉和下拉刷新(多版本细节适配)。
  • ZLSwiftRefresh – swift下拉刷新/上拉加载更多,支持自定义动画,集成简单,兼容UITableView/CollectionView/ScrollView/WebView。
  • BreakOutToRefresh – swift,上拉和下拉刷新。
  • GearRefreshControl – swift,上拉和下拉刷新。
  • refresher – swift,上拉和下拉刷新。
  • 可展开/收缩的下拉菜单–SvpplyTable – 一个可展开可收缩的下拉菜单,类似Svpply app。
  • ODRefreshControl – 原iOS6上的橡皮糖刷新样式,很有意思。现在也很多大的 App 在用,比如虾米音乐和 QQ 客户端。
  • PullToMakeSoup – PullToMakeSoup, 自定义下拉刷新的动画效果:煮饭, Yalantis新作!
  • TwitterCover – Twitter iOS客户端的下拉封面模糊效果。
  • Replace-iOS – Replace-iOS 让人眼前一亮的下拉刷新(iOS)。
  • Animations – 封装了一下,使用的时候只要两行代码。一些动画的飞机稿,都是一些单独分离出来的用于测试的子动画,现在统一归类一下。
  • PullToBounce – 下拉刷新的动画 for UIScrollView。
模糊效果
  • FXBlurView – 是一个UIView子类,支持iOS5.0以上版本,支持静态、动态模糊效果,继承与UIView的模糊特效。
  • VVBlurPresentation -很简单易用的在原来viewconntroller基础上做模糊,然后present新的viewcontroller的。
  • UICustomActionSheet – 通过模糊背景来着重强调与菜单相关的元素–对话框 里面已经收藏。
  • SABlurImageView – 支持渐变动画效果的图像模糊化类库。P.S. 与前几天推存类库 SAHistoryNavigationViewController 是同一位作者。
AutoLayout
  • Masonry – Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性( 使用介绍1 使用介绍2),iOS自适应前段库-Masonry的使用),Masonry、Classy、ClassyLiveLayout介绍。使用DEMO 视图居中显示、子视图含边距、视图等距离摆放、计算ScrollView的contentsize。
  • Classy – Classy是一个能与UIKit无缝结合stylesheet(样式)系统。它借鉴CSS的思想,但引入新的语法和命名规则,Classy官网,Masonry、Classy、ClassyLiveLayout介绍。
  • ClassyLiveLayout – ClassyLiveLayout通过结合Classy stylesheets与Masonry一起使用,能够在运行的模拟器中微调Auto Layout约束实时显示效果的工具,Masonry、Classy、ClassyLiveLayout介绍。
  • Snap – Snap是Masonry Auto Layout DSL的Swift版本,是一款轻量级的布局框架,使用了更良好的语法封装了AutoLayout。Snap支持iOS和OS X。
  • SnapKit – 就是“snap”, –swift 喜欢自动布局吗?当然喜欢!至少在storyboard中创建时会喜欢。 在代码中纯手工创建约束灰常痛苦,但幸运的是我们有了SnapKit,在board中用上它,你可以简单直观地编写约束了。。
  • PureLayout – PureLayout 是 iOS & OS X Auto Layout 的终* API——非常简单,又非常强大。PureLayout 通过一个全面的Auto Layout API 扩展了 UIView/NSView, NSArray 和 NSLayoutConstraint,仿照苹果自身的框架。
  • UIView-AutoLayout – Deprecated in favor of PureLayout, which includes OS X support:https://github.com/smileyborg/PureLayout。
  • Cartography – Cartography 是用来声明 Swift 中的 Auto Layout,无需输入任何 stringly 就可设置自己 Auto Layout 的约束声明。
  • Auto-Layout-Showcase – swift,AutoLayout 进阶 Demo,宽高比约束、比例约束、不等约束、视差约束、低优先级约束等高级用法,无需写码即可进行复杂页面布局,Demo 还动态模拟了各屏幕下的效果。来自百度知道 iOS 小组的内部分享。
  • UIView-FDCollapsibleConstraints – 一个AutoLayout辅助工具,*优雅的方式解决自动布局中子View的动态显示和隐藏的问题。第二个Demo模拟了一个经典的FlowLayout,任意一个元素隐藏时,底下的元素需要自动“顶”上来,配合这个扩展,你可以在IB里连一连,选一选,不用一行代码就能搞定。
  • Autolayout_Demo – 在项目中用自动布局实现的类似抽屉效果。
  • 当view隐藏的时候也隐藏其autolayout的NSLayoutAttribute – 当view隐藏的时候也隐藏其autolayout的NSLayoutAttribute,从而不用大量的代码工作。
富文本
  • RTLabel – RTLabel 基于UILabel类的拓展,能够支持Html标记的富文本显示,它是基于Core Text,因此也支持Core Text上的一些东西。32位,很久没有更新了。
  • RTLabel – 富文本,RTLabel支持64位。
  • TYAttributedLabel – TYAttributedLabel。 简单易用的属性文本控件(无需了解CoreText),支持富文本,图文混排显示,支持添加链接,image和UIView控件,支持自定义排版显示。
  • TQRichTextView – 用于做富文本视图控件显示,用于即时通讯的表情显示,以及资源评论的富文本显示。
  • TTTAttributedLabel – 一个文字视图开源组件,是UILabel的替代元件,可以以简单的方式展现渲染的属性字符串。另外,还支持链接植入,不管是手动还是使用UIDataDetectorTypes自动把电话号码、事件、地址以及其他信息变成链接。用TTTAttributedLabel创建变化丰富的UILabel – 网易新闻iOS版使用。
  • MLEmojiLabel – 自动识别网址、号码、邮箱、@、#话题#和表情的label。可以自定义自己的表情识别正则,和对应的表情图像。(默认是识别微信的表情符号),继承自TTTAttributedLabel,所以可以像label一样使用。label的特性全都有,使用起来更友好更方便。
  • FXLabel – FXLabel是一个功能强大使用简单的类库,通过提供一个子类改进了标准的UILabel组件,为字体增加了阴影、内阴影和渐变色等,可以被用在任何标准的UILabel中。FXLabel还提供了更多控件,可以对字体行距、字体间距等进行调整。
  • WFReader – 一款简单的coretext阅读器,支持文本选择、高亮以及字体大小选择等。
  • WPAttributedMarkup – WPAttributedMarkup is a simple utility category that can be used to easily create an attributed string from text with markup tags and a style dictionary。
  • KMPlaceholderTextView – 可显示多行 placeholder 的 textView,可以在IB里面设置 — swift。
  • HHFlashSwitch – 一个另类的UISwitch,选择后,背景水波扩散变色效果。
  • UUColorSwitch – Switch 开关动画效果,当打开开关时,Switch可实现平滑渲染过渡到父视图的效果。
  • UITextViewDIYEmojiExample – UITextView编辑时插入自定义表情-简单的图文混编。
  • Shimmer – BlingBling闪光效果,酷炫的Label的效果,可以用于加载等待提示。
  • ZSSRichTextEditor – 适用于iOS的富文本WYSIWYG编辑器,支持语法高亮和源码查看。ZSSRichTextEditor包含所有WYSIWYG标准的编辑器工具。
  • RichEditorView – swift,一套可定制富文本编辑器组件及示例。功能完整、代码简练、实现逻辑巧妙(编辑器核心与 WebView 结合,采用 HTML5 contentEditable 编辑模式,执行JS 配套命令 execCommand 实现富文本编辑功能)。
  • DTCoreText – 可以解析HTML与CSS*终用CoreText绘制出来,通常用于在一些需要显示富文本的场景下代替低性能的UIWebView。DTCoreText源码解析。
  • CSGrowingTextView – 用作即时通讯文本框和评论文本框使用,可以显示多行输入。
  • MarkdownTextView – 显示Markdown的TextView。
  • 高仿微信限定行数文字内容 – 采用Autolayout高仿微信纯文字限定行数。
  • FuriganaTextView – 实现复杂的日文韩文排版。
  • ParkedTextField – 带固定文本的输入组件。
  • LTMorphingLabel – swift 能够实现文字变形动画效果的Label,用Swift写的一个能够实现文字变形动画效果的Label,很炫。
  • GJCFCoreText – 图文混排。
  • AttributedLabel – 显示性能数量级 UILabel 的 AttributedLabel。无畏无惧、挑战权威。
  • FFLabel – 自动检测 URLs, @username, #topic# 等关链词(提供响应扩展)。实用的标签文本小组件。
  • TextFieldEffects – 标准的UITextField有些枯燥么?来认识一下TextFieldEffects吧!废话不多说,只要看几个例子,是啊,都是些简单的dropin控制器。甚至可以在storyboard中使用IBDesignables。
图表
  • PNChart – 国内开源作者,动态的图表。
  • swift-linechart – 功能完整、实用的折线图组件。使用方便,参数配置简单。是不可多得的优质组件–swift。
  • ios-charts – 一款优秀 Android 图表开源库 MPAndroidChart 的 Swift 语言实现版(支持 Objective-C 和 Swift 调用)。缺省提供的示例代码为 Objective-C。
  • TEAChart – xhacker/TEAChart 一个简洁的 iOS 图表库,支持柱状图、饼图以及日历等。
  • YOChartImageKit – 支持在watchOS上绘制图表,看它*近更新挺勤快的,可以关注一下。
  • RealtimeGradientText – Fun With CALayer Mask 刚好今天开源了一个有趣的项目 RealtimeGradientText,所以也好聊一下 CALayer 的 Mask,说明。
表相关
  • SWTableViewCell – 国内开源作者,带很多手势的表单元格。
  • MCSwipeTableViewCell – 带很多手势的表单元格。
  • TMQuiltView – 瀑布流。
  • WaterfallFlowDemo – 一个简单的UICollectionView瀑布流布局演示demo。
  • XLForm – 很多表格类的table,写法更高冷一点,推荐使用。
  • RETableViewManager – 可以十分方便地生成各种样式、各种功能的TableView。只要开发者能想到的列表效果或者功能,都可以利用这份代码迅速编写出来。比如,之前要实现一个填写各种资料的列表,可能需要很多代码,现在只需要几行代码就可以实现。
  • UIScrollSlidingPages – 允许添加多视图控件,并且可以横向滚动。有点类似于Groupon app。
  • HBHorizontalTableView – swift,TableView 横向滚动小示例(仿照 AppStore 应用展示)。
  • HorizontalScrollCell – HorizontalScrollCell是一款使用方便的水平方向可滚动的单元格,适用于UICollectionView中实现水片方向滚动视图。 。
  • SYJiugonggeTableView – tableView封装的九宫格。
  • UUChatTableView – UUChatTableView 气泡聊天界面,支持文本、图片以及音频的气泡聊天界面。源码推荐说明。
  • Chats – 聊天 UI 示例程序。此项目应该只为演示或学习之用,没有服务器 — swift。
  • Atlas-iOS – 快速在iOS里集成聊天功能,类似开源版本的环信。Layer家开源了一套聊天app界面的解决方案.看起来很赞,很多蛮复杂的东西直接都帮封好了。不得不说现在做app开发真是很简单,大部分时间搭积木就可以了。官方网站。
  • DLSlideView – DLSlideView对常见的顶部Tab页点击、滑动分页做了封装。它使用基于ViewController的container特性(而不是scrollview)来管理各个子页面,以支持无限分页,源码推荐说明。
  • VOVCManager – 页面管理器:1.跳转指定页面,只需要知道viewController的Class名,如果有storyboard,则需要指定storyboard名;2.无需添加基类;3.支持URLScheme跳转指定页面。
  • MBXPageViewController – 简洁快速的页面切换–MBXPageViewController,带有按钮控件的UIPageController,非常整洁、简单以及快速。该项目通过三种形式展示页面之间的切换,比如导航栏上的多个tab切换、页面左右两端箭头指示切换,以及使用分段控件。
  • PagerTab – UIScrollView实现滑动转换页面,类似网易云音乐iOS版的页面滑动切换效果。
  • GUITabPagerViewController – 多个tab滑动切换。
  • VOMetroLayoutDemo – Metro风格的UICollectionView, 目前只支持横向布局,仅在iPad上应用。
  • KYCellAnimation – 给UITableViewCell增加进入的动画。
  • COBezierTableView – swift,通过编辑 Bezier 曲线四点位置设置 TableView 内 Cell 及对应按扭位置。实验效果很赞。
  • RDVTabBarController – 一个TabBar组件,可以方便设置底部菜单的文字图片,点击效果,小红点提示等。
    • LxTabBarController – 改变了原生tabbar切换tab时的生硬效果,并加入滑动切换手势(有和界面上的其它手势发生冲突的风险,可根据具体项目予以关闭),swift版本。
  • 横向展示文本内容的自定义cell – 可以横向展示文本内容的自定义cell,根据文本无限滚动。
  • UITableView-FDTemplateLayoutCell – UITableView-FDTemplateLayoutCell 是一个方便缓存 UITableViewCell 的高度的框架。
  • ExpandingStackCells – 采用 UIStackView 实现表格单元格扩展内容显示示例及解决方案。
  • Sapporo – swift 单元格模型驱动的集合视图管理器组件。又一个超实用的“轮子”。
  • MDIHorizontalSectionTableViewController – 根据产品需求开源了一个交互项目,可以理解为横向Section的TableView,section和cell同时支持拖拽,后续安卓版本也会开源出来。
  • JZNavigationExtension – 多功能导航控制器,可以透明返回栏。
  • QuickRearrangeTableView – 基于 UITableView 的快速重排功能扩展子类。通过长按选定单元格然后滚动移动到指定位置。
  • uicollectionview-reordering – UICollectionViews的拖拽(拖动、移动)效果,实例教程.
  • DZNEmptyDataSet – DZNEmptyDataSet算是一个很标准的iOS内建方式,适合用来处理空的table view和collection view。会自动将collection view处理完善,并将用户消息以合适美观的方式显示出来。每个iOS项目都可以自动处理。
  • MGSwipeTableCell – 另一个常见于很多应用中的UI组件,苹果应该考虑在标准的iOS SDK中加入一些类似的内容。Swipeable表格cell是这个pod的*佳描述,也是*好的。
隐藏与显示
  • SlideTapBar – 滚动栏菜单,向上滚动时隐藏tabbar,向下滚动马上显示tabbar。
  • FoldingTabBar.iOS – 可折叠Tab Bar和Tab Bar Controller。
  • LTNavigationBar – LTNavigationBar为app导航栏添加动态着色效果,可自定义其背景色。Demo包含:1.变换背景色;2.滚动视图,导航栏和状态栏重叠。
  • BLKFlexibleHeightBar – 固定Header的效果库。
HUD与Toast
  • MBProgressHUD – *多人用的loading。
  • SVProgressHUD – SVProgressHUD的loading,如果你需要定制化的等待提示器,这个就是了(也许是*好的)。
  • ProgressHUD – ProgressHUD的loading,使用*简单。
  • MMProgressHUD – 设置HUD出现和消失的方式(包括上下、左右、淡入淡出、放大缩小等等),设置HUD的内容(可以在HUD中加入帧动画、动态图片等等),设置HUD出现时的底部覆盖层颜色,等等。总而言之,这是一份集大成的HUD代码。慢慢看视频吧,囊括了所有效果。
  • WSProgressHUD – 一个小巧精致的HUD,支持添加到自定义View上, 还有更多小细节.。
对话框
  • WCAlertView – 自定义的对话框。
  • IOS7AlertView – IOS7AlertView的对话框。
  • AMSmoothAlert – 动画效果不错,*多star,但不支持arm64。
  • DQAlertView – 扁平化的样式不错。
  • HHAlertView – 一个简易的alertview 有三种样式,有成功,失败,和警告三种样式,支持Delegate和block两种回调。
  • MJPopupViewController – 实现弹出视图的各种弹出和消失效果,包括淡入淡出(fade in,fade out),从屏幕上方飞进,下方飞出,从屏幕左方飞进,右方飞出等等效果,弹窗。
  • Menu – 项目中可能会用到的常用菜单,以后有时间会继续补充,弹窗。
  • EasyTipView – 弹出提示框类及演示示例。同样地,API 简单、易用。好“轮子”,弹窗。
  • kxmenu – kxmenu弹出菜单,点击视图上任意位置的按钮,会弹出一个菜单,并且有个小箭头指向点击的按钮,类似气泡视图。弹出的菜单位置会根据按钮的位置来进行调整。
  • QBPopupMenu – QBPopupMenu弹出菜单,实现类似 UIMenuItem 的弹出菜单按钮。点击按钮,会弹出一个菜单,上面可以排列多个按钮。纯代码实现,不需要任何图片。
  • STModalDemo – 弹出视图(通知,提示,选择,窗口)。
  • TAOverlay – TAOverlay可通过叠加层展示有用的信息,可自定义文本和背景色,添加阴影和模糊效果,以及更改字体大小或者用自定义图片替换页面上的icon。
  • UICustomActionSheet – 通过模糊背景来着重强调与菜单相关的元素–模糊效果 里面已经收藏。
  • ActionSheetPicker-3.0 – 该项目是此前热门项目ActionSheetPicker的新版本,快速复制了iOS 8上的下拉 UIPickerView/ActionSheet功能。
  • MJAlertView – 3D效果转场效果警示图–MJAlertView。
  • SwiftyDrop – 轻量、易用的小清新弹出列表及信息提示组件真心不错。
其他UI
  • AwesomeMenu – *多人用的Path菜单。
  • DCPathButton – Path,4.0的弹出菜单,呼出或者关闭菜单时,多个小图标会分别按照逆时针和顺时针的方向进行滚动。
  • SphereMenu – 利用UIDynamicAnimator的有趣的菜单,path类似。
  • KYGooeyMenu – KYGooeyMenu 是一个具有 Gooey Effects 带粘性的扇形菜单控件(卫星菜单、path)。
  • TwitterPaggingViewer – 多个Tableview,左右滑动。
  • CircularProgressControl – Circular Progress Control using CAShapeLayer ,环形进度控制条。
  • KDCircularProgress – KDCircularProgress是使用swift制作的色彩炫丽的进度条,可以加入多种颜色来控制进度条的渐变效果。
  • TextProgress – 自定义实现数字进度条:1、可以自定义数字(0-100),填充的比例为当前设置的数字,2、可以实现自定义填充颜色,上下部分都可以,3、可以自定义边界的颜色4、实现了水波动画,可以设置打开或关闭。
  • SDProgressView – 简便美观的进度指示器,此系列共有六种样式的进度指示器。
  • NVActivityIndicatorView – loading 进度条动画,有20-30多种,是在此DGActivityIndicatorView 基础上做得修改。
  • LoopProgressDemo – 环形渐变进度条。
  • 环形渐变进度条实现,
  • XLPagerTabStrip – 做的很棒的iOS下的PagerTabStrip。
  • RandomColorSwift – 一个自动生成好看的颜色的 Swift 库,RandomColorSwift。
  • HexColorService – 将16进制颜色字符串转成UIColor。
  • Rainbow – 旨在提高代码可读性及易用性的 UIColor 扩展,它使原先有限的预定义颜色(方法)选择,扩展至超过 1200 种。
  • UIColor-ChineseTraditionalColors – 中国传统颜色引用 UIColor 扩展。“UIColor.桃红(),UIColor.竹青() …”,共158种。
  • 类似美团的下拉菜单 – 类似美团的下拉菜单,源码推荐说明。
  • 类似美团的下拉选项 – 类似于美团、大众点评的下拉菜单选项,code4app代码,评论代码有瑕疵。
  • CRMediaPickerController – 一个简单易用的图片/视频选择器。1.可同时选择照片和视频。 2.挑选范围有Camera、Camera Roll、Photo Library以及*近拍摄的照片和视频。3.可自定义UIImagePickerController属性(Camera Overlay、Camera Device、Camera View Transform以及allowsEditing)。4.支持横屏和竖屏5.原生的iOS UI。,源码推荐说明。
  • MDCSwipeToChoose – MDCSwipeToChoose可简单地添加滑动手势来调用UIView,并使用该行为提供了一个组件以创建类似Tinder app的like或者dislike界面的轻扫。基于轻扫的方向,你可以决定执行什么样的行为,并且你可以自定义文本颜色和图片。该项目适用于教学用的抽认卡、图片查看器以及其他等。
  • iOS Material Design库 – 该项目借鉴于谷歌的Material Design guideline,用户可自定义背景色。
    • Material-Controls-For-iOS – Material Design风格的各种控件,非常完整全面。
  • ZMaterialDesignUIButton – Swift Material Design UIButton。
  • MediumScrollFullScreen – Medium的可扩展滚动页面,上下滚动时,全屏显示内容,并自然消隐上下菜单。由此项目感知,作者是一位很注重细节的开发者,他的另外几个菜单类项目也都不错,值得参考,比如:PathMenu, MediumMenu 等。
  • WZFlashButton – WZFlashButton,点击后button里面出现水波扩散效果。
  • Twinkle – 为字体加上钻石版闪耀的效果。使用Swift编写。
  • ios-multi-back-button – 可替换内置的UInavigationController返回按钮,长按左上角的返回按钮,实现多层级的快速返回。
  • ASDayPicker – 适用于iOS (iPhone)的日期选择器,类似于Calendar app的周视图。
  • today extension – 用纯代码构建一个Widget(today extension) 。
  • FSCalendar – 日历视图,带有微妙和平滑的滚动效果,可自定义外观–国人。
  • HSDatePickerViewController – 带有Dropbox Mailbox感觉的时间日期选择器。启动是背景被模糊化。界面也是主流的扁平化风格。
  • CFCityPickerVC – 城市选取控制器。
  • JTCalendar – iOS下优美的 Calendar 组件,做 GTD 类 App 必备。
  • Persei – 动画隐藏或显示顶部菜单支持库及示例项目。–swift
  • PDTSimpleCalendar – 是iOS*棒的日历组件了。你可以在各个方面对它进行定制,无论是运行逻辑还是外观方面。
  • Form – JSON 驱动的 Form表单系统,复杂的表单填写类 App *其需要(比如淘宝呢!)。
  • SwiftyFORM – swift 表单输入框架(亮点是表单验证规则引擎),是我见过地*易用的 Swift 表单组件。
  • SwiftSpinner – SwiftSpinner是使用swift制作的一款精致带感的指示器,并且连带有字体信息显示,模糊背景,半透明,扁平化等IOS8的效果。
  • AKPickerView-Swift – 一款小而美的 3D 效果选择器。
  • ImagePickerSheet – 图片或视频选择器(可多选)组件及其示例项目。
  • iOS-RatingBar – iOS-RatingBar swift版的评分控件,跟Android的RatingBar一样有两种模式,评分模式和只读模式’支持视图编辑,自定义星星数量,评分等级,另外还能支持非整数星,0.5颗星,0.1颗星,可以开启动画效果。
  • RKNotificationHub – 快速给 UIView 添加上炫酷的通知图标(Badge、红点、提示)。
  • WZLBadge – Badge,支持横竖屏支持iOS5~iOS8允许高度定制化,包括“红点”的背景颜色,文字(字体大小、颜色),位置等。说明.
  • BubbleTransition – 以气泡膨胀和缩小的动画效果来显示和移除 controller,Uber的就是这种取消操作的方式。
  • KYFloatingBubble – 类似iOS7中Game Center浮动气泡的效果。
  • DKNightVersion – DKNightVersion 是一个支持夜间模式切换的框架。
  • EasyUIControl – 一个可以简化界面ui的控件框架。
  • LxGridView-oc LxGridView-swift – 利用UICollectionView模仿iOS系统桌面图标的交互,作用如动图。
  • QQBtn – 仿QQ未读消息弹性按钮动画,达到和手机QQ未读信息一样的动画效果,效果基本实现。
  • GMStepper – swift 带动画效果、支持手势滑动操作的步进标签。
  • TZStackView – OS 9 UIStackView 功能模拟实现于 iOS 7/ iOS 8 内。
  • LayoutTrait – swift 一个小类库。 做iPad 多任务分屏 适配的同学可以看一下。
  • HACursor – HACursor,是一个对横向ScrollView中的视图进行管理的UI控件。只要几行代码就可以集成类似于网易新闻对主题页面进行排序,删除操作的功能。
  • ZTPageController – 模仿网易新闻和其他新闻样式做的一个菜单栏,栏中有各自的控制器,其中有4中展示样式’网易style’ ’搜狐style’ ’腾讯style1′ ’网易style2′ 。
  • Ruler – 尺子。
  • HUMSlider – HUMSlider是一款能够自动显示刻度记号的滑竿,滑动到某处,该处的刻度会自动上升,两边还能配置图像。支持代码或storyboard中实现。
  • JDSelectedDemo – 仿京东筛选菜单实现。
  • BTNavigationDropdownMenu – 下拉列表暨导航标题组件。简单、直接、易用 -swift。

动画

  • Core Animation笔记,基本的使用方法 – Core Animation笔记,基本的使用方法:1.基本动画,2.多步动画,3.沿路径的动画,4.时间函数,5.动画组。
  • awesome-ios-animation – iOS Animation 主流炫酷动画框架(特效)收集整理 收集整理了下iOS平台下比较主流炫酷的几款动画框架。
侧滑与右滑返回手势
  • SloppySwiper – iOS系统自带的UINavigationController要7.0才支持,但不过该手势只能从屏幕左侧边缘识别,如果要扩大到整个屏幕范围怎么办?配合一个SloppySwiper无需代码就可以轻松实现。此库支持iOS5.0以上版本(另外:Nav的title滑动不明显,本人写了2个类似的控件),SloppySwiper-demo :代码方式与storyboard方式。
  • SCNavigation – UINavigation可以右滑返回,隐藏UINavigationBar。
  • UINavigationController-YRBackGesture – 支持右滑返回手势,标题栏不动。
  • GHSidebarNav – 现在比较流行使用侧开(侧滑)菜单设计。试了不少控件,感觉GHSidebarNav*成熟,尤其对纯代码创建的界面兼容性*好。在Storyboard中使用GHSidebarNav侧开菜单控件。
  • iOS-Slide-Menu – 能够类似Facebook和Path那样弹出左右边栏侧滑菜单,还支持手势。多种可以自定义的属性 (非常不错)。
  • ECSlidingViewController – 侧滑菜单。
  • JASidePanels – 侧滑菜单,有左右菜单,有pop功能,支持手势侧滑,本人使用中:简单。
  • animated-tab-bar – 让 Tabbar items能显示萌萌的动画。
  • tabbar图标动画 – tabbar上图标的动画实现,源码推荐说明。
  • SideMenu – swift实现,一款带动画效果可定制 Slide Menu,可以学习其动画实现思路。P.S. 对于Hamburger式菜单,虽然很常用,不过,苹果并不鼓励使用,甚至有开发小组对其弊病用自家上线应用前后数据对比进行了抨击。
  • RESideMenu – 侧开菜单,qq类似。
  • JHMenuTableViewDemo – 仿网易邮箱列表侧滑菜单。
  • SlideMenuView – 炫酷侧滑菜单布局框架,Android版本的一致实现。
  • QQConfiguration – swift,QQ-iPhone端框架,左侧菜单栏拖动手势。
  • KGFloatingDrawer – 侧滑菜单,qq类似,KyleGoddard/KGFloatingDrawer:一款适合于大屏手机或平板的浮动抽屉式导航界面组件。效果很赞- 侧开菜单,qq类似(与RESideMenu类似)。
  • AIFlatSwitch – 一款带平滑过渡动画的 Switch 组件类,类相同风格的 Menu/BackHamburgerButton,类似相同风格的 Menu/Closehamburger-button.
  • JHChainableAnimations – 在应用中采用链式写出酷炫的动画效果, 使代码更加清晰易读,利用block实现的链式编程。
  • WXGSlideMenuDemo – 个简单实现侧拉(侧滑)菜单的小demo,供初学者共同学习、练习使用。
  • PKRevealController – PKRevealController是一个可以滑动的侧边栏菜单(可向左、向右或者同时向两侧),只需手指轻轻一点(或者按一下按钮,但是这样滑动时不够炫酷),这类控制的其他库,而PKRevealController是*棒的。安装简便,高度定制且对手势识别良好。可以当做一个标准控件用在iOS SDK中。
  • SwiftPages – 高可定制类似 Instagram 视图滑动切换功能类库。API 简单、易用。
  • FlipBoardNavigationController – FlipBoardNavigationController。
  • MMDrawerController – *多人用的一个有关侧边“抽屉”导航框架,里面还有很多你意想不到的交互效果,侧滑。
  • UIWebView翻页返回效果 – UIWebView翻页返回效果(变通方法)。
gif动画
  • UIImageView-PlayGIF – UIImageView-PlayGIF。
  • YLGIFImage – YLGIFImage。
  • YLGIFImage-Swift – YLGIFImage-Swift。
其他动画
  • popping – popping是一个POP 使用实例工程
  • SinaMenuView – 用POP动画引擎写的Sina微博的Menu菜单。
  • MMTweenAnimation – facebook POP的自定义动画扩展(基于POPCustomAnimation) 提供10种函数式动画。
  • ZQLRotateMenu – 这是一个旋转视图的选择器。
  • CoolLoadAniamtion – 一个简单但是效果不错的loading动画。
  • SequenRotateAnimation – 一个简单的loading次序动画。
  • SYAppStart – App启动插画的自定义过度。
  • VJDeviceSpecificMedia – 如何根据设备选择不同尺寸的图片 可以通过设置不同尺寸设备的LaunchImage,来使得App适配这些设备,要是在不同不同尺寸设备上使用不同大小的图片,则需要在代码中一一判断,然后加载。
  • RMParallax – RMParallax是一个app启动页引导开源项目,除了细微的翻页视差效果,描述文本的过渡也非常美观(版本新特性)。
  • ADo_GuideView – 转动的用户引导页(模仿网易bobo) 因为没有从app包里抓到@3x的图片,建议在iPhone5模拟器运行,保证效果~ (版本新特性)。
    • CoreNewFeatureVC – 版本新特性(引导页),1.封装并简化了版本新特性启动视图!2.添加了版本的本地缓存功能,3.集成简单,使用方便,没有耦合度,4.支持block回调。
  • Spring – Spring是一个Swift编写的开源库,可简化Swift编写的iOS动画。支持shake、pop、morph、squeeze、wobble、swing、flipX、flipY、fall、squeezeLeft、squeezeRight以及squeezeDown等多种动画形式,用 IBDesignable 让使用者可以在 Xcode 中快速设置动画效果。
  • KYBezierBounceView – 手势控制贝塞尔曲线,取消手势贝塞尔曲线会有反弹效果。
  • cadisplaylinkanduibezierpath – CADisplayLink结合UIBezierPath的神奇妙用。
  • KYCuteView – 实现类似QQ消息拖拽消失的交互+GameCenter的浮动小球效果,分析。
  • KYWaterWaveView – 一个内置波浪动画的UIView,里面有鱼跳跃水溅起来的效果。
  • KYPingTransition – 实现圆圈放大放小的转场动画,可以根据自己的需要使用Paper中的弹性效果,有Material风格。
  • KYNewtonCradleAnimiation – 牛顿摆动画。
  • LayerPlayer – 一款全面展示核心动画 API 示例项目(上架应用)。包括 CALayer, CAScrollLayer, CATextLayer, AVPlayerLayer, CAGradientLayer, CAReplicatorLayer, CATiledLayer, CAShapeLayer, CAEAGLLayer, CATransformLayer, CAEmitterLayer 等使用的互动演示。
  • JGTransitionCollectionView – swift,基于集合视图扩展实现完成自动布局及单元项 Flip式动画效果(效果很赞)。组件使用方便、自然(只需设置集合视图数据源的标准方式即可)。
  • KYShareMenu – 带弹性动画的分享菜单。
  • Context-Menu.iOS – 可以为app的菜单添加漂亮的动画内容,可自定义icon,并可根据自己的喜好设计单元格和布局。
  • DeformationButton – 一个简单的变换形状动画按钮。
  • UnReadBubbleView – UnReadBubbleView是一个能够拖拽并拉长的气泡视图。拖拽到一定的长度会消失,可以通过系数设置来控制拖拽的长度。气泡也支持多种属性设置。
  • PPDragDropBadgeView – 实现了类似于QQ 5.0 水滴拖拽效果. 支持iOS 5.0+ ARC,气泡能够带有数字标识,同时支持消失block方法。消失时还带有消失效果动画。
  • GiftCard-Implementation – 购买的炫酷动画。
  • iCarousel – iCarousel是一个类,它继承于UIView。用于简化实现各种类型的旋转木马(分页滚动视图),无限轮播 ,iOS开发之多图片无缝滚动组件封装与使用。
  • KIPageView – 无限循环PageView,横向TableView,无限轮播。
  • HotGirls – 卡片动画。
  • tispr-card-stack – swift 卡片风格动画切换组件及完整交互示例。
  • ZLSwipeableViewSwift – swift 卡片堆叠效果的实现(ZLSwipeableView)】可实现类似Tinder和Potluck应用程序的卡片堆叠效果,该项目基于ZLSwipeableView objective-c实现。1.自定义动画。2.自定义滑动切换。3.自定义方向。4.撤销。
  • Koloda – 基于卡片的 Tinder-style 动画效果示例。精细*人。更赞的是额外附了详细开发教程 How We Built Tinder-Like Koloda Animation in Swift 网页链接 。Yalantis 出品动画程序款款精品。
  • QQPersonalInfoTransition – 仿照QQ的转场。
  • KYAnimatedPageControl – 除了滚动视图时PageControl会以动画的形式一起移动,点击目标页还可快速定位。支持两种样式:粘性小球和旋转方块。
  • KDIntroView – swift 动态介绍视图框架及演示。另外两个相似的类库是 RazzleDazzle和 Presentation,择需使用。
  • RazzleDazzle – 【IFTTT开源Swift编写的帧动画框架–RazzleDazzle】RazzleDazzle 是IFTTT开源的一个iOS帧动画框架,非常适用于APP初次使用时的介绍和引导信息。JazzHands是UIKit一个简单的关键帧基础动画框架,可通过手势、scrollview、KVO等控制动画,被IFTTT应用在IFTTT for iPhone上。
  • Presentation – 一个类似RazzleDazzle的框架。
  • FillableLoaders – 基于 CGPaths 可定制个性化填空式装载类库。附水波上涨式示例。
  • SXWaveAnimate – 实现非常美观的灌水动画。
  • LSPaomaView – 可循环滚动的较长文字,跑马灯,效果很好,一句话集成。
  • SIFloatingCollection_Swift – 可定制的 Apple Music 风格浮动形状动画组件及演示。
  • Cheetah – 易用、高可读链式动画类库。另一个类似类库是 DKChainableAnimationKit。
  • CKWaveCollectionViewTransition – swift, UICollectionViewController之间切换的动画。
  • TKSubmitTransition – 基于 UIButton 的登录加载、返回按钮转场动画组件及示例。

网络相关

网络连接
  • AFNetworking – ASI不升级以后,*多人用的网络连接开源库,iOS网络编程之AFNetworking使用,iOS开发下载文件速度计算。
  • Alamofire – Alamofire是AFNetworking的作者mattt新写的网络请求的swift库。
  • YTKNetwork – 是基于 AFNetworking 封装的 iOS网络库,提供了更高层次的网络访问抽象。相比AFNetworking,YTKNetwork提供了以下更高级的功能:按时间或版本号缓存网络请求内容、检查返回 JSON 内容的合法性、文件的断点续传、批量的网络请求发送、filter和插件机制等。
  • LxFTPRequest – 支持获取FTP服务器资源列表,下载/上传文件,创建/销毁ftp服务器文件/目录,以及下载断点续传,下载/上传进度,自动判断地址格式合法性跟踪等功能!国人开发,QQ:349124555。
  • HSDownloadManager – HSDownloadManager,下载音乐、视频、图片各种资源,支持多任务、断点下载。
  • MutableUploadDemo – 模拟需求:图文混编,要求用户选择图片后就上传,可选择多图,并行上传,用户确定提交后后台执行,必须全部图片上传完才能提交文字。
  • WTRequestCenter – 方便缓存的请求库,提供了方便的HTTP请求方法,传入请求url和参数,返回成功和失败的回调。 UIKit扩展提供了许多不错的方法,快速缓存图片,图片查看,缩放功能, 颜色创建,设备UUID,网页缓存,数据缓存等功能。 无需任何import和配置,目前实现了基础需求。
  • MMWormhole – Message passing between iOS apps and extensions 2个iOS设备之间通信。
  • socket.io-client-swift – WebSockect 客户端类库。开放的通讯协议,有利于构建强大地跨平台应用。
  • Transporter – swift, 短小、精悍、易用的多文件(并发或顺序)上传和下载传输库。还支持后台运行、传输进程跟踪、暂停/续传/取消/重试控制等功能。
  • STNetTaskQueue – STNetTaskQueue Objective-C 可扩展网络请求管理库。
  • CocoaAsyncSocket – 在iOS开发中使用socket,一般都是用第三方库AsyncSocket,不得不承认这个库确实很强大,使用教程。
  • GCDAsyncSocket – GCDAsyncSocket , 不错的Demo。
  • Just – 小而美的 HTTP 类。功能简单、直接、完整且健壮性高– swift。
  • Future – 基于微框架设计思想的异步执行及结果响应类,代码即简单又干净– swift。
  • MZDownloadManager – 下载管理。
  • DVR – 针对网络请求的测试框架,超实用的工具。且支持 iOS, OSX, watchOS 全平台。
  • HFDownLoad – iOS开发网络篇之文件下载、大文件下载、断点下载:NSData方式、NSURLConnection方式、NSURLSession下载方式 下载方式具体的思路、区别见Blog 。
图像获取
  • SDWebImage – SDWebImage 网络图片获取及缓存处理。
  • Kingfisher – 纯 Swift 实现的类 SDWebImage 库,实现了异步下载和缓存图片。
  • KFSwiftImageLoader – Swift,一个图像缓存加载库。
  • FastImageCache – FastImageCache 网络图片获取及缓存处理,iOS图片加载速度*限优化—FastImageCache解析。
  • EGOCache – 十分知名的第三方缓存类库,可以缓存NSString、UIImage、NSImage以及NSData。除此,如果还可以缓存任何一个实现了接口的对象。所有缓存的数据都可以自定义过期的时间,默认是1天。EGOCache 支持多线程(thread-safe),UITableView加载多张照片导致内存上涨的问题。
网络聊天
  • XMPPFramework – XMPPFramework openfire聊天。
  • SXTheQQ – 用xmppFramework框架编写QQ程序,主要为了练习通讯的一些原理,界面比较渣 必须要先在本地配置好环境才可以运行。
  • 环信 – 给开发者更稳定IM云功能。8200万用户考验,好用!(暂无及时语音、视频通话)
  • 融云 – 即时通讯云服务提供商。(暂无及时语音、视频通话)
  • 容联云通讯 – 提供基于互联网通话,视频会议,呼叫中心/IVR,IM等通讯服务。
  • chatsecure – 基于XMPP的iphone、android加密式聊天软件, chatsecure官网 。 iOS代码1,iOS代码2,iOS中文版。
  • MessageDisplayKit – 仿微信聊天,参考JSQMessagesViewController。(国人写)
  • JSQMessagesViewController – 聊天 。
  • SunFlower – 环信聊天demo,比较多功能 。
  • BlueTalk蓝牙聊天 – 以MultipeerConnectivity为基础, 实现了简单的蓝牙聊天。
网络测试
  • Reachability – 苹果提供过一个Reachability类,用于检测网络状态。但是该类由于年代久远,并不支持ARC。该项目旨在提供一个苹果的Reachability类的替代品,支持ARC和block的使用方式。iOS网络监测如何区分2、3、4G
  • SimpleCarrie – 简单的运营商信息获取!。
  • NetReachability – swift2.0 简单的方法检查网络连接的连通性,提供通知中心集成接口。
WebView
  • MGTemplateEngine – MGTemplateEngine比较象 PHP 中的 Smarty、FreeMarker 和 Django的模版引擎,是一个轻量级的引擎,简单好用。只要设置很多不同的HMTL模版,就能轻松的实现一个View多种内容格式的显示,对于不熟悉HTML或者减轻 工作量而言,把这些工作让设计分担一下还是很好的,也比较容易实现设计想要的效果。
  • NJKWebViewProgress – 一个 UIWebView 的进度条接口库,UIWebView 本身是不提供进度条的。
  • GTMNSString-HTML – 谷歌开源的用于过滤HTML标签。

Model

  • JSONKit – JSONKit库是非常简单易用而且效率又比较高的,重要的JSONKit适用于ios 5.0以下的版本,使用JSONKit库来解析json文件,只需要下载JSONKit.h 和JSONKit.m添加到工程中;然后加入libz.dylib即可。
  • JSONModel – 解析服务器返回的Json数据的库,JSONModel源码解析一。
  • Mantle – Mantle主要用来将JSON数据模型化为OC对象, 大系统中使用。为什么选择Mantle。
  • RFJModel – RFJModel是一个IOS类库,可以将JSON字典自动装填到OBJC对象。相比JSONModel有一些非常好的特性,使用上也比较简单。
  • XMLDictionary – ios与mac os平台下xml与NSDictionary相互转化开源类库。
  • MJExtension – 用于json转model进行使用,转换效率很高,使用也比较简单,只要前后台约定好,json直接就转成了model。
  • CFRuntime – “Swift 版的 MJExtension,运行时、反射与一键字典模型互转”。
  • DDModel – 快速搭建项目Model层,支持ORM映射关系,能从JSON/XML直接实例一个Model对象。支持SQLite本地数据持久化,封装了HTTP, 减少HTTP代码与UIViewController的代码耦合,支持Cache;类似RESTKit、Mantle的功能;使用该类库以后简化了网络层的开发工作,把更多的精力放在UI上面;目前只支持GET/POST方法的请求。使用到的第三方库有:1.SQLitePersistentObject; 2.JTObjectMapping; 3.AFNetworking; 4.XMLDictionary;
  • protobuf-swift – Protocol Buffers 的 Swift 语言实现库。P.S. Protocol Buffers 是 Google 开源项目,主要功能是实现直接序列化结构化的对象数据,方便跨平台快速传递,开发者也可以直接修改 protobuf 中的数据。相比 XML 和 JSON,protobuf 解析更快,存储更小。
  • JSONCodable – 基于 Swift 2.0 新特性(Protocol Extensions and Error Handling)的JSON 解析类。
  • SwiftyJSON – 使Swift的JSON解析变得简单。

其他

  • DateTimeKit – 一个超赞的时间处理的库,Joda-Time ! 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。
  • SwiftDate – 特别完整、强大的日期时间操作管理类库。它几乎涵盖了已知开源日期类库所有优秀特性。 他能帮你轻松处理时区,处理时间加减,计算到期时间等等场景下的问题。
  • iOS私有API – 私有API,绿色 == public,红色 == private,蓝色 == dylib。
  • iOS源代码 – iOS源代码。
  • libfacedetection – C++ 人脸识别 包含正面和多视角人脸检测两个算法.优点:速度快(OpenCV haar+adaboost的2-3倍), 准确度高 (FDDB非公开类评测排名第二),能估计人脸角度。
  • Slidden – 一个老外开源的开发自定义键盘的库,利用这个开源库,可以方便的配置键位、颜色以及键位对应的图片。
  • TPKeyboardAvoiding – 用户键盘弹出自动计算高度,进行屏幕滚动操作。
  • CDPMonitorKeyboard – CDPMonitorKeyboard封装,可以解决输入视图(例如textField,textView等)被键盘覆盖问题,并可设置高于键盘多少。
  • 自动监听键盘高度 – 自动监听键盘高度,初始界面,输入框在屏幕*下方,当键盘出现时,输入框随即移动到键盘上方。
  • SYKeyboardTextField – SYKeyboardTextField 是一个轻巧,简单,非侵入式的键盘附随输入框! 采用Swift编写。
  • BlocksKit – block框架,为 OC 常用类提供了强大的 Block 语法支持,使得编写 OC 代码变得舒适、快速、优雅。
  • KVOController – 在项目中有使用 KVO ,那么 KVOController *对是个好选择。它是 facebook 开源的一个 KVO 增强框架。
  • appirater – 用于提醒用户给你的 APP 打分的工具。
  • MotionKitr – 为核心运动框架(The Core Motion framework)提供友好的类库封装,以更方便使用三轴陀螺仪和加速感应器特性。
  • Review Monitor – *时间自动推送 Apple Store 的用户评论到你的邮件箱或者 Slack,*时间跟进用户反馈,打造优秀 App 必备工具!类似的有:App annie 的类似功能。
  • WBWebViewConsole – 类似微博iPhone客户端的 “调试选项” 吗?把其中的 “内置浏览器网页调试” 开源在 Github 上了。
  • ios-good-practices – ios-good-practices iOS 开发*佳实践。
  • iOS开发*佳实践 – iOS 开发*佳实践 — 中文。
  • TodayExtensionSharingDefaults – TodayExtensionSharingDefaults是一个iOS 8 Today扩展示例,可以使用NSUserDefaults与其containing app分享数据。
  • QRCodeReader.swift – QRCodeReader.swift一款简单的 QR 二维码阅读组件及示例,提供前后相机切换功能。
  • QRCatcher – 一个简洁美观的二维码扫描应用, iOS学习:AVFoundation 视频流处理–二维码扫描。
  • Parsimmon – swift,小而美的语言学类库封装工具包。提供分词、标记词性、词形归并、朴素贝页斯分类、决策树等自然语言分析小工具。P.S. 英语分词效果好于中文,感兴趣的同学可以针对中文做一些优化开发。参考译文 NSHipster – NSLinguistic​Tagger。
  • Password-keyboard – 随机变换数字位置的密码键盘。 模仿银行类应用在付款时输入的随机密码键盘。
  • MKMapView-Extension – 这是关于 MKMapView 写的一个基于swift的扩展,可以扩展 MKMapView 的相关功能,减少复用代码量。
  • SemverKit – 针对符合『语义化版本规范 2.0.0』版本号的解析、比较运算类库。不仅支持 Major, Minor, Patch,还支持 Alpha 和 Beta 预发布版本,以及相应地递增运算扩展。
  • SwiftValidator – 基于规则的输入验证类库。项目良好的面向对象设计思想,使规则的扩展及自定义非常方便。更专业的规则引擎(甚至是基于自然语言的规则配置)解决方案,比如:开源的 Drools,商用的 ILOG 等。
  • Tesseract-OCR-iOS – 有关OCR文字识别项目。
  • Screenotate – 支持 OCR 文字识别的载屏笔记 Mac 完整应用。
  • iOS-Categories – 收集了许多有助于开发的iOS扩展,各种category。
  • Olla4iOS – 过去积累的一些方便复用的类和方法,还在整理中。
  • DKNightVersion – 用*快的方式给你的应用加上夜间和白天的切换效果。
  • TouchVisualizer – 实用的多点触摸可视化组件。扩展并作用于 UIWindows,结构上提供了简单地针对触摸显示定制,比如触摸点的颜色。
  • RegexKitLite – 用来处理正则表达式。
  • XcodeServerSDK – 非官方 Xcode Server SDK 封装库。 P.S. 该 SDK 分离自之前推荐的由该作者开发的自动测试框架 Buildasaur。
  • BFKit-Swift – BFKit-Swift 这套工具库可以提高应用开发效率。
  • CKSIncrementalStore – 基于 CloudKit 服务器实现多终端数据同步。
  • SwiftSequence – 简洁、灵活、多变的操作 SequenceType 的类库(基于微框架(μframework)设计思想)。
  • IDNFeedParser – 一个简单易用的Rss解析库。
  • CoreUmeng – 简单:友盟分享封装。
  • openshare – 不用官方SDK,利用社交软件移动客户端(微信/QQ/微博/人人/支付宝)分享/登录/支付。
  • Swifternalization – 一套实用的本地化工具库。使用教程及 API 文档完整。值得收入项目的“轮子”。
  • apous – 一款有趣的 Swift 应用 - 让 Swift 成为脚本语言。
  • Mirror – 通过反射(Refection)实现镜像对象封装库。从而可以更轻松获取(或输出)对象属性名、类型及值变量。
  • Proposer – Proposer 用单个 API 处理 iOS 上的权限请求,以便使用前确认可访问“相册”、“相机”、“麦克风”、“通讯录”或“用户位置”。
  • PermissionScope – 用这个库可以在询问用户前,就告知用户所需的系统权限,为用户带来更好的体验。接受度更高—>更多活跃用户->更高的留存率->数据更好->下载率更高。
  • LocationManager – CoreLocation使用起来还是比较麻烦的,需要授权,判断系统版本等等,所以推荐使用第三方框架LocationManager,使用Block,十分简单!iOS-CoreLocation:无论你在哪里,我都要找到你!。
  • pangu.objective-c – 有多种语言实现版本~ Pangu.Objective-C:格式化中英文之间的空格(OC)。
  • objection – 一个轻量级的依赖注入框架Objection。
  • ControlOrientation – 如何用代码控制以不同屏幕方向打开新页面【iOS】, 使用说明。
  • iRate – 问卷调查。
  • GameCenterManager – 在iOS上管理GameCenter vanilla并不算难,但是有了这个库会更简单也更快。好上加好不是更好么。
  • SlackTextViewController – 用作*佳、定制的文本输入控制时,自适应文本区域,手势识别、自动填充、多媒体合并,快速drop-in解决方案。
  • IAPHelper – 应用内付费给我们提供了很多样本代码,而这个库丢掉了那些代码,将金钱交易相关的大多通用任务做了简单的封装。
  • TAPromotee – 交叉推广应用是你可以免费实现的*佳市场推广策略之一。使用这个库做起来非常简单,不用都不可能——将TAPromotee加入你的podfile中,免费配置与享受更多下载吧。
  • DownloadFontOnline – 实现了在线下载一些字体的功能,不用在工程中导入字体库,下载的字体也不会保存在你的应用中,所以可以放心使用。修复了一下崩溃的bug。
  • STClock – 仿锤子时钟。
  • GitUp – GitUp是一个可视化的Git客户端,能够实时的进行编辑、合并、回滚等多种操作,更多功能,请下载体验。
  • 获取联系人信息,通讯录 – 获取联系人信息,通讯录。
  • Universal-Jump-ViewController – 根据规则跳转到指定的界面(runtime实用篇一)。

数据库

  • FMDB – sqlite的工具, 多线程FMDatabaseQueue实例,FMDB数据库的使用演示和封装工具类。
  • GXDatabaseUtils – 在FMDB基础上的工具。
  • realm-cocoa – Realm是一个真正为移动设备打造的数据库,同时支持Objective-C和Swfit。Realm宣称其相比Sqlite,在移动设备上有着更好的性能表现,官方中文。
  • Breeze – 用Swift写的一个轻量级的CoreData管理工具,并且还支持iCloud 。
  • AlecrimCoreData – Swift,更容易地访问 CoreData 对象封装类库。除了 CRUD,还提供指针定位,强大的排序、筛选,异步数据获取,以及独立线程后台存取数据。
  • CoreStore – Core Data 管理类库。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
  • MagicRecord
  • MagicalRecord – MagicalRecord就像是给Core Data提供了一层外包装,隐藏掉所有不相关的东西。 其中事务管理及查询是其比较大的亮点,整套 API 功能完整。
  • Presentation – 重量级好项目 Presentation,它可以方便你制作定制的动画式教程、Release Notes、个性化演讲稿等。
  • CoreValue – Swift 2 版 Core Data 封装库。相比另外两个 SwiftRecord和 CoreStore更轻量。
  • SQLCipher – SQLCipher使用256-bit AES加密,SQLCipher分为收费版本和免费版本。官方教程,加密你的SQLite – 各种sqlite数据库加密介绍。 SQLCipherDemo下载 。

缓存处理

  • YTKKeyValueStore – Key-Value存储工具类,说明。
  • TMCache – TMCache 是 Tumblr 开源的一个基于 key/value 的数据缓存类库,可以用于缓存一些临时数据或者需要频繁加载的数据,比如某些下载的数据或者一些临时处理结果。
  • JLKeychain – 快捷使用keychain存储数据的类,使keychain像NSUserDefaults一样工作。
  • sskeychain – SSKeyChains对苹果安全框架API进行了简单封装,支持对存储在钥匙串中密码、账户进行访问,包括读取、删除和设置。
  • KeychainAccess – 管理Keychain接入的小助手。

PDF

  • Reader – Reader可提供类似iBooks的文档导航,支持屏幕旋转和所有方向,并通过密码保护加密PDF文件,支持PDF链接和旋转页面。

图像浏览及处理

  • FLAnimatedImage – gif播放处理的工具。
  • CLImageEditor – 超强的图片编辑库,快速帮你实现旋转,防缩,滤镜等等一系列麻烦的事情。
  • ios-image-filters – 图像滤镜,库比较旧了,很容易崩溃。
  • XBImageFilters – 图像滤镜,。
  • VIPhotoView – 用于展示图片的工具类,因为是个 View,所以你可以放在任何地方显示。支持旋转,双击指定位置放大等。
  • MWPhotoBrowser – 一个非常不错的照片浏览器,在github的star接近3000个,解决MWPhotoBrowser中的SDWebImage加载大图导致的内存警告问题。
  • core-image-explorer – Core Image 滤镜处理图片– swift ,Core Image 介绍。
  • CoreImageShop – CoreImageShop图片滤镜处理– Mac app that let you create a complete Core Image Filter usable on iOS using SCRecorder。
  • GPUImage – 处理图片效果。
  • RSKImageCropper – 适用于iOS的图片裁剪器,类似Contacts app,可上下左右移动图片选取*合适的区域。
  • WZRecyclePhotoStackView – 删除照片交互–WZRecyclePhotoStackView,就是模拟生活中是删除或保留犹豫不决的情形而产生的。 在上滑,下滑的部分,借鉴了TinderSimpleSwipeCards。
  • TimingFunctionEditor – TimingFunctionEditor用swift编写, 贝塞尔曲线编辑器,编辑后可以预览或拷贝代码片段直接使用。P.S. 该项目采用更简单的依赖管理器 Carthage ,而非常用的 CocoaPods。Carthage介绍中文。
  • AAFaceDetection – AAFaceDetection–swift,简单、实用的面部识别封装库。虽然该技术从 iOS 5 发展,不过真正有趣的应用还不多。。
  • PhotoTweaks – 这个库挺赞的,正好是对图像操作的。
  • Concorde – swift, Concorde, 一个可用于下载和解码渐进式 JPEG 的库, 可用来改善应用的用户体验。
  • ZoomTransition – swift, 通过手势操控图片的放大、缩小、旋转等自由变化效果的组件及示例。
  • AFImageHelper – swift,一套针对 UIImage 和 UIImageView 的实用扩展库,功能包含填色和渐变、裁剪、缩放以及具有缓存机制的在线图片获取。
  • PinterestSwift – swift,Pinterest 风格图片缩放、切换示例。
  • KYElegantPhotoGallery – 一个优雅的图片浏览库。
  • SDCycleScrollView – 无限循环自动图片轮播器(一步设置即可使用)。
  • SDPhotoBrowser – 仿新浪动感图片浏览器,非常简单易用的图片浏览器,模仿微博图片浏览器动感效果,综合了图片展示和存储等多项功能。
  • HZPhotoBrowser – 一个类似于新浪微博图片浏览器的框架(支持显示和隐藏动画;支持双击缩放,手势放大缩小;支持图片存储;支持网络加载gif图片,长图滚动浏览;支持横竖屏显示)。
  • PhotoStackView-Swift – PhotoStackView——照片叠放视图,使用说明。
  • MarkingMenu – 基于手势、类似 Autodesk Maya 风格标记菜单及图片渲染。
  • SXPhotoShow – UICollectionViewFlowLayout流水布局 是当下collectionView中常用且普通的布局方式。本代码也写了三种好看的布局,其中LineLayout和流水布局有很大的相同点就直接继承UICollectionViewFlowLayout,然后StackLayout,CircleLayout这两种都是直接继承自*原始的UICollectionViewLayout 布局方案。
  • PictureWatermark – 主要实现了给图片加文字以及图片水印的功能,已封装成了UIImage的类别,方便使用。
  • CocoaPicker – 仿 QQ 图片选择器(OC)。
  • 自定义宽高比的相册框 拍照 – 取出照片时 弹出自定义view。在这个自定义view上创建一个需要的相框大小的view层 把取出的图片赋值给UIImageView按缩放添加到这个层上。对uiimageView添加捏合、移动 手势。添加按钮 选取,*后根据位移和缩放比例 裁剪image。

摄像照相视频音频处理

  • SCRecorder – SCRecorder 短视频录制。
  • VideoPushDemo – 视频剪辑 视频特效制作1 视频特效制作2。
  • LLSimpleCamera – A simple, customizable camera control for iOS, 摄像头。
  • EZAudio – EZAudio 是一个 iOS 和 OSX 上简单易用的音频框架,根据音量实时显示波形图,基于Core Audio,适合实时低延迟音频处理,非常直观。中文介绍,官网。
  • ffmpeg – ffmpeg官网,FFmpeg在iOS上完美编译。
  • VCL – VCL官网。
  • kxmovie – 使用ffmpeg的影片播放器,修改说明, 修改代码。
  • ijkplayer – B站开源的视频播放器,支持Android和iOS。
  • StreamingKit – StreamingKit流媒体音乐播放器。
  • FreeStreamer – FreeStreamer流媒体音乐播放器,cpu占用非常小。
  • DOUAudioStreamer – DOUAudioStreamer豆瓣的音乐流媒体播放器。
  • fmpro – 电台播放器,支持锁屏歌词,支持基本播放流程,歌词展示,后台锁屏播放和控制以及锁屏后封面+歌词,fmpro_R 。
  • IPDFCameraViewController – 支持相机定焦拍摄、滤镜、闪光、实时边框检测以及透视矫正功能,并有简单易用的API。
  • SCRecorder – 酷似 Instagram/Vine 的音频/视频摄像记录器,以 Objective-C 为基础的过滤器框架。 你可以做很多如下的操作:记录多个视频录像片段。删除任何你不想要的记录段。可以使用任何视频播放器播放片段。保存的记录可以在序列化的 NSDictionary 中使用。(在 NSUserDefaults 的中操作)添加使用 Core Image 的视频滤波器。可自由选择你需要的 parameters 合并和导出视频。
  • Cool-iOS-Camera – Cool-iOS-Camera。
  • FastttCamera – FastttCamera 快速照相。
  • ICGVideoTrimmer – ICGVideoTrimmer提供提供视频剪切的视图(类似系统相册中浏览视频时顶部那个条状视图)。左右两个边界选择器还能够自定义。
  • IOS录音和播放功能demo – 比较完整的ios录音和播放功能的实现。
  • CameraManager – 相机管理封装类库。看着*好用的样子—-swift。
  • MCAudioInputQueue – 简易录音类,基于AudioQueue的。
  • DraggableYoutubeFloatingVideo – 展示像类似Youtube移动应用的那种浏览视频的效果,当点击某视频时能够从右下方弹出一个界面,并且该界面能够通过手势,再次收缩在右下方并继续播放。这是通过AutoLayout设计实现。
  • amr – 做即时通讯的音频处理,录音文件是m4a,便于web端的音频播放。
  • FSVoiceBubble – 一个轻量级播放录音音频的气泡:1.支持短时间的音频播放(支持网络音频);2.播放时的声波动画;3.自定义包括声波的颜色,气泡的背景等。
  • KRVideoPlayer – 类似Weico的播放器,支持竖屏模式下全屏播放。
  • VideoBeautify – 功能酷似美拍,秒拍等应用的源码:对视频进行各种美化处理,采用主题形式进行分类,内含各种滤镜,动画特效和音效等。

响应式框架

  • ReactiveCocoa – ReactiveCocoa 受函数响应式编程激发。不同于使用可变的变量替换和就地修改,RAC提供Signals来捕获当前值和将来值( 使用介绍 ),不错的例子,入门好教程:ReactiveCocoa入门教程:*部分 。Reactive Cocoa 3.0 在 MVVM 中的应用 。
  • ReactiveAnimation – ReactiveCocoa 推出了一个叫 ReactiveAnimation 的子项目,直接用完全用 Swift 来实现了。
  • BeeFramework – 与ReactiveCocoa类似,BeeFramework用户指南 v1.0。
  • Objective-Chain – Objective-Chain是一个面向对象的响应式框架,作者表示该框架吸收了 ReactiveCocoa 的思想,并且想做得更面向对象一些。

消息相关

消息推送客户端
  • SGPushDemo – 消息推送客户端
  • Orbiter – 消息推送客户端:Push Notification Registration for iOS.
  • PushDemo – 客户端消息接收消息代码,IOS开发之 —- IOS8推送消息注册 , 分分钟搞定IOS远程消息推送。
消息推送服务端
  • javapns源代码 – 消息推送的java服务端代码,注意:DeviceToken中间不能有空格。
  • pushMeBaby – Mac端消息推送端代码,注意:DeviceToken中间要有空格。
通知相关
  • JSQNotificationObserverKit – 一款轻量、易用的通知发送及响应框架类库。作者是知名开源项目 JSQMessagesViewController(Objective-C 版即时聊天)的作者 Jesse Squires.
  • GLPubSub – 一个简短实用的 NSNotificationCenter 的封装。
  • Homeoff – 用swift写了一个模仿Launcher通知中心快捷方式的应用。支持20个应用,并增加了一个返回到桌面来解放Home键的功能。
  • JDStatusBarNotification – 在状态栏顶部显示通知。可以自定义颜色字体以及动画。支持进度显示以及显示状态指示器。

版本新API的Demo

  • appleSample – iOS 苹果官方Demo合集, 官方demo.
  • iOS7-Sampler – 整合了iOS7.0的一些十分有用的特性,比如:Dynamic Behaviors、碰撞检测、语音合成、视图切换、图像滤镜、三维地图、Sprite Kit(动画精灵)、Motion Effect(Parallax)、附近蓝牙或者wifi搜索连接、AirDrop、运动物体追踪(iPhone 5S以上,需要M7处理器)等等。对于日常的应用开发十分实用。
  • iOS8-Sampler – 日本的shuさん制作的 iOS8 参考代码集。01.Audio Effects ;02.New Image Filters;03.Custom Filters;04.Metal Basic;05.Metal Uniform Streaming;06.SceneKit;07.HealthKit;08.TouchID;09.Visual Effects;10.WebKit;11.UIAlertController;12.User Notification;13.Pedometer;14.AVKit;15.Histogram;16.Code Generator;17.New Fonts;18.Popover;19.Accordion Fold Transition
  • iOS-9-Sampler – 通过实例介绍了iOS 9 SDK中重要新特性的使用。
  • MTSwift-Learning – 通过一些简单项目实战演练开始学习 Swift 。
  • iOS8-day-by-day – swift。
  • iOS9-day-by-day – swfit iOS9 Day-by-Day :: Day 2 :: UI Testing。
  • iOS 9 分屏多任务 – iOS 9 分屏多任务:Slide Over & Split View快速入门(中文版)。

代码安全与密码

  • ios-class-guard – 一个用于混淆iOS的类名、方法名以及变量名的开源库–有人反映编译出来的app运行不了。
  • 《Protecting iOS Applications》:文章系统地介绍了如何保护iOS程序的代码安全,防止反汇编分析。
  • fishhook – fishhook是Facebook开源的一个可以hook系统方法的工具。
  • GesturePassword – 一个iOS手势密码功能实现,iPad/iPhone 都可以用,没有使用图片,里面可以通过view自己添加。keychain做的数据持久化,利用苹果官方KeychainItemWrapper类。操作部分都在controller了。删除直接用一下clear。
  • JMPasswordView – 简单实用的手势密码,效果可自行调控。
  • 仿密码锁-九宫格 – 仿密码锁-九宫格,主要是使用UIButton 手势事件 UIBezierPath画图,解锁失败弹出“密码错误”。
  • CoreLock – 本框架是高仿支付宝,并集成了所有功能,并非一个简单的解锁界面展示。个人制作用时1周多,打造解锁终结者框架。
  • LikeAlipayLockCodeView – 高仿支付宝手势解锁(超级版)。
  • PCGestureUnlock – 目前*全面*高仿支付宝的手势解锁,而且提供方法进行参数修改,能解决项目开发中所有手势解锁的开发。
  • ICPayPassWordDemo – CPayPassWordDemo,一个模仿支付宝支付密码输入对话框小demo。
  • RSAESCryptor – 加密 RSA+AES Encryption/Decryption library for iOS. This library uses 2048-bit RSA and 256-bit key with 128-bit block size AES for encryption/decryption。

测试及调试

  • HeapInspector – HeapInspector是一个用于检测应用中的内存泄漏的开源调试工具。
  • Crashlytics – Crashlytics 崩溃报告 崩溃日志 使用说明 。
  • UIViewController-Swizzled – 把你进入的每一个controller的类名打出来,如果看一些特别复杂的项目的时候直接运行demo就可以知道执行次序了。
  • snoop-it – snoop-it比UIViewController-Swizzled好用,代码托管在google上。
  • Versions – 版本比较小工具。
  • MobileWebPageTest – MobileWebPageTest是用来测试移动网页性能的软件,它可以对页面的加载和渲染过程进行截屏,协助开发者分析出页面性能瓶颈。
  • KKLog – 一个日志管理系统。
  • CleanroomLogger – 相当于 CocoaLumberjack 或 Log4j 的 Swift 版本,功能上甚至更强大。另外,源代码中已经内含了完整的 API 文档,使用非常方便。 Buildasaur – 自动测试框架 Buildasaur。MMPlaceHolder – 一行代码显示UIView的位置及相关参数。 使用Quick框架和Nimble来测试ViewControler – Quick是一个用于创建BDD测试的框架。配合Nimbl,可以为你创建更符合预期目标的测试。
  • fastlane – 一套iOS开发和持续集成的命令行工具fastlane,可以用来快速搭建CI甚至自动提交的开发环境。这套工具中包括了上传ipa文件,自动截取多语言截屏,生成推送证书,管理产品证书等一系列实用工具。
  • KIF – 是一个开源的用户界面UI测试框架. 使用 KIF, 并利用 iOS中的辅助功能 API, 你将能够编写模拟用户输入,诸如点击,触摸和文本输入,自动化的UI测试.
  • Quick – 用于Swift中的单元测试(也可用于Objective-C),与Xcode整合在一起。如果你是Objective-C的粉丝,我建议用Specta代替这个,但是对Swift使用者来说,Quick是*佳选择。
  • Sleipnir – Swift的测试框架。
  • kiwi-bdd – TDD或BDD,objective-c语言的测试框架,*流行的BDD测试框架了,Kiwi*受欢迎(根据github上的star数来推断,行为描述和期望写起来也比较易懂,至少我是这么认为的) iOS开发中的测试框架。
  • specta – TDD或BDD,objective-c语言的测试框架,用的人多。
  • cedar – TDD或BDD,objective-c语言的测试框架,用的人少。

AppleWatch

  • Tesla汽车AppleWatch app demo演示 – 通过AppleWatch控制特斯拉汽车,同时可以看到汽车的相关信息,比如剩余电量、可续行里程等,以及解锁/上锁车门、调节司机和乘客的四区域空调温度、开启车辆大灯、定位汽车等。源码推荐说明。
  • WatchKit-Apps – WatchKit 开源小项目示例集锦。是不可多得地学习 WatchKit 的示例式教程(1.如何创建一个简单的交互式计数器;2.如何从手表上控制iOS app;3.如何在WatchKit app和iOS app之间共享数据;4.如何创建一个拥有不同背景色的数字时钟;5.展示不同的UI层;6.如何创建支持滑动手势的应用程序。)。
  • KYVoiceCurve – 类似Apple Watch中语音的声音曲线动画。
  • IGInterfaceDataTable – IGInterfaceDataTable是WKInterfaceTable对象的一个类别,可以让开发者更简单地配置多维数据。该项目使用类似UITableViewDataSource的数据源模式配置Apple Watch表格,而不是将数据结构扁平化成为数组。
  • Apple Watch开发教程资料汇总 – Apple Watch开发教程资料汇总。
  • Stargate – 通过 iPhone 桥接实现 Mac 与 Watch 的即时通讯。Stargate 通过封装两个优秀的基础类库 MMWormhole 和 PeerKit 实现高效的通讯应用。–swift
  • soon – 一款倒计时 WatchKit 示例应用。作者从架构的角度,思考如何设计一款完整、通讯高效且性能又好的 WatchKit 扩展应用。该示例学习性非常强。–swift
  • watchOS-2-Sampler – 基于 watchOS 2 若干新特性,写了相应的示例代码供大家学习、参考。
  • HMWatch – HMWatch是个有待完善的watchOS 2.0 HomeKit 应用示例。
  • CocoaMultipeer – CocoaMultipeer这个开源框架支持OS X, iOS和watchOS设备间的点对点通信,解决watchOS和Mac之间通信的方案还是很有用的。
  • HighstreetWatchApp – 是电商平台Highstreet针对App Watch的一款应用,该demo中加载的是虚拟数据。
  • NKWatchChart – NKWatchChart是一个基于PNChart专门为Apple Watch 开发的图表库,目前支持 line, bar, pie, circle 和 radar 等 图表形式。

*

  • *on – swift的* On 的源码和本地化内容都是开放的: 官方网站。
  • Hydro.network – Hydro.network 的开发旅程, gitcafe。

完整项目

  • v2ex – v2ex 的客户端,新闻、论坛。
  • apps-ios-wikipedia – apps-ios-wikipedia 客户端。
  • jetstream-ios – 一款 Uber 的 MVC 框架。它同时提供了多用户实时通讯支持,一旦启动 JetStream 后端服务,通过 WebSocket 协议可以分分钟建立多用户实时通讯应用。
  • DeckRocket – 在相同 WiFi 网络环境内,通过iPhone 控制并播放 Mac 中的 PDF 文档。
  • ScanBook – 扫扫图书:可以扫描条形码查询图书,也可以关键字搜索,遇到合乎你口味的书,还可以看看别人的读书笔记,不同角度去体会。
  • DesignerNewsApp – Swift 开发的 DesignerNews 客户端,看着美美的!
  • KYWeibo – 调用新浪API自己写的第三方微博客户端。
  • DouQu_IOS – 逗趣IOS手机端(一款笑话软件),拥有完整的功能的手机应用app 。
  • IT江湖iOS客户端 – IT江湖iOS客户端。
  • Eidolon – 艺术品拍卖的投标亭平台,用swift与反应式编程框架 ReactiveCocoa。
  • CrazyPuzzle – 模仿“看图猜成语”App,功能齐全,配有音效,效果很不错。游戏使用cocoa框架完成,没有使用cocos2d的框架。
  • WhoCall – 谁CALL我,iOS来电信息语音提醒,无需越狱。(需要iOS 7.0及以上版本。)骚扰电话预警、来电归属地提醒、联系人姓名播报,这些有中国特色人性化的电话功能,iOS上也应该有。电话提醒、私有API。
  • 仿iOS猎豹垃圾清理(实现原理+源码) – 仿iOS猎豹垃圾清理(实现原理+源码),用到私有API。
  • DSLolita – 模仿新浪微博做的一款app,有发送博文,评论,点赞,私聊功能。
  • GSD_ZHIFUBAO – 支付宝高仿版。
  • Tropos – Tropos, 由 thoughtbot 推出的一款用 Objective-C 写的开源天气类应用, 截至今天, thoughtbot 已在 GitHub 上贡献了 174 个开源项目, 实在令人敬佩。
  • SmileWeather -开源天气类应用,天气图标很完整。
  • MVVMReactiveCocoa – GitBucket 2.0 通过审核啦,她是我在公司实践了一年多 MVVM 和 RAC 的基础上,利用业余时间开发的第三方 GitHub 客户端,旨在能够对想实践 MVVM 和 RAC 的 iOS 开发者有所帮助。AppStore地址,欢迎下载使用GitBucket和收藏MVVMReactiveCocoa。
  • Tomate – 这个圆盘式计时器让你更专注于工作或学习。P.S. App Store 上架收费应用(0.99 欧)。
  • StoveFireiOSMenu – 炉火餐饮系统iPad点餐端。
  • BaiduFM-Swift – 百度FM, swift语言实现,基于*新xcode6.3+swift1.2,初步只是为了实现功能,代码比较粗燥,后面有时间会整理,支持Apple Watch。
  • WNXHuntForCity – iOS高仿城觅项目(开发思路和代码)。
  • ZYChat – 关于聊天界面的可消息类型扩展,响应绑定设计。
  • NiceAppDemo – 仿*美应用-每日*美的钢琴律动效果。
  • meituan – 美团5.7iOS版(高仿),功能包括,团购首页,高德地图搜索附近美食并显示在地图上,上门服务,商家,友盟分享。
  • chuanke – 高仿百度传课iOS版。
  • Tuan – 模仿MJ老师iPad版美团(swift版),偶有bug 见谅。
  • SXNews – 模仿网易新闻做的新闻软件,完成了主导航页,新闻详情页,图片浏览页,评论页。效果不错,比网上流传的各种和网易新闻UI架构有关的代码都要完整,都要好。
  • Monkey – Monkey for GitHub是一个GitHub开发者和仓库排名的开源App。这次主要增加了登录GitHub的功能,随手follow和star,并且增加发现模块,包括GitHub的trending,动态,showcases等。
  • Uther – 跟蠢萌的外星人聊天,还能帮你记事”。itunes下载 。

好的文章

  • 自定义转场动画 – 3 种方法~ 关于自定义转场动画。
  • iOS提高效率的方法和工具 – iOS提高效率的方法和工具。
  • 用 JSON 构建 API 的标准指南 – 用 JSON 构建 API 的标准指南。

Xcode插件

  • iOS开发进阶,从Xcode开始 – 学习使用Xcode构建出色的应用程序!
  • 在Xcode启动的时候,Xcode将会寻找位于~/Library/Application Support/Developer/Shared/Xcode/Plug-ins文件夹中的后缀名为.xcplugin的bundle作为插件进行加载(运行其中的可执行文件)。Xcode5 Plugins 开发简介 写个自己的Xcode4插件
  • Xcode 4 插件制作入门 – Xcode 4 插件制作入门:Xcode所使用的所有库都包含在Xcode.app/Contents/的Frameworks,SharedFrameworks和OtherFrameworks三个文件夹下。其中和Xcode关系*为直接以及*为重要的是Frameworks中的IDEKit和IDEFoundation,以及SharedFrameworks中的DVTKit和DVTFoundation四个。
  • RTImageAssets – 一个 Xcode 插件,用来生成 @3x 的图片资源对应的 @2x 和 @1x 版本。Asset Catalog Creator 功能强大,能自动生成全部尺寸:包括App Icons、Image Sets、Launch Screens Generator。
  • VVDocumenter-Xcode – 一个Xcode插件,build后,随手打开一个你之前的项目,然后在任意一个方法上面连按三下”/”键盘,就ok了。
  • Reveal-Plugin-for-XCode – 一个Reveal插件,可以使工程不作任何修改的情况下使用Reveal,该插件已在Alcatraz上架。Reveal:分析iOS UI的利器 。
  • java2Objective-c – Google公司出得java转Obje-C转换工具,转换逻辑,不转换UI。
  • RegX – 专治代码强迫症的 Xcode 插件,使用 Swift 和 Objective-C 编写。其用竖向对齐特定源代码的元素,使得代码更易读和易理解。说明 ; 菜单:xcode——》Edit-》Regx 。
  • KSImageNamed – 自动完成,特别是如果你正在写Objective-C,如果Xcode能自动完成文件名难道不会很伟大吗?比如图像文件的名称。
  • FuzzyAutocomplete – Xcode的实现自动完成还不完美,此插件能给出你所期望或想要的建议,设置:xcode-》Editor-》FuzzyAutocomplete-》plugin settings。
  • GitDiff – Xcode的代码编辑器的一个微妙的补强,加上了足够的可见信息以了解上次git提交以来发生了什么变化,设置:xcode-》Edit-》GitDiff。
  • XToDo – 这个插件不仅凸显TODO,FIXME,???,以及!!!注释,也在便利列表呈现他们。 菜单:xcode-》view-》snippets; 调出列表显示: xcode-》view-》ToDo List : ctrl + T 。
  • Backlight – 突出显示当前正在编辑的行。菜单:xcode-》view-》Backlight 。
  • CocoaPods – 该CocoaPods的插件增加了一个CocoaPods菜单到Xcode的产品菜单。如果你不喜欢命令行,那么你一定会喜欢这个插件。 用CocoaPods做iOS程序的依赖管理 。
  • Peckham – 添加import语句比较麻烦,此插件 按Command-Control-P,给出的选项列表中选择要的头文件。先要安装Alcatraz ,在终端输入: curl -fsSLhttps://raw.github.com/supermarin/Alcatraz/master/Scripts/install.sh | sh ; 重启xcode-》window-》Package Manager:搜索 Peckham 安装,打开Peckham.xcodeproj,编译 Peckham target,重启Xcode 。
  • Auto-Importer – Auto-Importer是一个自动导入类对应的头文件的Xcode插件。
  • Alcatraz -使用Alcatraz来管理Xcode插件 使用说明 。
  • KSHObjcUML -KSHObjcUML 是一个 Objective-C 类引用关系图的 Xcode 插件。
  • ColorSense-for-Xcode – 颜色插件,安装之后,就不用根据RGB选择颜色,直接从取色板中取颜色,会自动补齐RGB代码。。
  • 10款提高iOS开发效率的XCode插件 – 10款提高iOS开发效率的XCode插件:1. XcodeColors;5. ACCodeSnippetRepository;10. Dash for Xcode。
  • ZLGotoSandboxPlugin – 支持Xcode快捷键了跳转当前应用沙盒了!快捷键是 Shift+Common+w。
  • XcodeSwiftSnippets – XcodeSwiftSnippets, 提供了很多可在 Xcode 上使用的 Swift 代码片段, 通过自动补全的方式*大的提高了开发效率, 另外还有 Objective-C 版的。
  • CoPilot – 通过此插件, Xcode 可以协同编程了(采用 WebSocket 通讯)。如此强大的“黑工具”,不爱它能行吗。
  • ESJsonFormat-Xcode – 将Json格式化输出为模型的属性。
  • SCXcodeMiniMap – Xcode迷你小地图-SCXcodeMiniMap。
  • xTransCodelation – XCODE中英文翻译插件,提供API查询模式和网页模式,都是利用的百度翻译。另外集成了一个可以一键关闭其他所有APP的实用功能,方便开发者!

美工资源

  • TWG_Retina_Icons – 一套支持 Retina 高清屏的 iPhone 免费图标集。
  • ASCIImage – 使用 NSString 创建 image,说明。
  • my-sketch-colors – 配色。
  • Font Awesome – Font Awesome:一套*佳的图标字体库和CSS框架,详细的安装方法请参考官方网站中文网站,GitHub地址 。
  • DynamicColor – 强大的颜色操作扩展类。通过该类,你可以通过扩展方法基于某个颜色得到不同深浅、饱和度、灰度、色相,以及反转后的新颜色。是不可多得的好类库。
  • Chameleon – Chameleon是一个iOS的色彩框架。它运用现代化flat color将UIColor扩展地非常美观。我们还可以通过它运用自定义颜色创建调色板。它还有很多功用,请浏览readme。
  • FontBlaster – 载入定制字体时更简单。

其他资源

  • githuber – *好用的GitHub人才搜索工具。
  • codatlas – 源代码搜索利器。
  • searchcode – 源代码搜索利器:来自悉尼的代码搜索引擎汇聚了 Github, Bitbucket, Sourceforge…等多家开源站点超20万个项目、180亿行源代码,能以特殊字符、语言、仓库和源方式从90多种语言找到函数、API的真实代码。
  • kitematic – Mac 上使用 Docker *简单的方案。

开发资源

开发资料
  • 豆瓣iOS开源库列表 – 豆瓣iOS开源库列表,很多开源项目。
  • iOS-Core-Animation-Advanced-Techniques – 中文版iOS 高级动画技术。
  • iOS开发的一些奇巧淫技1 – TableView不显示没内容的Cell怎么办; 键盘事件:IQKeyboardManager; app不流畅:KMCGeigerCounter; CoreData用起来好烦:MagicalRecord; CollectionView实现悬停的header:CSStickyHeaderFlowLayout。
  • iOS开发的一些奇巧淫技2 – 用一个pan手势来代替UISwipegesture的各个方向、拉伸图片、播放GIF、上拉刷新、把tableview里cell的小对勾的颜色改变、navigationbar弄成透明的而不是带模糊的效果、改变uitextfield placeholder的颜色和位置。
  • cocoapods安装指南 – cocoapods安装指南。
  • RemoteControl – Control your iPhone from inside Xcode for end-to-end testing 。
  • MVVM 介绍 – 替换MVC的开发模式。
  • 第三方接口 – 基本所有第三方接口都在这,再也不用那么麻烦去找了。
  • 提高iOS开发效率的方法和工具 – 提高iOS开发效率的方法和工具。
  • 禅与 Objective-C 编程艺术 – 禅与 Objective-C 编程艺术 (Zen and the Art of the Objective-C Craftsmanship 中文翻译)。
  • Objective-C编码规范:26个方面解决iOS开发问题 – 【Objective-C编码规范:26个方面解决iOS开发问题:“我们制定Objective-C编码规范的原因是我们能够在我们的书,教程和初学者工具包的代码保持优雅和一致。”今天分享的规范来自raywenderlich.com团队成员共同完成的,希望对学习OC的朋友们有所指导和帮助。
swift
  • Swift中文指南 – 中文版Apple官方Swift教程《The Swift Programming Language》,老码版本 历史版本更新说明。
  • The Swift Programming Language 中文版 – The Swift Programming Language 中文版。
  • swifttoolbox – swifttoolbox swift开发的开源库汇总。
  • SwiftGuide – 这份指南汇集了Swift语言主流学习资源,并以开发者的视角整理编排– 非常不错,值得推荐。
  • Swift开源项目精选 – Swift开源项目精选–推荐,每周都有更新。
  • Awesome Swift – 一个收集了很多 Swift 开发资源的网站。
  • Developing_iOS_8_Apps_With_Swift – Developing iOS 8 Apps with Swift 字幕简体中文翻译项目(斯坦福白胡子老头swift教学视频)。
  • Swift-On-iOS – JohnLui 的 Swift On iOS 代码仓库。
他人开源总结
  • code4app – *多国人用的代码库。
  • cocoachina – 国内*热门的iOS社区的代码库。
  • awesome-ios – 一个老外整理的,中文版。
  • awesome-ios-ui – 收集了不少 iOS UI/UX 库, 包含了很多酷炫的动画效果。
  • ios-cosmos – The iOS Cosmos:收录了IOS*大部分的开源框架和工具。
  • Awesome Haskell资料大全 – Awesome Haskell 资料大全:框架,库和软件。
  • Cosmos – The iOS Cosmos:收录了IOS*大部分的开源框架和工具。
  • cocoacontrols – 收集了很多UI控件效果代码,缺点是需要*,而且代码分类不够好。
  • lexrus – lexrus国内出名的iOS开源coder,非常库的label动画、textfield动画。
  • open-source-ios-apps – iOS App集合,分:swift与Objective-C–国外人整理。
  • 适合iOS开发者的15大网站推荐 – 适合 iOS 开发者的 15 大网站推荐 — 英文网站。
  • Objective-C GitHub 排名前 100 项目简介 – 主要对当前 GitHub 排名前 100 的项目做一个简单的简介, 方便初学者快速了解到当前 Objective-C 在 GitHub 的情况。
  • Github-iOS备忘 -整理了比较常用的iOS第三方组件,以及github上的统计。
中文开发博客列表
  • 唐巧整理 – 猿题库唐巧整理。
博客地址 RSS地址
南峰子的技术博客 南峰子的技术博客。
唐巧的技术博客 http://blog.devtang.com/atom.xml
OneV’s Den http://onevcat.com/atom.xml
破船之家 http://beyondvincent.com/atom.xml
NSHipster http://nshipster.cn/feed.xml
Limboy 无网不剩 http://feeds.feedburner.com/lzyy
Lex iOS notes http://ios.lextang.com/rss
念茜的博客 http://nianxi.net/feed.xml
Xcode Dev http://blog.xcodev.com/atom.xml
Ted’s Homepage http://wufawei.com/feed
txx’s blog http://blog.t-xx.me/atom.xml
KEVIN BLOG http://imkevin.me/rss
阿毛的蛋疼地 http://www.xiangwangfeng.com/atom.xml
亚庆的 Blog http://billwang1990.github.io/atom.xml
Nonomori http://nonomori.farbox.com/feed
言无不尽 http://tang3w.com/atom.xml
Wonderffee’s Blog http://wonderffee.github.io/atom.xml
I’m TualatriX http://imtx.me/feed/latest/
vclwei http://vclwei.com/posts.rss
Cocoabit http://blog.cocoabit.com/atom.xml
nixzhu on scriptogr.am http://nixzhu.me/feed
不会开机的男孩 http://studentdeng.github.io/atom.xml
Nico http://www.taofengping.com/rss.xml
阿峰的技术窝窝 http://hufeng825.github.io/atom.xml
answer_huang http://answerhuang.duapp.com/index.php/feed/
webfrogs http://webfrogs.me/feed/
代码手工艺人 http://joeyio.com/atom.xml
Lancy’s Blog http://gracelancy.com/atom.xml
I’m Allen http://www.imallen.com/atom.xml
Travis’ Blog http://imi.im/feed
王中周的技术博客 http://wangzz.github.io/atom.xml
会写代码的猪 http://gaosboy.com/feed/atom/
克伟的博客 http://feed.cnblogs.com/blog/u/23857/rss
摇滚诗人 http://feed.cnblogs.com/blog/u/35410/rss
Luke’s Homepage http://geeklu.com/feed/
萧宸宇 http://iiiyu.com/atom.xml
Yuan博客 http://www.heyuan110.com/?feed=rss2
Shining IO http://shiningio.com/atom.xml
YIFEIYANG–易飞扬的博客 http://www.yifeiyang.net/feed
KooFrank’s Blog http://koofrank.com/rss
hello it works http://helloitworks.com/feed
码农人生 http://msching.github.io/atom.xml
玉令天下的Blog http://yulingtianxia.com/atom.xml
不掏蜂窝的熊 http://www.hotobear.com/?feed=rss2
猫·仁波切 https://andelf.github.io/atom.xml
煲仔饭 http://ivoryxiong.org/feed.xml
里脊串的开发随笔 http://adad184.com/atom.xml

物联网

awesome-iot – 这份物联网学习参考大全太给力。从物联网协议、嵌入式系统、相关开源库、相关书籍、博客、学习笔记、标准应有尽有。

IOS-NSBundle

一般我们从bundle中获取一张图片,可以有这样的获取思路:

1)获取主bundle
2)获取自定义bundle
3)获取自定义bundle中的资源
//主bundle,也就是可执行的工程的bundle
NSBundle *mainBundle = [NSBundle mainBundle];
//NSBundle *mainBundle = [NSBundle bundleForClass:[self class]];
//放在主工程中的自定义bundle
NSString *myBundlePath = [mainBundle pathForResource:@”MyBundle” ofType:@”bundle”];
NSBundle *myBundle = [NSBundle bundleWithPath:myBundlePath];
//放在自定义bundle中的图片
NSString *imagePath = [myBundle pathForResource:@”123″ ofType:@”png”];
self.image = [UIImage imageWithContentsOfFile:imagePath];

NSString *path = [[NSBundle mainBundle] pathForResource:@”WT2LiveBunble” ofType:@”bundle”];//获取自定义bundle的path

NSBundle *myBundle = [NSBundle path];//获取自定义bundle

NSString *zhPath = [myBundle pathForResource:@”en” ofType:@”lproj”];//获取自定义bundle下的文件path

zhPath = [path stringByAppendingString:@”/en.lproj”];//或者拼接//获取自定义bundle下的文件path

iOS NSDecimalNumber精确数值计算以及小数点后精确保留2位数字

遇到的问题,从服务器拿的数据NSString类型的,然后转化成CGFloat类型的,数据的值就不准确了,没办法,就找了下资料,找到了苹果有专门的API,针对金融货币单位,希望可以解决有遇到同样问题的人.

NSDecimalNumberHandler *roundUp = [NSDecimalNumberHandler

decimalNumberHandlerWithRoundingMode:NSRoundBankers

scale:2

raiseOnExactness:NO

raiseOnOverflow:NO

raiseOnUnderflow:NO

raiseOnDivideByZero:YES];

枚举

NSRoundPlain, // Round up on a tie //貌似取整

NSRoundDown, // Always down == truncate //只舍不入

NSRoundUp, // Always up // 只入不舍

NSRoundBankers // on a tie round so last digit is even 貌似四舍五入

//90.7049+0.22 然后四舍五入

NSDecimalNumber *subtotal = [NSDecimalNumberdecimalNumberWithString:@”90.7049″];

NSDecimalNumber *discount = [NSDecimalNumberdecimalNumberWithString:@”0.22″];

NSDecimalNumber *total = [subtotal decimalNumberByAdding:discount withBehavior:roundUp];

NSLog(@”Rounded total: %@”, total);

NSDecimalNumber*price1 = [NSDecimalNumberdecimalNumberWithString:@”15.99″];

NSDecimalNumber*price2 = [NSDecimalNumberdecimalNumberWithString:@”29.99″];

NSDecimalNumber*coupon = [NSDecimalNumberdecimalNumberWithString:@”5.00″];

NSDecimalNumber*discount = [NSDecimalNumberdecimalNumberWithString:@”.90″];

NSDecimalNumber*numProducts = [NSDecimalNumberdecimalNumberWithString:@”2.0″];

NSDecimalNumber *subtotal = [price1 decimalNumberByAdding:price2];

NSDecimalNumber *afterCoupon = [subtotal decimalNumberBySubtracting:coupon];

NSDecimalNumber *afterDiscount = [afterCoupon decimalNumberByMultiplyingBy:discount];

NSDecimalNumber *average = [afterDiscount decimalNumberByDividingBy:numProducts];

NSDecimalNumber*averageSquared = [average decimalNumberByRaisingToPower:2];

的NSLog(@“小计:%@”,加);/ / 45.98

的NSLog(@“优惠券后:%@”,减);/ / 40.98

的NSLog((@“折后:%@”),乘);/ / 36.882

的NSLog(@“每股平均价产品:%@”,平均);/ / 18.441

的NSLog(@“平均价的平方:%@”,averageSquared);/ / 340.070481

//保留小数点后两位

NSDecimalNumberHandler*roundUp = [NSDecimalNumberHandler

decimalNumberHandlerWithRoundingMode:NSRoundUp

scale:2

raiseOnExactness:NO

raiseOnOverflow:NO

raiseOnUnderflow:NO

raiseOnDivideByZero:YES];

//9折后 36.882 有余进位结果 36.89

NSDecimalNumber*subtotal = [NSDecimalNumberdecimalNumberWithString:@”40.98″];

NSDecimalNumber*discount = [NSDecimalNumberdecimalNumberWithString:@”.90″];

NSDecimalNumber*total = [subtotal decimalNumberByMultiplyingBy:discount

withBehavior:roundUp];

NSLog(@”Rounded total: %@”, total);

//比较大小

NSDecimalNumber*discount1 = [NSDecimalNumberdecimalNumberWithString:@”.85″];

NSDecimalNumber*discount2 = [NSDecimalNumberdecimalNumberWithString:@”.9″];

NSComparisonResult result = [discount1 compare:discount2];

if (result ==NSOrderedAscending) {

NSLog(@”85%% < 90%%小于”);

} else if (result == NSOrderedSame) {

NSLog(@”85%% == 90%%等于”);

} elseif (result ==NSOrderedDescending) {

NSLog(@”85%% > 90%%大于”);

}

-(NSString *)notRounding:(NSString*)price afterPoint:(NSInteger)position

{

NSDecimalNumberHandler* roundingBehavior = [NSDecimalNumberHandlerdecimalNumberHandlerWithRoundingMode:NSRoundDownscale:position raiseOnExactness:NOraiseOnOverflow:NOraiseOnUnderflow:NOraiseOnDivideByZero:YES];

NSDecimalNumber *ouncesDecimal;

NSDecimalNumber *roundedOunces;

// ouncesDecimal = [[NSDecimalNumber alloc] initWithFloat:price];

ouncesDecimal = [[NSDecimalNumberalloc]initWithString:price];

roundedOunces = [ouncesDecimal decimalNumberByRoundingAccordingToBehavior:roundingBehavior];

// return roundedOunces;// 整数的不带小数点

NSString* string = [NSStringstringWithFormat:@”%@”,roundedOunces];

if ([stringrangeOfString:@”.”].length==0) {

string= [string stringByAppendingString:@”.00″];

}else{

NSRange range = [stringrangeOfString:@”.”];

if (string.length-range.location-1==2) {

}else{

string= [string stringByAppendingString:@”0″];

}

}

return string;//整数.00格式

}

MVC,MVP 和 MVVM 的图示

复杂的软件必须有清晰合理的架构,否则无法开发和维护。

MVC(Model-View-Controller)是*常见的软件架构之一,业界有着广泛应用。它本身很容易理解,但是要讲清楚,它与衍生的 MVP 和 MVVM 架构的区别就不容易了。

读了《Scaling Isomorphic Javascript Code》后,突然意识到,它们的区别非常简单。我用几段话,就可以说清。

%title插图%num

一、MVC

MVC模式的意思是,软件可以分成三个部分。

%title插图%num

  • 视图(View):用户界面。
  • 控制器(Controller):业务逻辑
  • 模型(Model):数据保存

各部分之间的通信方式如下。

%title插图%num

  1. View 传送指令到 Controller
  2. Controller 完成业务逻辑后,要求 Model 改变状态
  3. Model 将新的数据发送到 View,用户得到反馈

所有通信都是单向的。

二、互动模式

接受用户指令时,MVC 可以分成两种方式。一种是通过 View 接受指令,传递给 Controller。

%title插图%num

另一种是直接通过controller接受指令。

%title插图%num

三、实例:Backbone

实际项目往往采用更灵活的方式,以 Backbone.js 为例。

%title插图%num

1. 用户可以向 View 发送指令(DOM 事件),再由 View 直接要求 Model 改变状态。

2. 用户也可以直接向 Controller 发送指令(改变 URL 触发 hashChange 事件),再由 Controller 发送给 View。

3. Controller 非常薄,只起到路由的作用,而 View 非常厚,业务逻辑都部署在 View。所以,Backbone 索性取消了 Controller,只保留一个 Router(路由器) 。

四、MVP

MVP 模式将 Controller 改名为 Presenter,同时改变了通信方向。

%title插图%num

1. 各部分之间的通信,都是双向的。

2. View 与 Model 不发生联系,都通过 Presenter 传递。

3. View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。

五、MVVM

MVVM 模式将 Presenter 改名为 ViewModel,基本上与 MVP 模式完全一致。

%title插图%num

唯一的区别是,它采用双向绑定(data-binding):View的变动,自动反映在 ViewModel,反之亦然。Angular 和 Ember 都采用这种模式。

IOS -UISearchController UISearchBar

前言
UISearchController是个坑啊,苹果为了,让开发者快速构架一块app,简化开发,私下添加太多东西,搞迷糊了。但是实际开发过程中,给的都需要重新去自定义,所以出现了很多莫名其妙的问题,究竟是不好呢,还是不好呢^_^
用UISearchController主要是为了hidesNavigationBarDuringPresentation这个属性后传来的动画效果,如果不用这个的话,我倒是很愿意直接用UISearchBar了

代码部分
实现<UISearchControllerDelegate,UISearchResultsUpdating>
定义@property (nonatomic,strong) UISearchController *searchController;

//创建UISearchController
self.searchController = [[UISearchController alloc]initWithSearchResultsController:nil];
//设置代理
self.searchController.delegate= self;
self.searchController.searchResultsUpdater = self;
//包着搜索框外层的颜色
// self.searchController.searchBar.barTintColor = [UIColor lig];
// self.searchController.searchBar.tintColor = [UIColor orangeColor];
//提醒字眼
self.searchController.searchBar.placeholder= @”搜索”;
//提前在搜索框内加入搜索词
self.searchController.searchBar.text = @””;
//设置UISearchController的显示属性,以下3个属性默认为YES
//搜索时,背景变暗色
self.searchController.dimsBackgroundDuringPresentation = NO;
//搜索时,背景变模糊
// self.searchController.obscuresBackgroundDuringPresentation = YES;

//点击搜索的时候,是否隐藏导航栏
self.searchController.hidesNavigationBarDuringPresentation = YES;
//位置
[_searchController.searchBar sizeToFit];
self.tableView.tableHeaderView = self.searchController.searchBar;

searchBar样式
// searchbar 样式
//设置背景图是为了去掉上下黑线
self.searchController.searchBar.backgroundImage =[UIImage imageWithColor:kWhiteColor size:CGSizeMake(kMinScreenWidth, 44)];
// 设置SearchBar的颜色主题为白色
self.searchController.searchBar.barTintColor = [UIColor whiteColor];
self.searchController.searchBar.delegate = self;

UITextField *searchField = [self.searchController.searchBar valueForKey:@”searchField”];
if (searchField) {
[searchField setBackgroundColor:kColorWithHex(@”f8f8f8″)];
searchField.layer.cornerRadius = 14.0f;
// searchField.layer.borderColor = [UIColor colorWithRed:247/255.0 green:75/255.0 blue:31/255.0 alpha:1].CGColor;
// searchField.layer.borderWidth = 1;
searchField.layer.masksToBounds = YES;
}

空搜索
//空搜索
UITextField *searchBarTextField = nil;
NSArray *views = ([[[UIDevice currentDevice] systemVersion] floatValue] < 7.0) ? self.searchController.searchBar.subviews : [[self.searchController.searchBar.subviews objectAtIndex:0] subviews];
for (UIView *subview in views)
{
if ([subview isKindOfClass:[UITextField class]])
{
searchBarTextField = (UITextField *)subview;
break;
}
}
searchBarTextField.enablesReturnKeyAutomatically = NO;
searchBarTextField.returnKeyType = UIReturnKeyDone;

重点
searchController输入状态的时候,searchbar会跑到状态栏后边
self.definesPresentationContext=YES;

2.如果把searchBar当做tableView的headerVIew的使用,在方法- (void)willPresentSearchController:(UISearchController *)searchController tableView已经reloadData了tableView.frame.y需要向下移动20个单位

CGRect tableFrame = self.tableView.frame;
tableFrame.origin.y = 20;
tableFrame.size.height = self.view.frame.size.height -20;
self.tableView.frame = tableFrame;
[UIView animateWithDuration:0.4 animations:^{
[self.view layoutIfNeeded];
[self.tableView layoutIfNeeded];
}];

3.如果还没有需要向上移动20个单位,然后再- (void)willDismissSearchController:(UISearchController *)searchController 让tableVIew会到原始位置

4.如果进入预编辑状态,searchBar消失(UISearchController套到TabBarController可能会出现这个情况),请添加下边这句话

– (void)didPresentSearchController:(UISearchController *)searchController
{

[self.view addSubview:self.searchController.searchBar];

}

5.如果UISearchController进入编辑状态后,导航栏遮挡住20加上

-(void)viewDidLayoutSubviews {

if(self.searchController.active) {
self.searchController.searchBar.frame = CGRectMake(self.searchController.searchBar.frame.origin.x, 20, self.searchController.searchBar.frame.size.width, 44.0);
[UIView animateWithDuration:0.1 animations:^{
[self.view layoutIfNeeded];
[self.searchController.searchBar layoutIfNeeded];
}];
}

}

去掉编辑状态下方的黑线
UISearchBar *searchBar = self.searchController.searchBar;
UIImageView *barImageView = [[[searchBar.subviews firstObject] subviews] firstObject];
barImageView.layer.borderColor = kWhiteColor.CGColor;
barImageView.layer.borderWidth = 1;

优化动态弹出效果
self.navigationController.navigationBar.translucent = YES;

后记
不需要设置这些东西了

// self.definesPresentationContext=YES;
// self.edgesForExtendedLayout = UIRectEdgeNone;
// self.automaticallyAdjustsScrollViewInsets = NO;

框架模式 MVC 在Android中的使用

在学习Android开发2年的历史中,基本掌握了Android的基础知识。越到后面的学习越感觉困难,一来是自认为android没啥可学的了(自认为的,其实还有很多知识科学),二来网络上的很多框架已经帮我们做了太多的事情了,我们只需要画画UI就可以了,感觉Android开发没有太多的技术含金量。*近闲来无事,开始总结之前学过的知识点,想着是否应该学点其他的东西呢?总不能局限于Android基础知识吧。慢慢的探索发现在大的项目工程中,一个好的框架,好的设计模式,能减少很大的工作量。因此接下来两篇博客来学习一下Android中常用的两种框架设计模式 MVC和MVP。

MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,不需要重新编写业务逻辑。其中M层处理数据,业务逻辑等;V层处理界面的显示结果;C层起到桥梁的作用,来控制V层和M层通信以此来达到分离视图显示和业务逻辑层。说了这么多,听着感觉很抽象,废话不多说,我们来看看MVC在Android开发中是怎么应用的吧!

 

MVC for Android

在Android开发中,比较流行的开发框架模式采用的是MVC框架模式,采用MVC模式的好处是便于UI界面部分的显示和业务逻辑,数据处理分开。那么Android项目中哪些代码来充当M,V,C角色呢?

M层:适合做一些业务逻辑处理,比如数据库存取操作,网络操作,复杂的算法,耗时的任务等都在model层处理。 V层:应用层中处理数据显示的部分,XML布局可以视为V层,显示Model层的数据结果。 C层:在Android中,Activity处理用户交互问题,因此可以认为Activity是控制器,Activity读取V视图层的数据(eg.读取当前EditText控件的数据),控制用户输入(eg.EditText控件数据的输入),并向Model发送数据请求(eg.发起网络请求等)。

接下来我们通过一个获取天气预报数据的小项目来解读 MVC for Android。先上一个界面图:

加载中...

Controller控制器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
package com.***.androidmvcdemo.controller;
import android.app.Dialog;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
import com.***.androidmvcdemo.R;
import com.***.androidmvcdemo.entity.Weather;
import com.***.androidmvcdemo.entity.WeatherInfo;
import com.***.androidmvcdemo.model.OnWeatherListener;
import com.***.androidmvcdemo.model.WeatherModel;
import com.***.androidmvcdemo.model.WeatherModelImpl;
public class MainActivity extends ActionBarActivity implements OnWeatherListener, View.OnClickListener {
    private WeatherModel weatherModel;
    private Dialog loadingDialog;
    private EditText cityNOInput;
    private TextView city;
    private TextView cityNO;
    private TextView temp;
    private TextView wd;
    private TextView ws;
    private TextView sd;
    private TextView wse;
    private TextView time;
    private TextView njd;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        weatherModel = new WeatherModelImpl();
        initView();
    }
    /**
     * 初始化View
     */
    private void initView() {
        cityNOInput = findView(R.id.et_city_no);
        city = findView(R.id.tv_city);
        cityNO = findView(R.id.tv_city_no);
        temp = findView(R.id.tv_temp);
        wd = findView(R.id.tv_WD);
        ws = findView(R.id.tv_WS);
        sd = findView(R.id.tv_SD);
        wse = findView(R.id.tv_WSE);
        time = findView(R.id.tv_time);
        njd = findView(R.id.tv_njd);
        findView(R.id.btn_go).setOnClickListener(this);
        loadingDialog = new ProgressDialog(this);
        loadingDialog.setTitle(加载天气中...);
    }
    /**
     * 显示结果
     *
     * @param weather
     */
    public void displayResult(Weather weather) {
        WeatherInfo weatherInfo = weather.getWeatherinfo();
        city.setText(weatherInfo.getCity());
        cityNO.setText(weatherInfo.getCityid());
        temp.setText(weatherInfo.getTemp());
        wd.setText(weatherInfo.getWD());
        ws.setText(weatherInfo.getWS());
        sd.setText(weatherInfo.getSD());
        wse.setText(weatherInfo.getWSE());
        time.setText(weatherInfo.getTime());
        njd.setText(weatherInfo.getNjd());
    }
    /**
     * 隐藏进度对话框
     */
    public void hideLoadingDialog() {
        loadingDialog.dismiss();
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.btn_go:
                loadingDialog.show();
                weatherModel.getWeather(cityNOInput.getText().toString().trim(), this);
                break;
        }
    }
    @Override
    public void onSuccess(Weather weather) {
        hideLoadingDialog();
        displayResult(weather);
    }
    @Override
    public void onError() {
        hideLoadingDialog();
        Toast.makeText(this, 获取天气信息失败, Toast.LENGTH_SHORT).show();
    }
    private  T findView(int id) {
        return (T) findViewById(id);
    }
}

从上面代码可以看到,Activity持有了WeatherModel模型的对象,当用户有点击Button交互的时候,Activity作为Controller控制层读取View视图层EditTextView的数据,然后向Model模型发起数据请求,也就是调用WeatherModel对象的方法 getWeathre()方法。当Model模型处理数据结束后,通过接口OnWeatherListener通知View视图层数据处理完毕,View视图层该更新界面UI了。然后View视图层调用displayResult()方法更新UI。至此,整个MVC框架流程就在Activity中体现出来了。

Model模型

来看看WeatherModelImpl代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package com.***.androidmvcdemo.model;
/**
 * Description:请求网络数据接口
 * User: ***
 * Date: 2015/6/3
 * Time: 15:40
 */
public interface WeatherModel {
    void getWeather(String cityNumber, OnWeatherListener listener);
}
................
package com.***.androidmvcdemo.model;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.***.androidmvcdemo.entity.Weather;
import com.***.androidmvcdemo.volley.VolleyRequest;
/**
 * Description:从网络获取天气信息接口实现
 * User: ***
 * Date: 2015/6/3
 * Time: 15:40
 */
public class WeatherModelImpl implements WeatherModel {
    @Override
    public void getWeather(String cityNumber, final OnWeatherListener listener) {
        /*数据层操作*/
        VolleyRequest.newInstance().newGsonRequest(http://www.weather.com.cn/data/sk/ + cityNumber + .html,
                Weather.class, new Response.Listener() {
                    @Override
                    public void onResponse(Weather weather) {
                        if (weather != null) {
                            listener.onSuccess(weather);
                        } else {
                            listener.onError();
                        }
                    }
                }, new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        listener.onError();
                    }
                });
    }
}

以上代码看出,这里设计了一个WeatherModel模型接口,然后实现了接口WeatherModelImpl类。controller控制器activity调用WeatherModelImpl类中的方法发起网络请求,然后通过实现OnWeatherListener接口来获得网络请求的结果通知View视图层更新UI 。至此,Activity就将View视图显示和Model模型数据处理隔离开了。activity担当contronller完成了model和view之间的协调作用。

至于这里为什么不直接设计成类里面的一个getWeather()方法直接请求网络数据?你考虑下这种情况:现在代码中的网络请求是使用Volley框架来实现的,如果哪天老板非要你使用Afinal框架实现网络请求,你怎么解决问题?难道是修改 getWeather()方法的实现? no no no,这样修改不仅破坏了以前的代码,而且还不利于维护, 考虑到以后代码的扩展和维护性,我们选择设计接口的方式来解决着一个问题,我们实现另外一个WeatherModelWithAfinalImpl类,继承自WeatherModel,重写里面的方法,这样不仅保留了以前的WeatherModelImpl类请求网络方式,还增加了WeatherModelWithAfinalImpl类的请求方式。Activity调用代码无需要任何修改。

MVC使用总结

利用MVC设计模式,使得这个天气预报小项目有了很好的可扩展和维护性,当需要改变UI显示的时候,无需修改Contronller(控制器)Activity的代码和Model(模型)WeatherModel模型中的业务逻辑代码,很好的将业务逻辑和界面显示分离。

在Android项目中,业务逻辑,数据处理等担任了Model(模型)角色,XML界面显示等担任了View(视图)角色,Activity担任了Contronller(控制器)角色。contronller(控制器)是一个中间桥梁的作用,通过接口通信来协同 View(视图)和Model(模型)工作,起到了两者之间的通信作用。

什么时候适合使用MVC设计模式?当然一个小的项目且无需频繁修改需求就不用MVC框架来设计了,那样反而觉得代码过度设计,代码臃肿。一般在大的项目中,且业务逻辑处理复杂,页面显示比较多,需要模块化设计的项目使用MVC就有足够的优势了。

4.在MVC模式中我们发现,其实控制器Activity主要是起到解耦作用,将View视图和Model模型分离,虽然Activity起到交互作用,但是找Activity中有很多关于视图UI的显示代码,因此View视图和Activity控制器并不是完全分离的,也就是说一部分View视图和Contronller控制器Activity是绑定在一个类中的。

MVC的优点:

(1)耦合性低。所谓耦合性就是模块代码之间的关联程度。利用MVC框架使得View(视图)层和Model(模型)层可以很好的分离,这样就达到了解耦的目的,所以耦合性低,减少模块代码之间的相互影响。

(2)可扩展性好。由于耦合性低,添加需求,扩展代码就可以减少修改之前的代码,降低bug的出现率。

(3)模块职责划分明确。主要划分层M,V,C三个模块,利于代码的维护。

IOS-马甲包 混淆 注意事项

1. ipa包特征:

工程配置(KLGenerateSpamCode)
修改工程名
修改文件夹以及类名前缀
代码类:(ChaosTool)
已有代码的混淆(改类名、改函数名,以及函数顺序)
审核时tab页面需要较大变化,做开关
手动添加或者删除代码中的注释和空行
生成多余.h.m文件以及文件夹
生成多余的变量/函数/属性以及实现
资源类:(ImageOptim)
logo 启动图,主色调
图片资源,轻量压缩改变图片文件hash值,修改.xcassets图片文件名
适当添加一些无用的资源
2. 开发者帐号:

使用不同的开发者账号,测试设备要分开,不能登陆本地xcodeAccounts账户

3. 打包:

打包关系不大,上传的环境要求不同的机器,以及账户所在地的网络
不同马甲包不要关联同一个开发者账号信息
4. 上传IP:

所在地的网络(*)
5. 材料相似:

itu后台材料如宣传图,ICON,版权人等,分类,宣传文本,描述文本,关键词等

友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速