項目要求
寫一個iPhone程式,在螢幕正中顯示文字“Hello Word”,粗體,字型大小26磅,字型顏色紅色,有黑色陰影,陰影光源為左上方,位移1像素,支援裝置旋轉。
需求分析
在開始之前,我們首先來分析一下項目需求,這是一個非常簡單的項目,只要在螢幕上顯示一段“Hello World”的文字,當然還有一些附加條件:
- 對字型、字型顏色、字型大小有要求,有陰影製作效果
- 要求文字顯示在螢幕正中
- 支援裝置旋轉,並且無論裝置如何旋轉,文字都還是顯示在螢幕正中
根據這些需求,我們將從簡單到複雜,逐步來實現,分成2步來實現:
- 在螢幕上顯示文字,設定字型和字型大小,讓文字顯示在螢幕正中心
- 支援裝置旋轉,並且保證旋轉後文字還是置中狀態
產品設計
iPhone4之前的螢幕是320x480,到iPhone4的時候,支援了高清屏,螢幕解析度變成了640x960。iPhone支援四個方向的旋轉的,橫屏和豎屏表現略有差異,因為項目需求要求支援旋轉螢幕,所以針對橫屏和豎屏,介面表現有所差異,簡單畫一下原型設計圖如下:
系統分析和設計
如果我們還沒iOS下的開發經驗,那麼首先需要去查閱一些相關資料,讓我們知道如何來開發一個iphone程式。蘋果為iOS的開發人員提供了一個非常詳細和全面的網站:“iOS Developer Center”,網址:http://developer.apple.com/ios。在iOS Dev Center,有所有iOS SDK的類文檔、入門文檔、各種開發指南、範例程式碼庫等,開發iOS平台的項目,免不了要經常上來查閱一些相關資料。不過比較遺憾的是,目前iOS Dev Center的文檔和資料還是英文為主,中文資料較少,對於英文閱讀不好的同學是一個考驗。
現在,我們從技術角度來分析一下如何?項目需求。同樣一個項目,無疑是有很多種技術方案來實現的,所以我們有必要定一個原則,來協助我們選擇合適的方案,這個原則就是簡單實用原則:“我們儘可能採用簡單並且實用的技術方案,避免使用複雜的技術方案,把時間和精力浪費在一些華而不實的技巧上面”,本著這個原則,我們來開始對項目需求進行技術方案的選擇:
在螢幕上顯示特定字型和大小的文字
要在螢幕上顯示特定字型和大小的文字,我們需要先看看iOS SDK中是否已經提供了簡單實用的方式來顯示文字,在iOS Dev Center中,有一篇文章“iOS Human Interface Guidelines”,專門講解了iOS中使用者介面相關的知識,從中我們可以系統的瞭解iOS的介面構成,各種基本介面元素,並且根據其中的說明,可以找到UILabel控制項是最適合我們項目需求的控制項,當然也有複雜的技術方案,就是採用在介面上自畫的方式,根據簡單實用原則,我們就使用UILabel這種iOS內建控制項就可以了。
在開始使用UILabel之前,我們需要先來學習瞭解一下UILabel控制項,想要瞭解UILabel控制項的功能,在iOS Dev Center中,找到“UILabel Class Reference”,從中我們可以看到UILabel的介紹和所有屬性、方法等詳細的說明文檔。
文檔相當全面,不過對於我們來說,關鍵還是要去擷取項目相關的資料,從文檔中,我們可以逐一找到我們顯示文字需要的相關屬性:
- text: Label顯示的文字,類型為NSString類,也就是本項目需求中要顯示的“Hello World”。
- textAlignment: 文字在Label內的對其方式,類型為UITextAlignment枚舉,在本項目需求中,要求文字在螢幕正中顯示,對應的屬性值為UITextAlignmentCenter。
- font: 文字的字型和大小,類型為UIFont類,也就是本項目需求中要求的:“字型為粗體,字型大小26磅”,對應代碼為:[UIFont boldSystemFontOfSize:26]。
- textColor: 文字的顏色,類型為UIColor類,也就是本項目需求中要求的:“字型顏色紅色”,對應代碼為:[UIColor redColor]。
- shadowColor: Label文字的陰影顏色,類型為UIColor類,也就是本項目需求中要求的:“有黑色陰影”,對應代碼為:[UIColor blackColor]。
- shadowOffset: Label文字陰影的位移方向和位移量,類型為CGSize,也就是本項目需求中要求的:“陰影光源為左上方,位移1像素”,對應代碼為:[CGSizeMake(1, 1)]。
讓文字顯示在螢幕正中心
要讓文字顯示在螢幕正中心,我們要優先考慮設定UILabel相關屬性達到目的的方式,如果沒有UILabel相關屬性支援,那麼我們就必鬚根據UILabel占的大小和螢幕大小來計算它應該擺放的座標,從而實現讓文字顯示在螢幕正中心。在UILabel的文檔中,沒有發現有屬性設定它的座標,也沒有設定對其的屬性,這是不是代表UILabel不支援呢?不要忽略一個問題,iOS所用的程式設計語言是Objective-C,這個一個類似於C語言的很好的支援物件導向特性的語言,物件導向有個很重要的特性叫繼承,同樣對於UILabel類來說,它是有父類的,也就是UILabel父類支援的屬性,UILabel都是支援的,在UILabel文檔的首頁,我們可以看到UILabel是從UIView繼承的,所以我們可以連結到“html%23//apple_ref/doc/uid/TP40006816">UIView Class Reference”文檔。
從文檔中,我們可以找到2個重要屬性,用來實現文字顯示在螢幕正中:
- frame: Label的位置和尺寸屬性,類型為CGRect,在本項目需求中,要求顯示在螢幕正中,就需要通過Label控制項的frame屬性的size值,結合主介面的尺寸,計算出x,y座標值,以保證Label顯示在螢幕正中。
- autoresizingMask: 這個屬性工作表示控制項在其父容器尺寸發生變化時,它是怎麼自動調整其尺寸或上下左右各個方向邊距的。
支援旋轉螢幕
iPhone程式預設不支援旋轉螢幕,那麼如何讓介面支援旋轉呢?在iOS Dev Center中,可以找到“View Controller Programming Guide for iOS”,在其中的“Custom View Controllers”一章中專門有一節“Managing a View Controllers Interface Orientation”,說明了如何讓你的iOS介面支援裝置旋轉:
- 重寫對應的View Controller的“shouldAutorotateToInterfaceOrientation:”方法,在方法中申明支援的方向。
- 配置對應的View Controller中的View的autoresizingMask屬性,以適應因為介面旋轉導致的布局變化。在本項目中,項目需求中要求裝置在旋轉也保證文字置中,利用這個屬性,可以實現在介面旋轉後,表單寬度和高度發生變化時,UILabel還能繼續置中。