绘制对象iPhone开发基础教程 笔记
每日一貼,今天的內容關鍵字為繪制對象
????
1. 虛擬內存????
iPhone OS其實不會將易掉性內存(如應用程序數據)寫到交換文件,因此應用程序可用內存量將受到更多的制約。????
Cocoa Touch供給一種內置機制,可以將內存不足的情況通知給應用程序。????
2. nib文件形成????
File's Owner是全部nib文件中的第一個圖標,它標示從磁盤加載nib文件的對象。即,File's Owner是“具有”此nib文件的對象。????
First Responder可懂得成用戶以后正在與之交互的對象。例如,如果用戶以后正在textfield中輸入數據,則該textfield就是以后的First Responder。????
First Responder將隨著用戶與界面的交互而變化。它的IB屬性為placeholders,這意味這它屬于一個虛擬實例,就不如textfield的string placeholders一樣????
只是臨時表現一下。真正的First Responder會被其他對象取代。實際上,任何派生自NSResponder類的對象都可以作為First Responder。而First Responder????
里面全部的Action就是NSResponder供給的或者自定義的響應函數。????
MacOS在系統內部會維護一個稱為“The Responder Chain”的鏈表。該列表內容為Responder對象實例,它們會對各種系統事件做出響應。最上面的那個對象????
就叫做First Responder,它是最早接收到系統事件的對象。如果該對象不處置改事件,系統會將這個事件向下傳遞,直到找到響應事件的對象,我們可以理????
解 為該事件被該對象截取。????
The Responder Chain基本結構如下圖所示: ?????
3. 線程安全????
Mutable container is not thread safe????
"不要在后臺線程更新你的UI"。其實,這個說法其實不周密。首先需要把“UI更新”這個詞做一個說明,它可以有2個層次的懂得:????
首先是繪制,其實是表現。繪制是可以放在任何線程里停止的,但是要表現出來就必須在主線程操作了。比如,對一個圖片添加一個變色濾鏡,????
這個進程便可以看成是繪制。Twitter客戶端會把一條微博表現成一個cell,但是速度非常快,就是因為先對cell做了offscreen的渲染,然后再表現。????
4. Subclass 和Category????
先說一下這2個特性最主要的區別。簡略可以這么懂得,subclass體現了類的上下級關系,而category是類間的平級關系。 ?? ????Category methods should not override existing methods (class or instance).? ? ????Two different categories implementing the same method results in undefined behavior?
????
category不僅可以為原有class添加方法,而且如果category方法與類內某個方法具有同樣的method signature,那么category里的方法將會替換類的原有方法。????
????這是category的替換特性。利用這個特性,category還可以用來修復一些bugs。例如已宣布的Framework出現漏洞,如果不便于重新宣布新版本,????
????可以應用category替換特性修復漏洞。另外,由于category有run-time級別的集成度,所以使得cocoa程序安全性有所下落。????
????許多黑客就是利用這個特性(和posting技術2)劫持函數、破解軟件,或者為軟件增加新功能。????
5.?drawing Issues?大家都知道,MacOS是一個非常重視UI的系統。所以在MacOS編程里繪制是一個非常重要的部分。第10部分,我會從2點介紹MacOS下繪制編程。首先是繪制技術分類;其次是繪制代碼結構。?
從繪制技術分類上看,Cocoa程序員能接觸的幾種繪制技術列表如下:?
1. Cocoa Drawing(NS-prefix)?
2. Core Graphics(CG-prefix, called Quazrtz 2D)?
3. Core Animation?
4. Core Image?
5. OpenGL??
在這里我不打算給大家介紹每一種都是如何繪制詳細的圖像。只是介紹一下,它們大概長什么樣子,并且有什么優勢和制約。?
###Cocoa Drawing?
Cocoa Drawing應該是學習Cocoa程序開發最早接觸的繪制技術。也是目前大多數MacOS程序所應用的繪制技術,其底層應用Quazrtz 2D(Core Graphics)。蘋果對應文檔為 [Cocoa Drawing Guide](https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaDrawingGuide/Introduction/Introduction.html)。Cocoa Drawing并沒有統一的繪制函數,全部繪制函數疏散在幾個主要的NS類的上面。例如, NSImage, NSBezierPath, NSString, NSAttributedString, NSColor, NSShadow,NSGradient …?
所以很簡略,當你看到如下代碼便可以判斷,應用的是Cocoa Drawing方法?
| 復制代碼 |
這類代碼多出現在NSView的drawRect函數內。Cocoa Drawing 的渲染上下文是 NSGraphicsContext,我一直的看到很多新手把 NSGraphicsContext 和 CoreGraphics 的 CGContextRef 搞混。雖然它們很像并且也確實是有關系的,不過如果你不了解當繪制時候的 render context 很多時候將掉掉一個空白頁面的結果。 ?
###Core Graphics ?
Core Graphics 是 Cocoa Drawing layer 的底層技術,在 iOS 開發中非常普遍,因為 iOS 系統中其實不存在 Cocoa layer 所以網上可以找到的多是 Core Graphics 繪制代碼段子,這給那些不了解 Mac 開發的新手來說造成了很大困擾。Cocoa 是 Mac OS 下的 application framework 而 iOS 下的 application framework 則是 UIKit.framework又叫 Cocoa Touch,它們分享部分代碼基礎但又不完全一樣。例如,Cocoa Touch 下的 UIView 的渲染上下文會應用 UIGraphicsGetCurrentContext() 取得,它掉掉的是一個 CGContextRef 指針,而在 NSView 里多用 [NSGraphicsContext currentContext] 取得渲染上下文。它掉掉的是一個 NSGraphicsContext 對象。當然 NSView 里也可以通過 CGContextRef ctx = [[NSGraphicsContext currentContext] graphicsPort]; 來取得一個 Core Graphics 渲染上下文。 可見 Mac OS 下的開發更為靈活一些。因為 iOS 中的 UIKit 開發初期就瞄準了顯卡硬件加速,全部 UIView 都是默許 layer-backed 的。iOS 開發者必須應用 Core Graphics 和 Core Animation 這幾個絕對底層的繪制技術。 ?
請看上面等價代碼,作用是繪制一個白色矩形。但是分別應用 Core Graphics 和 Cocoa Drawing: ?
| 復制代碼 |
###Core Animation ?
如果說 Core Graphics 和 Cocoa Drawing 是通用的 UI 繪制框架的話,那么 CA 顯然是界面動畫繪制的高級技術。 ?
Core Animation 的對應 Cocoa Animation 部分應該是 NSAnimation 和 NSViewAnimation,但這2個差距比較大。NSAnimation 出現與 OS X 10.4,Core Animation 是 10.5 后出現的。NSViewAnimation 功能和應用絕對簡略。 ?
簡略來說,Core Animation 的作用對象是 CALayer, NSAnimation 的作用對象是 NSView。 ?
?
????
6. MVC 每日一道理毅力,是千里大堤一沙一石的凝聚,一點點地累積,才有前不見頭后不見尾的壯麗;毅力,是春蠶吐絲一縷一縷的環繞,一絲絲地堅持,才有破繭而出重見光明的輝煌; 毅力,是遠航的船的帆,有了帆,船才可以到達成功的彼岸。
????
MVC模型將全部功能劃分紅3個不同類別:????
? ? 模型:保存應用程序數據的類????
? ? 視圖:窗口、控件和其他用戶可以看到并能與之交互的元素的組成部分????
? ? 控制器:將模型和視圖綁定在一同,確定圖和處置用戶輸入的應用程序邏輯????
編寫的任何對象都應該能很明顯地劃分為其中的一類,并且其功能大部分不屬于或完全不屬于另外兩類。????
MVC可以幫助確保實現最大可重用性。????
????
7. 自動旋轉屏????
? ? 分別針對不同的設備屏幕狀態,設計兩個UIView 關聯到同一個xib文件中,然后都創立輸出口到ViewController里面,????
這樣在監測到屏幕變換時,直接設定不同View的hidden屬性,這樣就防止了自己調整控件位置。????
????
8. 多視圖????
? ? 多視圖應用程序都應用雷同的基本模式。????
? ? 罕見的有UINavigationController或UITabBarController,還有UIViewController自定義的子類。????
? ? 需要重點注意的是,多視圖控制器也是一個視圖控制器。Navigation和TabBar都是UIViewController的子類,并且可以執行其他視圖控制器可以執行的全部任務。????
? ? 根控制器是應用程序的主要視圖控制器,也是指定是不是應該自動旋轉到新方向的視圖。????
? ??????
????內容視圖分析:????
? ? 每一個視圖控制器(包含多視圖控制器)都控制一個內容視圖,應用程序的用戶界面就在這些內容視圖中構建。????
? ? 每一個內容視圖通常由2或3個部分組成:視圖控制器、nib文件以及一個可選的UIView子類。????
????
9. NSBundle????
? ? NSBundle只是一種特定的文件類型,其中的內容遵循特定的結構。應用程序和框架都是束NSBundle。????
? ? NSBundle的一個主要作用是取得添加到項目的Resources文件夾的資源。在構建應用程序的時候,這些文件將被復制到應用程序的束中。????
? ? 比如,應用mainBundle來取得需要的資源路徑:????
? ? NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"statedictionary", ofType:@"plist"];????
? ? NSDictionary *dictionary = [[NSDictionary alloc] initWithContentsOfFile:plistPath];????
????
10. 首選項????
? ? 用戶默許設置時應用程序首選項的一部分,由NSUserDefault類實現,用于保存和取得首選項。????
? ? 首選項存儲在Library/Preferences文件夾中。????
????
11.對模型對象停止歸檔????
? ? 在Cocoa天下中,術語“歸檔”是指另一種情勢的序列化,但是它是任何對象都可以實現的更慣例的類型。專門編寫用于保存數據(模型對象)的任何對象都應該????
? ? 支持歸檔。只要在類中實現的每一個屬性都是標量(如int或float)或者都是符合NSCoding協議的某個類的實例,你便可以對你的對象停止完全的歸檔。????
? ? 由于大多數支持存儲數據的Foundation和Cocoa Touch類都符合NSCoding,因此比較輕易實現。????
? ? 盡管對應用歸檔沒有嚴格要求,但是應該與NSCoding一同實現另一個協議,即NSCopying協議,該協議允許復制對象 。????
????????
12. 基本數據持久性????
? ? 方法:首選項、文件、歸檔、SQLite????
????
13.應用Quartz和OpenGL繪圖????
? ? 我們可以依托兩個不同的庫來滿足我們的繪圖需要:Quartz 2D,它是Core Craphics框架的一部分,OpenGL ES,它是跨平臺的圖形庫。????
? ? 盡管Quartz 和 OpenGL有許多個性,但它們之間存在明顯差別。????
? ? Quartz是一組函數、數據類型以及對象,專門設計用于直接在內存中對視圖或圖像停止繪制。????
? ? 盡管在計算機圖形中最經常使用的是RGB模型,但是它不是獨一的顏色模型。其他一些模型也掉掉了應用,包含:????
? ? ????色調、飽和度、值(HSV)????
????? ? 色調、飽和度、亮度(HSL)????
????? ? 藍綠色、洋紅色、黃色、黑色(CMYK)????
? ??????
????盡量防止整個視圖重新繪制,而是根據需要,調用setNeedsDisplayInRect:來停止局部重繪。減少重新繪制視圖的大量任務,可以在應用程序性能????
? ? 方面發生巨大差別,尤其是當應用程序變得更加復雜時。????
????????????
14. 輕擊、觸摸和手勢????
? ? 手勢gesture是指從你用一個或多個手指接觸屏幕時開始,直到你的手指分開屏幕為止所發生的多有事件。無論它話費了多長事件,只要一個或????
? ? 多個手指仍在屏幕上,你就仍然位于某個手勢之中(除非傳入電話呼叫等系統事件中斷該手勢)。? ? iPhone只跟蹤應用一個手指時的輕擊,記住這一點非常重要。如果她檢測到多個觸摸,則會將輕擊計數重置為1.
????
? ? 響應者鏈 responder chain????
? ? 由于手勢是在時光以內傳遞到系統的,然后事件會傳遞到響應者鏈。如果第一個響應者不處置某個特別事件,則她會將改時光傳遞到響應者鏈的下一級。????
????????
15. Core Location定位????
? ? iPhone可以應用Core Location framework來確定它的物理位置。Core Location可以利用三種技術來實現該功能:????
? ? GPS、蜂窩基站三角定位、wifi定位服務。????
? ? GPS是三種技術中最精確的,但是在第一代iPhone上不可用。我們只需要傳入精確度,不需要指定采取方法。系統本身會停止確定。????
? ? Cocoa Touch應用的主要類是:CLLocationManager。????
? ? 請記住你要求的精確度越高,消費的電量就會越多;其實不能保證你會取得所需精度級別。????
? ? 通過指定距離篩選器可以告知位置管理器不要將每一個變動都通知其代理,僅當位置變動超過特定數量是才通知其代理。????
? ? 如果只是需要確定以后位置而不是需要連續輪詢位置,則當它取得應用程序所需要信息之后,應該停止位置管理器。????
? ? 取得越精確的位置,就需要更多的電量。????
????
16. 加速計????
? ? 通過感知特定方向的慣性力總量,加速計可以測量出加速度和重力。????
? ? iPhone內的加速計是一個3軸加速器,這意味著它可以檢測到三維空間中的運動或重力引力。 應用的類為 UIAccelerometer。????
????????
17. 應用程序本地化文章結束給大家分享下程序員的一些笑話語錄: 程序員打油詩
寫字樓里寫字間,寫字間里程序員;
程序人員寫程序,又拿程序換酒錢。
酒醒只在網上坐,酒醉還來網下眠;
酒醉酒醒日復日,網上網下年復年。
但愿老死電腦間,不愿鞠躬老板前;
奔馳寶馬貴者趣,公交自行程序員。
別人笑我忒瘋癲,我笑自己命太賤;
不見滿街漂亮妹,哪個歸得程序員。
總結
以上是生活随笔為你收集整理的绘制对象iPhone开发基础教程 笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库范式笔记
- 下一篇: java判断回文数代码实例