第七課的主要內容: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的代碼如下:
- #import <UIKit/UIKit.h>
- @interface RotatableViewController : UIViewController<UISplitViewControllerDelegate>
- @end
- #import "RotatableViewController.h"
- #import "SplitViewBarButtonItemPresenter.h"
- @interface RotatableViewController ()
- @end
- @implementation RotatableViewController
- - (void)awakeFromNib
- {
- [super awakeFromNib];
- self.splitViewController.delegate = self;
- }
- - (id <SplitViewBarButtonItemPresenter>)splitViewBarButtonItemPresenter
- {
- id detailVC = [self.splitViewController.viewControllers lastObject];
- if (![detailVC conformsToProtocol:@protocol(SplitViewBarButtonItemPresenter)]) {
- detailVC = nil;
- }
- return detailVC;
- }
- - (BOOL)splitViewController:(UISplitViewController *)svc
- shouldHideViewController:(UIViewController *)vc
- inOrientation:(UIInterfaceOrientation)orientation
- {
- return [self splitViewBarButtonItemPresenter] ? UIInterfaceOrientationIsPortrait(orientation) :NO;
- }
- - (void)splitViewController:(UISplitViewController *)svc
- willHideViewController:(UIViewController *)aViewController
- withBarButtonItem:(UIBarButtonItem *)barButtonItem
- forPopoverController:(UIPopoverController *)pc
- {
- barButtonItem.title = self.title;
- [self splitViewBarButtonItemPresenter].splitViewBarButtonItem = barButtonItem;
- }
- -(void)splitViewController:(UISplitViewController *)svc
- willShowViewController:(UIViewController *)aViewController
- invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
- {
- <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文件裏修改添加如下:
- - (HappinessViewController *)splitViewHappinessViewController
- {
- id hvc = [self.splitViewController.viewControllers lastObject];
- if (![hvc isKindOfClass:[HappinessViewController class]]) {
- hvc = nil;
- }
- return hvc;
- }
- - (void)setAndShowDiagnosis:(int)diagnosis
- {
- self.diagnosis = diagnosis;
- if ([self splitViewHappinessViewController]) {
- [self splitViewHappinessViewController].happiness = diagnosis;
- }else{
- [self performSegueWithIdentifier:@"ShowDiagnosis" sender:self];
- }
- }
6、添加UIToolbar
在iPad.storyboard大大的view的最上面拖放一UIToolbar ,把item刪掉。關聯代碼裏的toolbar 。
添加一個protocol
新建protocol
SplitViewBarButtonItemPresenter
- #import <UIKit/UIKit.h>
- @protocol SplitViewBarButtonItemPresenter <NSObject>
- @property (nonatomic, strong) UIBarButtonItem *splitViewBarButtonItem;
- @end
HappinessViewController .h
- #import <UIKit/UIKit.h>
- #import "SplitViewBarButtonItemPresenter.h"
- @interface HappinessViewController : UIViewController<SplitViewBarButtonItemPresenter>
- @property (nonatomic) int happiness; // 0 is sad; 100 is very happy
- @end
HappinessViewController實現協議。
- #import "HappinessViewController.h"
- #import "FaceView.h"
- @interface HappinessViewController() <FaceViewDataSource>
- @property (nonatomic, weak) IBOutlet FaceView *faceView;
- @property (nonatomic, weak) IBOutlet UIToolbar *toolbar;
- @end
- @implementation HappinessViewController
- @synthesize happiness = _happiness;
- @synthesize faceView = _faceView;
- @synthesize splitViewBarButtonItem = _splitViewBarButtonItem;
- @synthesize toolbar = _toolbar;
- - (void)setSplitViewBarButtonItem:(UIBarButtonItem *)splitViewBarButtonItem
- {
- if (_splitViewBarButtonItem != splitViewBarButtonItem) {
- NSMutableArray *toolbarItems = [self.toolbar.items mutableCopy];
- if (_splitViewBarButtonItem) {
- [toolbarItems removeObject:_splitViewBarButtonItem];
- }
- if (splitViewBarButtonItem) {
- [toolbarItems insertObject: splitViewBarButtonItem atIndex:0 ];
- }
- self.toolbar.items = toolbarItems;
- _splitViewBarButtonItem = splitViewBarButtonItem;
- }
- }
- //.......
運行,看下效果:
看到toolbar了,可以點它展開左邊的欄。可以按 command+ 方向鍵來跳轉模擬器的放下看效果。
這是跟着視頻做好的代碼 http://download.csdn.net/detail/totogo2010/4927845
容芳志 (http://blog.csdn.net/totogo2010)
本文遵循“署名-非商業用途-保持一致”創作公用協議
原文地址:http://blog.csdn.net/totogo2010/article/details/8434471