iPhone SDK開發範例大全第三章之七BrightnessToolbarSwatches(7/7):2009年11月09a日星期一
iPhone SDK開發範例大全即iPhone Developer's CookBook的中文譯本,程式可由erica網站下載。第三章講View Controller,程式共有七個。
本文講第5個程式,05a- BrightnessToolbarSwatches,CookBook 中文譯本3-8、132~135頁(訣竅3-5):
本程式的研讀宜先看120~151行,是 SampleAppDelegate中applicationDidFinishLaunching設定好tabBarController(H)。
在其130行的iniWithBrightness:i將程式轉至BrightnessController的96行,在這裡,設好了title及UITabBarItem(G)。
再由96行內的101行中的設self.tabBarItem, 有 image:createImage設定代表UITabBarItem的image。此地呼叫createImage(F)來產生一個grey level為brightness /10的30 x 30大小方塊的image。
在createImage中:83行呼叫addRoundedRectToPath(E)來畫30x30有弧角4x4的rectangle的tab,及81行呼叫MyCreateBitMapContext(D)填入grey。
addRoundedRectToPath(E)、MyCreateBitMapContext(D)用到Quartz 2D ,相當複雜,不易懂,但其只是產生出一個個不同百分比的tab而已。
詳細情形說明如下:
(A) 這程式主要是產生一個11個tab的tab bar在下方,每個tab代表10%的grey,從0%(全黑)到100%(全白)。按下tab則grey會顯示出來,百分比也顯示出來,如下圖。
(B)因為有11個tab,按下More,則出現下圖左之table,table上的grey是尚未被顯示在tabBar上的,按Edit出規下圖右,將想要顯示的grey拉至想取代的tab,如圖中,40%已取代了0%,80%正要取代20%。完成後接Done。
(C)此時,40% 10% 80% 30%在tab bar出現,如下圖左,按一下40%則如圖右。
(D)MyCreateBitMapContext(13~49行):產生一個CGContextRef。在80、81行被call。
CGContextRef、CGColorSpaceCreateDeviceRGB return CGColorSpace。
CGColorSpace、CGColorSpaceRelease (CGColorSpace cs ) decrement retain count of cs、
CGBitmapContextCreate:在CGBitmapContext中,有下列parameter:
void *data:一塊memory,讓Quarz粉刷顏色的memory,大小至少是bytesPerRow * hwight。
size_t width:bitmap的width有多少pixel。
size_t height:bitmap的height有多少pixel。
size_t bitsPerComponet:一個pixel component 有多少bits。
size_t bytesPerRow:bitmap一個row有多少bytes。
CGColorSpaceRef colorspac:bitmap用那一個color space ,例如RGB、CMYK等等。
CGBitmapInfo bitmapInfo : Bitmap的information constant,描述是否同alpha,每個componet是floating或integer...等等。
KGCImageAlphaPremultipliedLast是指alpha component在most significant bits of pixel,例如ARGB。(Quarz 2D programming guide)
Modal View COntrollers(照相機軟體)--非inherit UIViewController、任何view controller均可modally presented;
90行:return [UIImage imageWithCGImage:myRef:]; 將myRef這個image轉成UIImage回傳。
(E)addRoundedRectToPath(51~75行):畫出tab,30x30有弧角4x4的rectangle。82行call到。
(F) createImage(78~91行):call addRoundedRectToPath及MyCreateBitMapContext,畫30x30有弧角4x4的rectangle的tab並填入grey,101行被call到。
(G) initWithBrightness:View Controller Programming Guide。
100行:self.title,見UIViewController 的property title, 此處設title,在receiver是navigation controller時,則直接設定了navigation controller的title值。
101行:self.tabBarItem,見UIViewController 的property tabBarItem,一旦call 這個property,UITabBarItem就產生了,UITabBarItem inherit自UIBarItem: NSObject。
UITabBarItem initWithTitle: (NSString *) title image (UIImage *)image tag:(NSInteger *) tag
title:UITabBarItem的title。
image:設定代表UITabBarItem的image。
此地呼叫createImage(F)來產生一個grey level為brightness /10的30 x 30大小方塊的image。
tag:這個UITabBarItem的代號。
(H) SampleAppDelegate中applicationDidFinishLaunching設定好tabBarController,如下:
127~136行:建立一個名為controllers的NSMutableArray,以BrightnessController為rootView的navigation controller。
130行的iniWithBrightness:i將程式轉至BrightnessController的96行,在這裡,設好了title及UITabBarItem供131行(此UIViewController為UINavigationController)及140行、141行(此UIViewController為一UITabBarController)使用。
140行:使用viewControllers、customizableViewControllers將controllers設給UITabBarController tbarController。 UITabBarController inherit自UIViewController: UIResponder : NSObject,詳如下:
viewControllers(140行) :NSArray :tabBar會自index 0 開始顯示每一個tab。
customizableViewControllers(141行):NSArray :tabBar會自index 0 開始顯示每一個tab。
如此,tabBarController就作成了。