2012年7月29日 星期日

實現彼得潘偷懶欲望的新一代Objective-C

隨著Xcode 4.4的推出, Objective-C也有了大幅的進步。其實偷懶是人類的天性,科技的進步正是朝著偷懶的目標前進。接下來彼得潘將介紹的Objective-C三大新功能,完全實現了彼得潘不為人知的偷懶欲望,我們可以打愈少的字,犯更少的錯,開發更多的App,賺更多的錢,環遊世界玩更多的國家!

1.  自動補上@synthesize

只要打@property,@synthesize會自動幫我們補上。

例子:

TestViewController.h


@interface TestViewController : UIViewController

@property (strong, nonatomic) NSString *name;

@end


TestViewController.m

@implementation TestViewController


- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

    _name = @"彼得潘"; 
    self.name = @"彼得潘";
}

@end
說明:

自動補上的@synthesize,其實長得像這樣

@synthesize name = _name;

因此若要直接存取物件的member,於前面加 _ 即為member名稱。



2.  神奇的@


Objective-C的物件讓人又愛又恨。因為物件,讓我們可以輕易設計許多天馬行空的App。但也因為物件,讓我們在使用某些常用型別,比方int, Array, Dictionary時,需要寫許多令人心煩的程式碼。現在有了神奇的@,一切都簡單多了。

例子:

(1) NSNumber

a.  一拍即合型

沒有@的世界末日
    NSNumber * endOfTheWorld = [NSNumber numberWithInt: 2012];
神奇@的世界末日
   NSNumber *endOfTheWorld = @2012;

說明:
如果對象是數字,它和@完全是一拍即合,可以直接結合。

b.  月下老人 ( ) 牽線型

如果不是數字,還是可以結合,只不過需要 ( ) 的幫忙。

-(int)getEndOfTheWorld
{
    return 2012;
}

沒有@的世界末日
NSNumber * endOfTheWorld = [NSNumber numberWithInt: [self getEndOfTheWorld]];

神奇@的世界末日
NSNumber *endOfTheWorld = @([self getEndOfTheWorld]);

(2) NSArray

結合@ 和 [ ] ,我們可以輕易創造NSArray。

沒有@的蝙蝠俠三部曲
NSArray *batmanMovies = [NSArray arrayWithObjects:@"開戰時刻", @"黑暗騎士", @"黎明升起", nil];

神奇@的蝙蝠俠三部曲
NSArray *batmanMovies = @[@"開戰時刻", @"黑暗騎士", @"黎明升起"];

不過如果蝙蝠俠想再拍第四集,要先變型為NSMutableArray才能加入第四集,例如以下例子:

NSMutableArray *batmanMovies = [@[@"開戰時刻", @"黑暗騎士", @"黎明升起"] mutableCopy];
[batmanMovies addObject:@"當蝙蝠俠遇上彼得潘"];

(3) NSDictionary


結合@ 和 { },我們可以輕易創造NSDictionary。

沒有@的蔡淳佳新專輯主打歌
NSDictionary *joiNewAlbum = [NSDictionary dictionaryWithObjectsAndKeys:@"Love You", @"song1", @"不透光", @"song2", nil];


神奇@的蔡淳佳新專輯主打歌
NSDictionary *joiNewAlbum = @{ @"song1" : @"Love You", @"song2": @"不透光" };



3.  更方便的存取集合裡的元素 (Object Subscripting) 



 NSMutableArray *batmanMovies = [@[@"開戰時刻", @"黑暗騎士", @"黎明升起"]
       mutableCopy];
 [batmanMovies addObject:@"當蝙蝠俠遇上彼得潘"];

沒有subscripting的蝙蝠俠第4集
 movieLabel.text = [batmanMovies objectAtIndex:3];


支援subscripting的蝙蝠俠第4集
 movieLabel.text = batmanMovies[3];

說明:
在 [ ] 內指定index

 
 NSDictionary *joiNewAlbum = @{ @"song1" : @"Love You", @"song2": @"不透光" };


沒有subscripting的蔡淳佳抒情主打歌

 songLabel.text = [joiNewAlbum objectForKey:@"song2"];

支援subscripting的蔡淳佳抒情主打歌

 songLabel.text = joiNewAlbum[@"song2"];

說明:
在[ ]內指定key



執行結果:



想要具有Object Subscripting的神奇魔力,其實很簡單,想要像NSArray一樣透過index存取,只要定義以下2兩個method:

- (id)objectAtIndexedSubscript:(NSUInteger);
- (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx;

想要像NSDictionary一樣透過key存取,只要定義以下2兩個method:

- (id)objectForKeyedSubscript:(id)key;
- (void)setObject:(id)object forKeyedSubscript:(id)key;


有一點值得注意的,NSArray和NSDictionary要等到iOS 6 SDK才定義這2個method,因此目前尚未支援iOS 6的Xcode 4.4是無法以[ ] 存取NSArray和NSDictionary裡的元件,只有Xcode 4.5可以。



接下來彼得潘就以Peter Pan的自我介紹為例,說明如何讓自訂類別具有Object Subscripting的神奇魔力。

執行結果:






2012年7月25日 星期三

iOS App 入門開發實戰講座

http://registrano.com/events/6551b2



想要體驗自己的App成為大家日常生活中不可或缺的必需品嗎?想讓你的App在別人手機中佔有一席之地嗎?
Techmemo 過往舉辦過一連串 iOS 講座論壇,已經將 iOS 程式開發的概念與技巧由淺入深的分享給各位學員,頗受各界好評。也吸引了四方的目光。
這次更進一步請到國內知名App的開發者-彼得潘 現身講座,為各位分享/解說App的入門開發流程與不為人知的苦與樂。這位開發者所不但曾幫知名歌手開發專屬 App之外,也曾接過跨國開發案例,更是天瓏出版社 iOS 開發暢銷書作者。
彼得潘這次將為各位詳細解說iOS App的入門開發流程,帶領大家快速入門,從開發環境淺談到實機測試、App如何上架,同時也會帶來與知名歌手合作、跨國開發案例的經驗分享,此次上課內容更是取自於彼得潘所著作iOS 開發暢銷書( 博客來電腦類Top 1, PC Home 電腦/攝影 Top 1, 天瓏Top 1 ),精彩內容絕對不容錯過!
機會難得,名額有限,歡迎正有志於 iOS App 撰寫的開發者一同前來參加此次論壇。

活動日期:
2012/8/25 (六) 13:00 – 19:00
2012/8/26 (日) 13:00 – 19:00

2012年7月23日 星期一

走在時代尖端,搶先安裝iOS 6


雖然彼得潘只是個小小的App開發者,但是新時代的工程師已經不流行做宅男了。彼得潘決定朝著走在時代尖端的方向努力,在2012秋天Apple正式公佈iOS 6前,搶先使用iOS 6,探究最新的iOS 6 SDK開發技術。



1. 下載iOS 6 beta檔案。(.lpsw檔)

如果是付費的iOS開發者,從官方的開發網站即可免費取得最新的iOS 6 beta。如果不是,借助敵人google大神的幫忙,也是沒有辦法中的唯一辦法。記住iOS 6檔案十分挑食,它有著綁定機型的特性,請勿將for iPhone 4s的檔案裝到iPad上。

2. iTunes至少10.6.3以上

3. 連接iPhone和Mac

4. 在iTunes的iPhone頁面,按住option鍵,然後再點選Check for Update,啟動選擇安裝檔案的視窗。


選擇lpsw檔安裝。




彼得潘的iPhone終於升級為iOS 6了。





2012年7月22日 星期日

從App裡寄信的代理人設定

第十七章從App裡寄信的範例,
在設定MFMailComposeViewController的代理人時,
請設定mailComposeDelegate,而非delegate。

原先的錯誤程式碼
   mailController.delegate = self;

正確的程式碼
   mailController.mailComposeDelegate = self;

2012年7月19日 星期四

預覽程式的剪貼生檔大法


平常彼得潘上網看到喜愛的圖片總是喜歡按個右鍵copy,希望書寫完後有空再來好好賞析。然而從前彼得潘只懂copy paste,許多隨意paste的圖片如今已煙消雲散,只殘存於想不起的回憶裡。

但是就在今天,彼得潘終於找到美圖永久保存的方法了。不讓畫皮的轉生術專美於前,透過Mac內建的預覽程式,只要三秒鐘,即可將copy的圖片生成檔案,和硬碟共存亡。接下來彼得潘將示範如何儲存偶像蔡淳佳首張專輯的封面圖片。


1. 檔案 -> 使用剪貼板的內容新增檔案






2. 儲存圖檔







iPhone, iPad通吃的圖檔命名規則

名字取得巧,開發快又好 !  iPhone, iPad雖然有著四種截然不同的解析度,但是只要我們依照以下的命名規則,App在執行時將聰明地選出最適合自己的圖片。

假設圖檔名稱為tarBar.png,程式碼如下:

self.tabBar.backgroundImage = [UIImage imageNamed:@"tarBar.png"];

命名規則:

    (1) iPhone : tarBar.png (320*49)
          普通的iPhone



    (2) iPhone retina: tarBar@2x.png (640*98)
          retina的iPhone, 加 @2x



    (3) iPad: tarBar~ipad.png (768*49)
         普通的iPad, 加 ~ipad



    (4) iPad retina: tarBar@2x~ipad.png (1536*98)
          retina的iPad, 加 @2x~ipad



執行結果:

iPhone


Retina iPhone


iPad





Retina iPad




2012年7月18日 星期三

從iPhone版本變身為iPhone, iPad通吃的Universal

1. 在target的Summary頁面,將Devices設為Universal。


2. 設定iPad版的Icon
    72* 72,  144*144

3. 設定Launch Image
   768*1004 ,  1536*2008


4. 處理UI
    (1) storyboard case

         a. 建立storyboard for iPad

             從原來的 iPhone版本複製  (File -> Duplicate)

         b. 將iPad版的storyboard命名為MainStoryboard_iPad.storyboard

         c. 在target的info頁面新增Main storyboard file base name (iPad)



         d. 編輯MainStoryboard_iPad.storyboard,  Open As -> Source Code
 



            將targetRuntime設為iOS.CocoaTouch.iPad
            ->
           targetRuntime="iOS.CocoaTouch.iPad"

        e. 重新以storyboard格式open MainStoryboard_iPad.storyboard

           此時版面將更新為iPad版面


   (2) xib case

        a. 建立xib for iPad
            從原來的 iPhone版本複製  (File -> Duplicate)

        b. 命名iPad的xib
            ex: ipad版的test.xib 名稱將為 test~ipad.xib

       c.  編輯xib,  Open As -> Source Code
           com.apple.InterfaceBuilder3.CocoaTouch.XIB
           ->
           com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB


           IBCocoaTouchFramework
           ->
          IBIPadFramework


      d. 重新以Interface Builder格式open xib

          編輯view的attribute inspector,將size設為iPad Full Screen


    





2012年7月15日 星期日

讓帶來消暑涼意的雪后露臉吧 - 圖片的裁切和遮罩



Peggy的雪后音樂劇即將在炎熱的8月演出,
為我們帶來消暑的涼意。
為了感謝Peggy,
彼得潘決定在iPhone上宣傳雪后的演出。




執行結果:


想不到雪后的宣傳照太大張了,
足足有849*313 (pixel)
遠超過320*480的iPhone螢幕大小。
因此我們只看到左半邊的演出日期。

宣傳照片裡的最吸引人目光的莫過於可愛的雪后圖案了。
接下來彼得潘將利用圖片裁切的技巧,
特別剪裁出雪后的區塊。





說明:

CGRect rect = CGRectMake(310, 20, 320, 280);
CGImageRef imageRef = CGImageCreateWithImageInRect([imageToCrop CGImage], rect);

利用CGImageCreateWithImageInRect,裁切出原圖大小中,從x, y (310, 20)開始,寬高(320, 280)的長方形區塊。



執行結果:



太好了,雪后終於露臉了!  可惜的是雪后標題還是看不到,不知情的人可能還誤以為這是新版的白雪公主。因此彼得潘決定另外做一個圓形的雪后標題版以正視聽。為了將圖片做成可愛的圓形,在此彼得潘採用mask的技巧。mask的圓形圖片如下,到時候和雪后圖片起化學作用後,將只呈現圓形的部分。(一般做為mask的圖片,顏色將設為黑色。)





說明:


 CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef),
                                        CGImageGetHeight(maskRef),
                                        CGImageGetBitsPerComponent(maskRef),
                                        CGImageGetBitsPerPixel(maskRef),
                                        CGImageGetBytesPerRow(maskRef),
                                        CGImageGetDataProvider(maskRef),
                                        NULL, // decode should be NULL
                                        FALSE // shouldInterpolate
                                        );

 CGImageRef masked = CGImageCreateWithMask(imageRef, mask);


利用CGImageMaskCreate和CGImageCreateWithMask對原圖做mask。


執行結果:




2012年7月10日 星期二

HockeyApp上傳release版流程

1. 下載HockeyMac App來上傳App
https://github.com/codenauts/HockeyMac

2. 上傳App到App Store。

3. 從organizer選擇剛剛上傳的App


    按下滑鼠右鍵後,選擇Show in Finder



4. 從打開的Finder視窗將對應的.xcarchive檔拖拉進HockeyApp



5. 點選upload