斯坦福大學iOS應用開發教程學習筆記(第七課)Pad和iPhone的通用程序

第七課的主要內容:iPad 和iPhone的通用程序

這節課主要講如何在一個程序裏適配iPad 和iPhone。

內容簡介

1、UIToolbar上面放的都是UIBarButtonItem

可以參考iOS學習之UINavigationController詳解與使用(三)ToolBar

這節課的Demo是把UIToolbar拖放到iPad的故事版的頂部來使用。

2、UISplitViewController

UISplitViewController只能在iPad的storyboard使用。

3、UISplitViewControllerDelegate

Showing and Hiding View Controllers

  • – splitViewController:shouldHideViewController:inOrientation:
  • – splitViewController:willHideViewController:withBarButtonItem:forPopoverController:
  • – splitViewController:willShowViewController:invalidatingBarButtonItem:
  • – splitViewController:popoverController:willPresentViewController:
這幾個代理方法會用到。

有了這些理論知識後,

開始Demo

先得有上節課的材料:Psychologist.zip 的程序。把這個項目下載下來,打開。

在開始弄iPad之前,先解決下下面這個bug.

在前面的課程都是用的iPhone的項目。這次打開源碼後,運行時選擇模擬器選擇iPad。運行後


按command+ ->改變模擬器的方向,上面的的button顯示不大好看,改一下 spring&structs。



這樣在app水平放下時按鈕自動縮放了。

開始通用程序的修改吧

1、修改項目設置爲Universal。

打開項目targets


把原來的MainStoryboard.storyboard改名成:iPhone.storyboard。

對應的targets也改成iPhone.storyboard。

新建一個iPad.storyboard,targets裏添加iPad.storyboard。

2、在iPad.storyboard拖放一個UISplitViewController。

iPad.storyboard裏是一片空白,放進去UISplitViewController好大個傢伙。

後面的table view controller不需要,刪掉。

3、新建RotatableViewController

新建RotatableViewController之後,把iPhone storyboard裏的Psychologist界面拷到iPad.storyboard

然後在navigation Controller上按住control拖到 Psychologist界面上,選擇relationship 爲root view。

把對應的Dr.Pill 和Dr. Freud都拷過來,從兩個按鈕那拖過來選push方式。

把Psychologist的界面的class設置爲:RotatableViewController

RotatableViewController的代碼如下:

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @interface RotatableViewController : UIViewController<UISplitViewControllerDelegate>  
  4.   
  5. @end  

  1. #import "RotatableViewController.h"  
  2. #import "SplitViewBarButtonItemPresenter.h"  
  3.   
  4. @interface RotatableViewController ()  
  5.   
  6. @end  
  7.   
  8. @implementation RotatableViewController  
  9.   
  10.   
  11. - (void)awakeFromNib  
  12. {  
  13.     [super awakeFromNib];  
  14.     self.splitViewController.delegate = self;  
  15. }  
  16.   
  17. - (id <SplitViewBarButtonItemPresenter>)splitViewBarButtonItemPresenter  
  18. {  
  19.     id detailVC = [self.splitViewController.viewControllers lastObject];  
  20.     if (![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]) {  
  21.         detailVC = nil;  
  22.     }  
  23.     return  detailVC;  
  24. }  
  25.   
  26. - (BOOL)splitViewController:(UISplitViewController *)svc  
  27.    shouldHideViewController:(UIViewController *)vc  
  28.               inOrientation:(UIInterfaceOrientation)orientation  
  29. {  
  30.     return [self splitViewBarButtonItemPresenter] ? UIInterfaceOrientationIsPortrait(orientation) :NO;  
  31. }   
  32.   
  33. - (void)splitViewController:(UISplitViewController *)svc  
  34.      willHideViewController:(UIViewController *)aViewController  
  35.           withBarButtonItem:(UIBarButtonItem *)barButtonItem  
  36.        forPopoverController:(UIPopoverController *)pc  
  37. {  
  38.     barButtonItem.title = self.title;  
  39.     [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem;  
  40.       
  41. }  
  42.   
  43. -(void)splitViewController:(UISplitViewController *)svc  
  44.     willShowViewController:(UIViewController *)aViewController  
  45.  invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem  
  46. {  
  47. <pre name="code" class="cpp">    [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = nil;</pre>}- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation{    return YES;}@end  

4、設置HappinessViewController

把iPad.storyboard上最大的detail 的controller設置它的class爲HappinessViewController。

再拖放一個空白的view到上面去,選擇view,設置view的class爲FaceView。

點住Happiness View controller的黃色按鈕,再按住conrtol按鈕拖到view上,選擇faceView。

現在運行看下效果:


運行正常。

不過現在還沒有和它的幸福度關聯起來。

5、關聯幸福度

在PsychologistViewController.m文件裏修改添加如下:

  1. - (HappinessViewController *)splitViewHappinessViewController  
  2. {  
  3.     id hvc = [self.splitViewController.viewControllers lastObject];  
  4.     if (![hvc isKindOfClass:[HappinessViewController class]]) {  
  5.         hvc = nil;  
  6.     }  
  7.     return hvc;  
  8. }  
  9.   
  10. - (void)setAndShowDiagnosis:(int)diagnosis  
  11. {  
  12.     self.diagnosis = diagnosis;  
  13.     if ([self splitViewHappinessViewController]) {  
  14.         [self splitViewHappinessViewController].happiness = diagnosis;  
  15.     }else{  
  16.         [self performSegueWithIdentifier:@"ShowDiagnosis" sender:self];  
  17.     }  
  18. }  
這樣就ok了。

6、添加UIToolbar

在iPad.storyboard大大的view的最上面拖放一UIToolbar ,把item刪掉。關聯代碼裏的toolbar 。

添加一個protocol

新建protocol 

SplitViewBarButtonItemPresenter

  1. #import <UIKit/UIKit.h>  
  2.   
  3. @protocol SplitViewBarButtonItemPresenter <NSObject>  
  4. @property (nonatomic, strong) UIBarButtonItem *splitViewBarButtonItem;  
  5. @end  


HappinessViewController .h

  1. #import <UIKit/UIKit.h>  
  2. #import "SplitViewBarButtonItemPresenter.h"  
  3.   
  4. @interface HappinessViewController : UIViewController<SplitViewBarButtonItemPresenter>  
  5.   
  6. @property (nonatomic) int happiness;  // 0 is sad; 100 is very happy  
  7.   
  8. @end  

HappinessViewController實現協議。

  1. #import "HappinessViewController.h"  
  2. #import "FaceView.h"  
  3.   
  4. @interface HappinessViewController() <FaceViewDataSource>  
  5. @property (nonatomic, weak) IBOutlet FaceView *faceView;  
  6. @property (nonatomic, weak) IBOutlet UIToolbar *toolbar;  
  7. @end  
  8.   
  9. @implementation HappinessViewController  
  10.   
  11. @synthesize happiness = _happiness;  
  12. @synthesize faceView = _faceView;  
  13. @synthesize splitViewBarButtonItem = _splitViewBarButtonItem;  
  14. @synthesize toolbar = _toolbar;  
  15.   
  16. - (void)setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem  
  17. {  
  18.     if (_splitViewBarButtonItem != splitViewBarButtonItem) {  
  19.         NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy];  
  20.         if (_splitViewBarButtonItem) {  
  21.             [toolbarItems removeObject:_splitViewBarButtonItem];  
  22.         }  
  23.         if (splitViewBarButtonItem) {  
  24.             [toolbarItems insertObject: splitViewBarButtonItem atIndex:0 ];  
  25.         }  
  26.         self.toolbar.items = toolbarItems;  
  27.         _splitViewBarButtonItem = splitViewBarButtonItem;  
  28.     }  
  29. }  
  30. //.......  

運行,看下效果:

 

看到toolbar了,可以點它展開左邊的欄。可以按 command+ 方向鍵來跳轉模擬器的放下看效果。

這是跟着視頻做好的代碼 http://download.csdn.net/detail/totogo2010/4927845

容芳志 (http://blog.csdn.net/totogo2010)

本文遵循“署名-非商業用途-保持一致”創作公用協議

原文地址:http://blog.csdn.net/totogo2010/article/details/8434471

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章