代理對象
@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;
以上方法和屬性都是UIPopoverController的3d
方式二:
內容控制器能夠自行設置本身在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];
}