热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

three20介绍three新品

本文主要介绍关于uinavigationcontroller,iphone,facebook,library,xcode,objectivec的知识点,对【three20介绍】和【three新品】有

本文主要介绍关于uinavigationcontroller,iphone,facebook,library,xcode,objective c的知识点,对【three20介绍】和【three新品】有兴趣的朋友可以看下由【jiyongfeng】投稿的技术文章,希望该技术和经验能帮到你解决你所遇的【three20】相关技术问题。

three新品

国外一些网路媒体如?Tech Crunch、还有 John Gruber 的网站等,前两天报导,Joe Hewitt (Facebook 的 iPhone 应用程式的作者)说,他个人打算中止 Facebook 的 iPhone 应用程式开发,转往进行其他的 Facebook 的计画,原因是他对于苹果的 App Store 上架审核机制非常不满。

刚看到这则新闻的时候,还搞不清楚是怎么一回事,第一个想法是-别人对上架审核不满也就罢了,Facebook 有什么好不满的?其他人将软体送进去之后快则到七天之后才能够等到审核结果,就 App Store 开张以来,唯一看到能够一个星期推出两个新版本的软体,也就只有一个,而这个软体还不是别的,就是 Facebook。

昨天上班一打开电脑,才终于搞清楚发生在 Joe Hewitt 身上是什么状况。打开收信程式,看到苹果送来的退件信件,说,我们写的程式不能够在 App Store 上架,原因是程式里头呼叫了 iPhone 的 private API;而我从来就不记得我什么时候用到过这些东西,查了一下,呼叫 private?API?的,不是自己的程式,而是因为程式用到了一个 external library,这个 library 呼叫了,而这个 library 就是 Joe Hewitt 所撰写的?Three20。

?

Three20 Library

Three20 大概是目前最有名的第三方 iPhone 的 UI library,因为 iPhone 的萤幕大小是 320×480 pixel,所以取了这么一个名字。Three20 计画是 Facebook 的 iPhone 应用程式的延伸产物,他们把 Facebook 的 iPhone 程式在架构上拆成了两块,一块处理如何登入、读取 server 资料的网路?API?,另外一部分就是如何在 iPhone 上做 user interface 的呈现,而这部份 Facebook 将程式码开放出来让其他人都能使用,之前是放在 Joe Hewitt 的个人名下(以及 github 的个人帐号下),前两天转到了 Facebook 的帐号下。

Three20 这个 library 里头,个人觉得厉害的有几个地方:

一、自己做了一套在 iPhone 上的 Rich Text 的文字排版引擎:

在 iPhone SDK 原本所提供的 UI 元件中,想要在画面上放一段文字的话,每个 UILabel 元件一次只能够使用一种字体、一种颜色、一种大小,如果想要比较複杂的排版,就必须使用浏览器元件 UIWebView。

这样要做一个介面老实说顶痛苦的-当你在做一个输入资料的介面,在一堆文字输入框以及按钮当中,想要有一段排版比较複杂的说明文字时,你不太可能就这样在画面中挖一块,放个浏览器元件进去;而且 UIWebView 本身也不太能够作为 iPhone 应用程式的主要介面元件,在 Mac OS X 上你还可以透过比较多的 delegate method 以及 Javascript-Objective C bridging,让 Web view 里头发生的事件传回你的 controller class 里头,在 iPhone 上也没有这方面的 API。

Three20 自己做了一套排版引擎,语法是 HTML,只要你把想要填入的内容加上?HTML?tag,就可以直接在 UILabel 上呈现排版效果;同时你也可以使用像是?CSS?的样式指令,虽然每个样式都还是一个 Objective C selector,但是可以很方便的就加上了字体、颜色、背景、缩排…等原本很难做的排版。这部份放在 TTStyle 部分的程式中。

二、提供大量现成而且简化过的 UI 元件

如果你想要做一个像 iPhone 内建的相簿程式那样的介面,想要有可以全萤幕浏览图片,用手指滑一下就跳到下一张,然后可以回到缩图浏览模式…这些功能,Three20 已经有现成的元件,你的图片资料可以放在本机、也可以放在网路上,只要提供一个内容是?URL?的 Array 就好了,Three20 会自己帮你处理图片下载与 cache 等工作。

另外像是 Table View,原本你写一个 UITableViewController subclass 可能要实作五六个 data source 与 delegate method,他也帮你处理掉很多工作,有时候就只需要一个 method、準备一个 Array 就够了,也帮你处理什么想在表格里头放置在网路上的图片这类的工作。

里头有一些 UI 元件我会拿来用(正所谓人活着好好的干嘛重新发明轮子),不过我自己是比较不赞同把抓取网路资料的行为、跟 iPhone 的 UI code 混在一起,因为这样会将网路资料交换的程式散乱在很多地方,很容易搞乱架构,而且会变得不容易测试。

三、URL Based Navigation

Three20 是一个在想法上非常 Web 导向的 library,像是前一点自己弄一个?HTML?引擎,或是觉得网路上的图片应该直接在 UI code 部分处理,不过,这种 Web 思考的导向,还是在?URL?Based Navigation 最明显。

iPhone 的 UI 设计的一大特色,就是相较其他平台,应用程式有很清楚的导览路径-如果你眼前的画面的左上方有一个向左的箭头,就代表可以回到目前浏览路径的上一层,然后点到表格中的某个项目或某个其他元件,就会从右方跑出一个新的画面,透过动画效果把原本的画面挤到左方,告诉你进入了下一层。在 Palm Pre 系统没有视觉元件告诉你现在你在哪一层,唯一的一个实体按钮则有时是回到上一层、有时拿来当做切换应用程式,Android 有实体的 Back 与 Menu 按钮,但往往让人看不出来什么时候可以回上一层、什么时候有 Menu 可以用。

iPhone SDK 提供 UINavigationController 这个 class,处理这种一层一层浏览行为,要进入下一层,就是产生一个新的 UIViewController subclass,呼叫 UINavigationController 的 -pushViewController:animated:。而这个过程有一个麻烦的地方-这些物件在跳出应用程式后就消失了,那,我在跳出应用程式,再重新进入应用程式后,我要怎么记得上次浏览到什么地方?我要怎么可以恢复最后一次使用的浏览状态?

Three20 就在 UINavigationController 的基础上,架了一层用?URL?处理事情的想法:虽然我们现在在做一套 iPhone 应用程式,但是却用 Web App 的想法设计-每一个 iPhone 的画面,都想像成是一个 Web App 的 URL,每个 UIController 在初始化时需要的参数,都像是我们对一个 Web App 的?URL?传入的 Get 参数一样。

如果你有一个通讯录程式,首页是通讯录群组列表,点下去是群组中的人名列表,人名点上去可以看通讯资料内容,再点下去可以编辑,可能就会像这样:

通讯群组列表(主画面) addressbook://root
显示某一个群组 addressbook://group/1
显示某一个人的资料 addressbook://person/1
编辑某一个人的资料 addressbook://person/edit/1

而当 UINavigationController 在推入这些 view controller 的时候,就同时把对应到这些 view controller 的 URL,像是浏览器历史纪录一样的记下来,下一次进入程式时,就可以按照最后一次记下的路径,逐一重新产生 view controller,呈现最后一次使用的状态。

目前在 github 上,Three20 是?Objective-C 语言类中,在使用者追蹤开发进度排行榜、以及分支数量的排行榜上,都是累计第一名。github 的 clone 数报表目前故障,没办法知道有多少人 checkout Three20 拿来用的纪录,但是有两百多个分支,至少代表有两百多个人还需要客製化 Three20,在这边先不讲求什么精确的数字,总之在使用 Three20 的开发者有一大堆,而 Three20 的用途就是放在 iPhone 应用程式里头,所以,有用到 Three20 的应用程式,一大堆。

于是 Apple 开始 reject 用到 Three20 的程式之后,这两天你又是可以看到、有人在?Stack Overflow 上发问、有人把问题丢到 issue tracker,当然在?Three20 的讨论区上更是免不了,一串讨论就是一百多篇,因为整个讨论串很长,所以又必须有人做出一份摘要,其中对你来说比较重要的资讯是-目前如果想要一份没有用到 private?API?的 Three20,请先服用?Prime 31 的 fork。

Private?API

苹果所称 Three20 所使用的 private API,是 Three20 直接存取了 UITouch 这个 class 里头的几个成员变数,像是 _locationInWindow、_view、_window 等。UITouch 就是用来记录、处理使用者用手指摸过 iPhone 萤幕时所产生的事件的 class,里头储存的资料包括-什么时候发生、手指在萤幕上的座标位置、点到的是哪个画面等。

一般来说,好像不太需要自己产生 UITouch 物件,而是在使用者按了萤幕之后,系统就会把 UITouch 物件传递给你的程式。而 Three20 用到 UITouch 成员变数的地方,在于自己产生 UITouch 物件,初始化时自然会将各种资料储存在这些成员变数里,需要自己产生 UITouch 物件的主要用途,则是用来作 UI 的自动化测试。

根据 commit log,这段程式在今年二月十八日就有了,在这段时间内 Facebook 出了多少版本,多少用了 Three20 library、用了这段程式的软体在 App Store 上架,到了十一月,突然统统 reject。

而这些 UITouch 的成员变数有多「private」呢?你也不需要用什么逆向工程工具就可以知道,因为都直接写在 UITouch 的 header 里头,如果你装了 iPhone SDK,请打开 Xcode,随便开一个文字档,打上「UITouch」几个字,按着键盘的 command key,在刚刚打的字上面点两下,Xcode 就帮你打开了 UITouch.h,另外一种更快的方法是直接用 spotlight 搜寻「UITouch.h」。虽然这些变数是 class 里头的内部状态,但是就是写在这么容易就可以看到的档案里头,然后说这是 private API…。

如果真的不希望别人使用,Xcode 也可以设计成,在编译的时候,同时检查哪些是你不希望别人使用的东西,提出警告。Xcode 现在连哪里有 potential leak 哪里有 over release 都可以找到,这种事情也不是做不到。

不过,这个时候突然针对取用 UITouch 成员变数有大动作,总觉得是想要排除很多现在的应用程式日后不相容的问题,UITouch 大概会有大改写。而 UITouch 还可以改写什么呢?新的触控介面的资料?在双萤幕上同时出现 touch 事件?(随便乱猜)

这边加一段我同事的意见:

『Objective-C 确实没有像 C++ 那个严格的成员变数保护,这些底线开头的变数也确实被 Apple 视为 private ivar,但是在没有任何沟通的情况下,直接以「这是使用private API」的行为来 reject 掉一些拿来测试用的 code ??』

总之,状况简述如下-

你製作、维护一套花了很大力气做出来的 library,说服公司将资产透过网路分享给别人,自己写这套 library 只领公司薪水,其他人的软体却因此在 UI 精緻度上提昇并因此获利。有一天,苹果 reject 了(想来绝对不下)上千套软体,原因是一段就算处在灰色地带,但是长久以来(以 iPhone 的发展速度,九个月算很久了)没什么问题,但突然被认为有问题的十行程式。其他开发者的询问如雪片般飞来,一片哀鸿遍野,一群人为了各自利益的软体产品围着你一个人看你写程式,做这件事情对自己与公司看来也都没有什么好处,而问题追根究柢是苹果的政策。你会怎么做?

于是看到某些讨论就实在让人觉得很欢乐,比方说看到这样的留言-

?

?

?

本文《three20介绍》版权归jiyongfeng所有,引用three20介绍需遵循CC 4.0 BY-SA版权协议。


推荐阅读
  • 本文介绍了在使用Python中的aiohttp模块模拟服务器时出现的连接失败问题,并提供了相应的解决方法。文章中详细说明了出错的代码以及相关的软件版本和环境信息,同时也提到了相关的警告信息和函数的替代方案。通过阅读本文,读者可以了解到如何解决Python连接服务器失败的问题,并对aiohttp模块有更深入的了解。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • WebSocket与Socket.io的理解
    WebSocketprotocol是HTML5一种新的协议。它的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送 ... [详细]
  • 本文介绍了如何使用PHP向系统日历中添加事件的方法,通过使用PHP技术可以实现自动添加事件的功能,从而实现全局通知系统和迅速记录工具的自动化。同时还提到了系统exchange自带的日历具有同步感的特点,以及使用web技术实现自动添加事件的优势。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 有没有一种方法可以在不继承UIAlertController的子类或不涉及UIAlertActions的情况下 ... [详细]
  • 利用Visual Basic开发SAP接口程序初探的方法与原理
    本文介绍了利用Visual Basic开发SAP接口程序的方法与原理,以及SAP R/3系统的特点和二次开发平台ABAP的使用。通过程序接口自动读取SAP R/3的数据表或视图,在外部进行处理和利用水晶报表等工具生成符合中国人习惯的报表样式。具体介绍了RFC调用的原理和模型,并强调本文主要不讨论SAP R/3函数的开发,而是针对使用SAP的公司的非ABAP开发人员提供了初步的接口程序开发指导。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • iOS Swift中如何实现自动登录?
    本文介绍了在iOS Swift中如何实现自动登录的方法,包括使用故事板、SWRevealViewController等技术,以及解决用户注销后重新登录自动跳转到主页的问题。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
PHP培训师
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有