本書介紹了如何利用iOS7進行程序開發的已經過檢驗的可信解決方案。作者將當前最優的實踐運用到工作代碼中,將核心的概念轉換為讀者方便理解和應用的具體方案,利用實例,充分展示了iOS開發中的“如何進行”和“為什么這么做”兩個方面。
世界知名iOS開發專家詳細講解創建優秀iOS移動應用程序的技術細節,系統闡釋如何高效開發iOS程序
用直觀的代碼演示當前流行的編程技巧,為iOS開發者提供行之有效的解決方案
歡迎閱讀本書新版!
自蘋果公司發行iOS移動操作系統以來,iOS 7的變革是最為重大的。這本教程將會指導各位開發者針對這個新發布的優秀操作系統來制作應用程序。2013年的全球軟件開發者年會(Worldwide Developers Conference,WWDC)公布了一些新的特性和視覺范式,而本書這次修訂已經將它們全都涵蓋在內了,筆者將會向你演示如何將其融入自己的應用程序里。
發行團隊將這次修訂過的Cookbook材料分成兩本書來印刷,以控制每本書的篇幅。本書的英文書名叫作《The Core iOS Developer’s Cookbook》,講述了日常開發所需的關鍵知識,介紹了使用標準API與界面元件來創建iOS應用程序時所需用到的類。同時,本書以“解決方案”的形式講解創建移動應用程序時所需的圖像、觸摸及視圖等技術。
另外一本書的英文名叫作《Learning iOS Development: A Hands-on Guide to the Fundamentals of iOS Programming》,其中包含了一些入門知識,相當于老版本Cookbook的前面幾章。該書適合想要從頭學習iOS 7基礎知識的開發者閱讀。《Learning iOS Development》講述了Objective-C編程語言、Xcode開發環境以及與調試和部署有關的內容,你可以通過它學會如何使用蘋果公司的開發工具套件。
學習本書所需的材料和知識 想開發iOS應用程序,肯定得有一臺測試應用程序用的iOS設備,而且最好是一臺新款的iPhone或iPad。下面列出閱讀本書所需的材料和基礎知識:
蘋果公司的iOS SDK——你可以從蘋果公司的iOS Dev Center(http://developer.apple.com/ios)下載最新版的iOS SDK。如果打算在App Store上發售應用程序,那么還必須成為付費的iOS開發者。個人開發者每年需要付款99美元,企業開發者每年需要付款299美元。注冊成為付費開發者之后,就會收到一份證書,開發者可以用這份證書來簽署應用程序,并將其下載到iPhone、iPod touch或iPad中進行測試與調試,此外,付費開發者還可以提前獲得預覽版的iOS系統。未付費的開發者可以在Mac系統的模擬器上測試軟件,但是不能將其部署到設備中,也不能將其提交到App Store。
運行Mac OS X Mountain Lion(v 10.8)系統的新款Mac,如果裝的是Mac OS X Mavericks(v 10.9)系統就更好——你需要為軟件開發留出足夠的磁盤空間,而且應該盡可能把Mac的RAM裝配得大一些。
iOS設備——盡管iOS SDK里的模擬器也能用來測試應用程序,但是開發者仍然需要一臺iOS硬件設備,以便針對iOS平臺做開發。你可以把iOS設備與電腦相連,并把自己構建的軟件裝上去。在開發真實的App Store程序時,應該準備數款硬件和固件各不相同的設備,以便在目標用戶可能會用到的各種平臺上進行測試。
因特網連接——連上網之后,就可以測試應用程序在使用WiFi和使用移動數據網絡時的效果了。
熟悉Objective-C——要想編寫iPhone程序,需要了解Objective-C 2.0。這是一門基于ANSI C的語言,并且帶有面向對象擴展,也就是說,你需要了解一點C語言的知識。如果原來用Java或C++寫過程序,而且又熟悉C語言,那么應該能夠迅速適應Objective-C。
學習Mac/iOS開發的路線圖 一本書不可能把各類讀者所需的全部知識都囊括其中。假如兩位作者把你所需的全部內容都寫到這本書里,那它會重到根本拿不起來。實際上,想要開發Mac及iOS平臺上的程序,需要學習很多內容。如果你剛處于起步階段,而且沒有寫過程序,那么首先應該學習一門大學水平的C語言課程。大部分編程語言都以C語言為根基,對于想要成為開發者的人來說,自然也要從C語言學起。
學會C語言及編譯器(基礎的C語言課程會講到它)的用法之后,剩下的事情就簡單多了。此時可以直接跳到Objective-C語言,學習如何用它來編程,同時還可以學習Cocoa框架。圖1是一張流程圖,里面列出了培生教育出版集團所出版的一些關鍵書籍,它們可以幫助你成為一名熟練的iOS開發者。
Erica Sadun,是數十本暢銷書的作者、合著者和供稿者,這些書涉及程序設計、數字視頻、數字攝影、Web設計和其他技術主題。作為一名在iOS領域最負盛名的開發人員,她還開發了數十種iPhone自帶的應用。Sadun擁有佐治亞理工學院計算機科學專業的博士學位。
Rich Wardwell,是Black Pixel的資深iOS及Mac開發者,在專業級服務器、桌面和移動領域有20多年軟件開發經驗,并以主要開發者的身份參與制作了很多款Apple App Store上的優秀iOS應用程序,包括USA Today及Fox News。。
愛飛翔,資深軟件開發工程師,擅長Web開發、移動開發和游戲開發,有10余年開發經驗,曾主導和參與了多個手機游戲和手機軟件項目的開發,經驗十分豐富。業余愛好文學和歷史,有一定的文學造詣。翻譯并出版了《Android游戲開發實踐指南》、《測試驅動的iOS開發》、《HTML5 Canvas核心技術:圖形、動畫與游戲開發》、《NoSQL精粹》和《JavaScript應用開發實踐指南》等書。
譯者序
前 言
致 謝
第1章 手勢與觸摸 1
1.1 觸摸 1
1.1.1 觸摸操作所處的階段 2
1.1.2 UIResponder類中的觸摸事件響應方法 3
1.1.3 對視圖的觸摸 4
1.1.4 多點觸摸 4
1.1.5 手勢識別器 5
1.2 解決方案:添加簡單的直接操縱界面 5
1.3 解決方案:添加拖動手勢識別器 7
1.4 解決方案:同時使用多個手勢識別器 9
1.5 解決方案:限制移動 14
1.6 解決方案:測試觸摸 15
1.7 解決方案:針對位圖的觸摸測試 17
1.8 解決方案:根據觸摸情況在屏幕上繪制內容 19
1.9 解決方案:令繪制效果變得平滑 21
1.10 解決方案:啟用多點觸摸 24
1.11 解決方案:檢測圓圈手勢 27
1.12 解決方案:創建自定義手勢識別器 32
1.13 解決方案:把滾動視圖中的內容拖曳到外面 34
1.14 解決方案:實時的觸摸反饋 37
1.14.1 啟用觸摸反饋效果 38
1.14.2 攔截并轉發觸摸事件 38
1.14.3 實現TOUCHkit的TOUCHkitView類 40
1.15 解決方案:向視圖中添加菜單 42
1.16 小結 43
第2章 構建并使用控件 45
2.1 UIControl類 45
2.1.1 目標-動作模式 46
2.1.2 控件的種類 46
2.1.3 控件事件 46
2.2 按鈕 48
2.3 Interface Builder中的按鈕 50
2.4 解決方案:構建按鈕 51
2.4.1 多行按鈕文本 54
2.4.2 為按鈕添加動畫元件 54
2.4.3 為按鈕添加額外狀態 55
2.5 解決方案:使按鈕以動畫效果來響應用戶 55
2.6 解決方案:為滑桿控件添加自定義的滑塊 57
2.6.1 定制UISlider控件 57
2.6.2 添加優化代碼 58
2.7 解決方案:創建可以連續點擊兩次的分段選擇控件 61
2.7.1 實現第二次點擊時的反饋效果 62
2.7.2 控件及帶屬性的字符串 63
2.8 開關控件與步進控件 64
2.9 解決方案:編寫UIControl的子類 65
2.9.1 創建控件 68
2.9.2 追蹤觸摸事件 68
2.9.3 派發控件事件 69
2.10 解決方案:構建評分所用的Star Slider控件 69
2.11 解決方案:構建觸摸轉盤控件 72
2.12 解決方案:創建拉曳控件 75
2.12.1 為控件添加提示效果 75
2.12.2 測試觸摸 77
2.13 解決方案:構建自定義的鎖定控件 80
2.14 解決方案:圖片庫查看器 83
2.15 構建工具欄 85
2.16 小結 88
第3章 提醒用戶 89
3.1 直接向用戶彈出警告視圖 89
3.1.1 構建簡單的警告視圖 89
3.1.2 設置UIAlertView的委托 91
3.1.3 顯示UIAlertView 92
3.1.4 各種UIAlertView 92
3.2 解決方案:構建支持塊的警告視圖 93
3.2.1 塊簡介 93
3.2.2 使用塊時避免保留循環 95
3.3 解決方案:將變長參數列表與UIAlertView結合起來使用 98
3.4 展示選項列表 99
3.4.1 滾動菜單 101
3.4.2 在動作表中顯示文本 101
3.5 將操作進度告知用戶并提示其稍等片刻 102
3.5.1 使用UIActivity-IndicatorView 103
3.5.2 使用UIProgressView 103
3.6 解決方案:在屏幕上繪制模態的進度指示器 104
3.7 解決方案:自制的模態警告視圖 106
3.8 解決方案:基本的popover 110
3.9 解決方案:本機通知 111
3.10 用網絡活動指示器提醒用戶 113
3.11 解決方案:播放簡單的提示音 114
3.11.1 System Sound 114
3.11.2 為使用系統框架而引入模塊 115
3.11.3 震動 115
3.11.4 警示音 116
3.11.5 延遲 117
3.11.6 釋放系統音 117
3.12 小結 117
第4章 編排視圖及其動畫效果 119
4.1 視圖層級 119
4.2 解決方案:用樹狀圖來描述視圖層級 121
4.3 解決方案:查詢子視圖 123
4.4 管理子視圖 125
4.4.1 添加子視圖 125
4.4.2 重排及刪除子視圖 125
4.4.3 UIView的回調方法 125
4.5 為視圖設定標簽并查找視圖 126
4.6 解決方案:通過對象關聯機制為視圖設定名稱 127
4.7 視圖的幾何特征 129
4.7.1 框架 130
4.7.2 與CGRect有關的工具函數 130
4.7.3 CGPoint與CGSize 131
4.7.4 CGAffineTransform 132
4.7.5 坐標系統 133
4.8 解決方案:操控視圖的框架 133
4.8.1 調整視圖的尺寸 134
4.8.2 CGRect與中心點 136
4.8.3 視圖的其他幾何特征 137
4.9 解決方案:獲取與坐標變換有關的信息 141
4.9.1 獲取與變換有關的屬性 141
4.9.2 判斷兩個視圖是否相交 142
4.10 與顯示和交互有關的特征 147
4.11 UIView的動畫效果 148
4.12 解決方案:視圖的淡入與淡出 150
4.13 解決方案:交換兩個視圖的前后順序 151
4.14 解決方案:翻轉視圖 151
4.15 解決方案:采用Core Animation API來制作切換效果 153
4.16 解決方案:使視圖在出現之后回彈 155
4.17 解決方案:關鍵幀動畫 156
4.18 解決方案:UIImageView的動畫效果 157
4.19 小結 158
第5章 視圖的約束系統 160
5.1 什么是約束 161
5.2 約束系統所用的屬性 161
5.3 約束系統的運作規律 163
5.4 約束規則與框架屬性 165
5.4.1 固有內容的尺寸 165
5.4.2 對齊矩形 166
5.5 創建約束規則 167
5.5.1 基本約束規則聲明 167
5.5.2 用可視化格式字符串聲明約束規則 168
5.5.3 變量綁定 169
5.6 格式字符串 169
5.6.1 方向 169
5.6.2 連接 171
5.7 謂詞 173
5.7.1 指標 173
5.7.2 描述兩個視圖關系的謂詞 174
5.7.3 優先級 174
5.8 格式字符串總結 174
5.9 用格式字符串將視圖對齊并靈活調整其尺寸 176
5.10 處理約束規則的流程 176
5.11 管理約束規則 177
5.12 解決方案:實現約束規則之間的對比 178
5.13 解決方案:創建尺寸固定且受規則約束的視圖 181
5.13.1 禁用translatesAutoresizing-MaskIntoConstraints 181
5.13.2 令視圖出現在上級視圖范圍內 182
5.13.3 限定視圖的尺寸 183
5.13.4 把前面各節內容拼裝起來 183
5.14 解決方案:將兩個視圖居中對齊 185
5.15 解決方案:設定寬高比 186
5.16 解決方案:響應屏幕方向的變更 188
5.17 調試約束規則 190
5.18 解決方案:描述約束規則 191
5.19 用宏來創建約束規則 194
5.20 小結 197
第6章 文本輸入 198
6.1 解決方案:隱藏UITextField的鍵盤 199
6.1.1 阻止系統把鍵盤隱藏起來 200
6.1.2 UITextInputTraits協議中的屬性 200
6.1.3 文本框的其他屬性 201
6.2 解決方案:把帶有自定義輔助視圖的鍵盤隱藏起來 203
6.3 解決方案:根據鍵盤來調整文本視圖 205
6.4 解決方案:創建自定義的輸入視圖 209
6.5 解決方案:使視圖具備文本輸入功能 213
6.6 解決方案:為非文本視圖添加自定義的輸入視圖 216
6.7 解決方案:創建更好的文本編輯器(第一部分) 218
6.8 解決方案:創建更好的文本編輯器(第二部分) 221
6.8.1 啟用Attributed Text 221
6.8.2 控制文本的樣式 221
6.8.3 可供UIResponder使用的其他功能 223
6.9 解決方案:過濾用戶所輸入的文本 224
6.10 解決方案:檢測文本模式 226
6.10.1 構建自己的正則表達式 227
6.10.2 枚舉正則表達式 227
6.10.3 數據探測器 228
6.10.4 使用內置類型的探測器 229
6.10.5 有用的網站 229
6.11 解決方案:檢測UITextView中的拼寫錯誤 231
6.12 搜尋文本中的字符串 232
6.13 小結 233
第7章 使用視圖控制器 234
7.1 視圖控制器 234
7.1.1 UIViewController類 235
7.1.2 導航控制器 235
7.1.3 標簽欄控制器 235
7.1.4 分欄視圖控制器 236
7.1.5 頁面視圖控制器 236
7.1.6 popover控制器 236
7.2 使用導航控制器與分欄視圖控制器來開發程序 237
7.2.1 使用導航控制器與導航棧 238
7.2.2 推入與彈出視圖控制器 239
7.2.3 導航欄上的按鈕 239
7.2.4 延伸至屏幕邊緣的布局形式 240
7.3 解決方案:UINavigationItem類 241
7.3.1 標題與后退按鈕 242
7.3.2 宏 242
7.4 解決方案:模態界面 244
7.5 解決方案:構建分欄視圖控制器 248
7.6 解決方案:用分欄視圖及導航控制器創建通用的程序 253
7.7 解決方案:標簽欄 255
7.8 記住標簽的狀態 259
7.9 解決方案:頁面視圖控制器 262
7.9.1 與書籍展示風格有關的屬性 262
7.9.2 封裝實現細節 263
7.9.3 范例代碼詳解 269
7.9.4 構建界面索引 270
7.10 解決方案:自定義的容器 271
7.10.1 添加與移除子視圖控制器 274
7.10.2 視圖控制器之間的切換效果 275
7.11 解決方案:segue 276
7.12 小結 282
第8章 常用的控制器 284
8.1 圖像選取器控制器 284
8.1.1 圖像來源 284
8.1.2 在iPhone和iPad中顯示選取器 285
8.2 解決方案:選取圖像 286
8.2.1 向模擬器中添加圖片 286
8.2.2 AssetsLibrary模塊 286
8.2.3 展示選取器 287
8.2.4 處理delegate的回調 288
8.3 解決方案:拍攝照片 293
8.3.1 配置選取器 293
8.3.2 顯示圖像 295
8.3.3 把圖像保存到相冊 295
8.4 解決方案:錄制視頻 297
8.4.1 創建錄制視頻用的選取器 298
8.4.2 保存視頻 299
8.5 解決方案:用媒體播放器播放視頻 299
8.6 解決方案:編輯視頻 302
8.7 解決方案:選取并編輯視頻 304
8.8 解決方案:通過電子郵件發送圖片 306
8.9 解決方案:發送文本消息 309
8.10 解決方案:在社交網站發布消息 311
8.11 小結 313
第9章 創建并管理表格視圖 314
9.1 iOS的表格 314
9.2 委托 315
9.3 創建表格 316
9.3.1 表格的樣式 316
9.3.2 排布表格視圖 316
9.3.3 設置數據源 317
9.3.4 提供單元格 317
9.3.5 注冊單元格類 317
9.3.6 從隊列中取出單元格 318
9.3.7 設置delegate 318
9.4 解決方案:實現簡單的表格 319
9.4.1 數據源方法 319
9.4.2 響應用戶的觸摸 322
9.5 UITableViewCell類 322
9.5.1 單元格的selectionStyle屬性 323
9.5.2 添加自定義的單元格受選效果 323
9.6 解決方案:創建帶有選取標記的單元格 323
9.7 給單元格添加詳情展示控件 325
9.8 解決方案:編輯表格 327
9.8.1 添加撤銷功能 331
9.8.2 實現撤銷功能 332
9.8.3 顯示移除單元格所用的控件 332
9.8.4 處理刪除請求 332
9.8.5 通過滑動手勢刪除單元格 333
9.8.6 調整單元格的順序 333
9.8.7 添加單元格 333
9.9 解決方案:操控表格的區段 334
9.9.1 構建區段 334
9.9.2 區段數量與區段內的行數 335
9.9.3 返回單元格 335
9.9.4 創建每個區段的頭部標題 337
9.9.5 定制表格與區段的頭部及尾部 338
9.9.6 創建區段索引 338
9.9.7 處理索引與區段不匹配的問題 339
9.9.8 為分區表格實現委托方法 339
9.10 解決方案:在表格中搜索 339
9.10.1 創建搜索顯示控制器 341
9.10.2 為搜索顯示控制器注冊單元格 341
9.10.3 構建支持搜索功能的數據源方法 342
9.10.4 委托方法 343
9.10.5 使用與搜索功能相配套的索引 344
9.11 解決方案:給表格添加下拉刷新功能 345
9.12 解決方案:添加指令行 348
9.13 制作自定義的分組表格 351
9.14 解決方案:構建含有多個滾輪的表格 352
9.14.1 創建UIPickerView 353
9.14.2 數據源方法與委托方法 353
9.14.3 使用帶有選取器的視圖 354
9.15 使用UIDatePicker 356
9.16 小結 357
第10章 集合視圖 358
10.1 集合視圖與表格的異同 358
10.2 建立集合視圖 360
10.2.1 通過控制器使用集合視圖 361
10.2.2 直接使用集合視圖 361
10.2.3 數據源與委托 362
10.3 流式布局 362
10.3.1 滾動方向 362
10.3.2 條目的尺寸以及行間距 362
10.3.3 頭部與尾部的尺寸 364
10.3.4 內邊距 365
10.4 解決方案:采用流式布局的簡單集合視圖 366
10.5 解決方案:自定義單元格 370
10.6 解決方案:水平滾動的列表 372
10.7 解決方案:創建交互式的布局效果 375
10.8 解決方案:滾動之后自動調整位置 377
10.9 解決方案:創建圓形布局 378
10.9.1 實現創建條目與刪除條目時的動畫效果 381
10.9.2 增強圓形布局的實用性 382
10.9.3 布局對象 383
10.10 解決方案:用手勢調整布局 383
10.11 解決方案:創建真正的網格狀布局 385
10.12 解決方案:為集合視圖中的條目添加自定義菜單 391
10.13 小結 393
第11章 分享文檔與數據 394
11.1 解決方案:使用統一類型標識符 394
11.2 解決方案:訪問系統剪貼板 400
11.3 解決方案:監控Documents文件夾 403
11.4 解決方案:活動視圖控制器 408
11.5 解決方案:Quick Look預覽控制器 417
11.6 解決方案:使用文檔交互控制器 420
11.7 解決方案:聲明程序所支持的文檔類型 426
11.8 解決方案:創建基于URL的服務 431
11.9 小結 434
第12章 淺談Core Data 435
第13章 網絡編程基礎 462
第14章 針對特定設備的開發 493
第15章 輔助功能 524
附錄A Objective-C字面量 536
3.1.3顯示UIAlertView
show這個實例方法可以把UIAlertView顯示出來。而顯示出來之后,警告視圖就會呈現模態(modal)。也就是說,它后面的屏幕內容會變暗,同時,用戶無法操作程序里面除UIAlertView之外的部分。等用戶通過點擊某個按鈕(通常是OK或Cancel)對UIAIertView做出確認之后,這個模態視圖就消失了。此時,系統會把控制權交給UIAIertView的委托,使開發者可以在其中完成收尾工作,并對用戶所選的按鈕做出響應。
UIAIertView的各項屬性在創建之后依然可以修改。你可通過修改title或messaqe屬性來定制它。message是一段可選的文本,它會出現在UIAlertView的title之下、按鈕之上。經由addButt。nwithTitle:方法,還可以再添加一些按鈕。
3.1.4各種UIAlertView
開發者可以通過alertViewStyle屬性創建不同樣式的UIAlertView。按默認樣式(也就是UIAIertViewStyleDefault)創建出來的UIAlertView具備標題及信息文本,另外還可以有一些按鈕,其效果如圖3—1所示。這是UIAlertView系列中的基本款式,開發者能夠由此征詢用戶的意見,而用戶則可以通過點擊Yes/No、Cancel/OK等按鈕做出簡單的選擇。
iOS還提供了三種樣式,它們專門針對需要輸入文本的場合:
UIAlertViewStylePlainTextInput——用戶可以在這種樣式的UIAlertView里輸入文本。
UIAlertViewStyleSecureTextInput——假如要考慮安全問題,那么可以采用這種樣式
的UIAIertView,它會把用戶鍵入的文本自動遮蓋起來。文本將會以一系列大圓點
的形式來顯示,而開發者則可以在委托的回調方法中編寫代碼,讀取用戶輸入的內容。
……