作者:PHP培训师 | 来源:互联网 | 2023-09-15 15:38
本文主要介绍关于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版权协议。