iOS:iPad和iPhone開發的異同(UIPopoverController、UISplitViewController)

iPad和iPhone開發的異同ios


一、iPhone和iPad:
niPhone是手機,iPad、iPad Mini是平板電腦
iPhone和iPad開發的區別
屏幕的尺寸 \分辨率
UI元素的排布 \設計
鍵盤
API
屏幕方向的支持
 
二、屏幕的尺寸 \分辨率
 
 
三、iPad特有的API
iPad多了一些特有的類,好比:
pUIPopoverController(左圖)
pUISplitViewController(右圖)
 
四、屏幕方向的支持
 
五、開發細節
 
六、UIPopoverController簡介
什麼是UIPopoverController
是iPad開發中常見的一種控制器(在iPhone上不容許使用)
跟其餘控制器不同的是,它直接繼承自NSObject,並不是繼承自UIViewController
它只佔用部分屏幕空間來呈現信息,並且顯示在屏幕的最前面
例如:
 
經常使用屬性
代理對象

@property (nonatomic, assign) id <UIPopoverControllerDelegate> delegate;數組

是否可見

@property (nonatomic, readonly, getter=isPopoverVisible) BOOL popoverVisible;app

箭頭方向

@property (nonatomic, readonly) UIPopoverArrowDirection popoverArrowDirection;ide

關閉popover(讓popover消失)

- (void)dismissPopoverAnimated:(BOOL)animated;動畫

使用步驟
要想顯示一個UIPopoverController,須要通過下列步驟
<1>設置內容控制器
因爲UIPopoverController直接繼承自NSObject,不具有可視化的能力
所以UIPopoverController上面的內容必須由另一個繼承自UIViewController的控制器來提供,這個控制器稱爲「內容控制器」
 
設置內容控制器有3種方法
//在初始化UIPopoverController的時候傳入一個內容控制器

- (id)initWithContentViewController:(UIViewController *)viewController;atom

//設置屬性時設置內容控制器spa

@property (nonatomic, retain) UIViewController *contentViewController;
//經過實例方法設置內容控制器
- (void)setContentViewController:(UIViewController *)viewController animated:(BOOL)animated;

以上方法和屬性都是UIPopoverController設計

  

<2>設置內容的尺寸
顯示出來佔據多少屏幕空間
 
設置內容的尺寸有2種方法
方式一:
@property (nonatomic) CGSize popoverContentSize;
- (void)setPopoverContentSize:(CGSize)size animated:(BOOL)animated;

以上方法和屬性都是UIPopoverController3d

 

方式二:
內容控制器能夠自行設置本身在popover中顯示的尺寸
p在iOS 7以前

@property (nonatomic,readwrite) CGSize contentSizeForViewInPopover;代理

p從iOS 7開始

@property (nonatomic) CGSize preferredContentSize;

以上屬性都是UIViewController

 
<3>設置顯示的位置
從哪一個地方冒出來
 
設置顯示的位置有2種方法
 
方法一:圍繞着一個UIBarButtonItem顯示(箭頭指定那個UIBarButtonItem)
-(void)presentPopoverFromBarButtonItem:(UIBarButtonItem *)item permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;
item :圍繞着哪一個UIBarButtonItem顯示
arrowDirections :箭頭的方向
animated :是否經過動畫顯示出來
 
方法二:圍繞着某一塊特定區域顯示(箭頭指定那塊特定區域)
- (void)presentPopoverFromRect:(CGRect)rect inView:(UIView *)view permittedArrowDirections:(UIPopoverArrowDirection)arrowDirections animated:(BOOL)animated;rect :指定箭頭所指區域的矩形框範圍(位置和尺寸)
view :rect參數是以view的左上角爲座標原點(0,0)
arrowDirections :箭頭的方向
animated :是否經過動畫顯示出來
 
拓展:
若是想讓箭頭指向某一個UIView的作法有2種作法,好比指向一個button
方法1
[popover presentPopoverFromRect:button.bounds inView:button permittedArrowDirections:
  UIPopoverArrowDirectionDown animated:YES];

 方法2

[popover presentPopoverFromRect:button.frame inView:button.superview permittedArrowDirections:
 UIPopoverArrowDirectionDown animated:YES];

 

 
<4>常見報錯
在popover的使用過程當中,常常會遇到這個錯誤
-[UIPopoverController dealloc] reached while popover is still visible.
錯誤的大致意思是:popover在仍舊可見的時候被銷燬了(調用了dealloc)
 
從錯誤能夠得出的結論
當popover仍舊可見的時候,不許銷燬popover對象
在銷燬popover對象以前,必定先讓popover消失(不可見)
 
<5>防止點擊UIPopoverController區域外消失
默認狀況下
只要UIPopoverController顯示在屏幕上,UIPopoverController背後的全部控件默認是不能跟用戶進行正常交互的
點擊UIPopoverController區域外的控件,UIPopoverController默認會消失
 
要想點擊UIPopoverController區域外的控件時不讓UIPopoverController消失,解決辦法是設置passthroughViews屬性
@property (nonatomic, copy) NSArray *passthroughViews;
這個屬性是設置當UIPopoverController顯示出來時,哪些控件能夠繼續跟用戶進行正常交互。這樣的話,點擊區域外的控件就不會讓UIPopoverController消失了
 
<6>如何iPhone中實現popover的效果
UIPopoverController這個類是隻能用在iPad中的
 
要想在iPhone中實現popover效果,必須得自定義view,能夠參考
 
 
七、分割控制器UISplitViewController的簡介
<1>介紹
Split View一般只是一個基本元素,它填滿整個屏幕,不可能把Split View放到其餘什麼的內部,通常狀況下是提供給整個app的。
Split View有兩個ViewControllers,一個左側一個右側,左側叫Master,右側叫Detail。
SplitViewController有 一個property叫作ViewControllers,它是一個數組,這個數組有兩個元素,左側和右側,左側是元素0,右側是元素1
@property (nonatomic, copy) NSArray *viewControllers;
 
 
<2>代理方法:Split View不能沒有delegate,若是沒有設置delegate,那麼當Split View進入Portrait模式的時候左側就會消失,你應該在角落裏放一個小按鈕,使用戶能夠點擊它來讓左側出現
a.-  (BOOL)splitViewController: (UISplitViewController *) sender

   shouldHideViewController:(UIViewController *)master inOrientation:(UIInterfaceOrientation)orientation

    {

           return YES; // always hide it

    }

b.- (BOOL)splitViewController:(UISplitViewController *)sender shouldHideViewController:(UIViewController*)master   inOrientation:(UIInterfaceOrientation)orientation

    {

          return UIInterfaceOrientationIsPortrait(orientation);

    }

c.-(void)splitViewController:(UISplitViewController *)sender  willHideViewController:(UIViewController*)master   withBarButtonItem:(UIBarButtonItem *)barButtonItem  forPopoverController:(UIPopoverController *)popover

   {      

        barButtonItem.title = @「Master」;

       [detailViewController setSplitViewBarButtonItem:barButtonItem];

   }

d.-(void)splitViewController:(UISplitViewController *)sender  willShowViewController:(UIViewController*)master   invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem

  { 

     // removeSplitViewBarButtonItem: must remove the bar button from its toolbar   

      [detailViewController removeSplitViewBarButtonItem:nil];

   }

相關文章
相關標籤/搜索