2012年2月16日 星期四

[objective C] iPhone 轉 Universal

最近要練習將以前寫的iPhone 程式轉換為Universal 型態,Universal其實就是指可以同時在iPhone 和 iPad裝置上安裝使用,可以針對不同裝置的顯現樣板,在同一個專案裡同時被實現。如果你的APP要比較有遠景的話,這是必須的。

這時後就很慶幸開發方式是標準的MVC架構,我可以設定iPhone.xib與iPad.xib共用同一個class,這樣內部的程式就不需要全部改寫。

一、設定專案型態為Universal:
       專案的Targets/Summary/Devices ,改為Universal。

二、新增iPad.xib 且要共同原來的class:
        1.新增new file,選擇"UIViewController subclass",請注意要勾選 「Targeted for iPad」,取名可以是「原名-iPad」比較好分辨。
        2.刪除 *-iPad.h 和 *-iPad.m 。
        3.點選 *-iPad.xib,再選取它的 File's Owner,將Custom Class 由「原名-iPad」改為[原名],這個是很重要的步驟,因為 *-iPad.xib 就會和 *-iPhone.xib 共用同一個Class。

三、從 .m 檔用程式判斷目前的裝置,再決定要載入 *-iPad.xib 或 *-iPhone.xib 以顯示不同的畫面。

NewsViewController *plvc = nil;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone
        plvc = [[NewsViewController alloc] initWithNibName:@"NewsViewController" bundle:nil];
    else
        plvc = [[NewsViewController alloc] initWithNibName:@"NewsViewController-iPad" bundle:nil];


接下來也是練功的部份,我也要加油!

YES! 又多學到一手了~









    2012年2月9日 星期四

    [objective C] UIPickerView

    UIPickerView 物件的使用為例,這樣種有特定資料的互動,它可以把字串回傳給選擇器,然後顯示於畫面。許多控制項都有屬於自己的delegate及datasource。

    [Datasource]

    提供在控制項與它需要展示之資料間的橋樑。控制項會問datasource它需要什麼,datasource則負責以控制項期望的格式提供資訊。

    遵循 UIPickerViewDatasource協定。
    需在*.m實作的方法:

    - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component



    [Delegate]

    delegate負責元素的行為。


    遵循 UIPickerViewDelegate協定。
    需在*.m實作的方法:
    - (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
    - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component




    [Protocol]
    在 .h 檔要註明需遵守的協定:

    @interface ViewController : UIViewController<UIPickerViewDataSource, UIPickerViewDelegate>


    最後別忘了在 XIB 檔幫 UIPickerView 和 File's Owner 連結delegate及datasource。如果少了一個步驟都有可能出錯,可能執行後在編譯器沒有看到PickerView物件,或是一編譯就直接當掉。

    希望我可以記下來,下次應用在別的物件! Peggy加油~

    2012年2月7日 星期二

    [objective C] UIEdgeInsetsMake 拉伸操作的部分的大小


    UIEdgeInsetsMake(0,0,0,0)指定了不進行拉伸操作的部分的大小,顺序是上、左、下、右4个边。
    scrollView.contentInset = UIEdgeInsetsMake( 0.0f, 0.0f, 60.0f, 0.0f);
    這樣就是往下拉的時後有60的間距,往上、左、右都沒有間距。
    
    

    [objective C] CALayer - UILabel 的垂直翻轉


    [CALayer]




    //宣告image物件
    UIImage *aImage = [UIImage imageNamed:@"myPhoto.jpg"];
    //使用"layer" class method建立CALayer物件
    CALayer *layer1 = [CALayer layer];
    //設定CALayer的frame大小
    layer1.frame = CGRectMake(110, 20, 100, 66);
    //設定CALayer的內容為image物件
    layer1.contents = (id)aImage.CGImage;
    //將CALayer置入view
    [self.view.layer addSublayer:layer1];
    //以下用同樣方式設定大小不同的CALayer
    CALayer *layer2 = [CALayer layer];
    layer2.frame = CGRectMake(85, 106, 150, 100);
    layer2.contents = (id)aImage.CGImage;
    [self.view.layer addSublayer:layer2];
    CALayer *layer3 = [CALayer layer];
    layer3.frame = CGRectMake(0, 226, 320, 213);
    layer3.contents = (id)aImage.CGImage;
    [self.view.layer addSublayer:layer3];


    UILabel 的垂直翻轉


    label.layer.transform = CATransform3DMakeRotation(M_PI, 1.0f, 0.0f, 0.0f);