菜單控制器和菜單項:彈出自定義的菜單欄窗口
提示:
1. Menu所處的View必須實現 – (BOOL)canBecomeFirstResponder, 且返回YES
2. Menu所處的View必須實現 – (BOOL)canPerformAction:withSender, 並根據需求返回YES或NO
3. 必須使Menu所處的View或viewController的self成為First Responder (becomeFirstResponder)
4. 定位Menu (- setTargetRect:inView:)
5. 展示Menu (- setMenuVisible:animated:)
菜單上的箭頭指向風格枚舉:
typedef NS_ENUM(NSInteger, UIMenuControllerArrowDirection) {
UIMenuControllerArrowDefault,
UIMenuControllerArrowUp,
UIMenuControllerArrowDown,
UIMenuControllerArrowLeft,
UIMenuControllerArrowRight,
};
菜單控制器類:
@interface UIMenuController : NSObject
※默認是UIMenuControllerArrowDefault風格
@property(nonatomic) UIMenuControllerArrowDirection arrowDirection ;
※菜單項數組
@property(nonatomic,copy) NSArray *menuItems ;
※菜單矩形坐標系
@property(nonatomic,readonly) CGRect menuFrame;
※菜單是否可見,默認不可見
@property(nonatomic,getter=isMenuVisible) BOOL menuVisible; // default is NO
※創建菜單控制器對象的類方法
+ (UIMenuController *)sharedMenuController;
※設置菜單可見性和是否動畫
- (void)setMenuVisible:(BOOL)menuVisible animated:(BOOL)animated;
※設置菜單在目標視圖中的矩陣坐標
- (void)setTargetRect:(CGRect)targetRect inView:(UIView *)targetView;
※更新
- (void)update;
菜單的一些通知:
※將要顯示菜單的通知
UIKIT_EXTERN NSString *const UIMenuControllerWillShowMenuNotification;
※已經顯示菜的通知
UIKIT_EXTERN NSString *const UIMenuControllerDidShowMenuNotification;
※將要隱藏菜單的通知
UIKIT_EXTERN NSString *const UIMenuControllerWillHideMenuNotification;
※已經隱藏菜單的通知
UIKIT_EXTERN NSString *const UIMenuControllerDidHideMenuNotification;
※已經改變菜單的通知
UIKIT_EXTERN NSString *const UIMenuControllerMenuFrameDidChangeNotification;
菜單項類:
@interface UIMenuItem : NSObject
※菜單項名
@property(nonatomic,copy) NSString *title;
※菜單項事件
@property(nonatomic)SEL action;
※創建菜單項對象,並添加事件和名字
- (instancetype)initWithTitle:(NSString *)title action:(SEL)action;
重點:
要想顯示彈出菜單,必須實現3個方法,缺一不可:
- becomFirstResponder方法,使view或者viewController的self成為第一響應者,可以在相應文件的任意地方調用實現該方法,不過建議與UIMenuController放在一起。
[self becomeFirstResponder];
- 設置-(BOOL) canBecomeFirstResponder的返回值為YES,原因不言而喻。
-(BOOL) canBecomeFirstResponder{
return YES;
}
重載函數-(BOOL) canPerfomAction:(SEL)action withSender:(id)sender,設置要顯示的菜單項,返回值為YES。若不進行任何限制,則將顯示系統自帶的所有菜單項(其他很多的,自己可以 試一下),例如:
-(BOOL) canPerformAction:(SEL)action withSender:(id)sender
{
if (action == @selector(menuItem1Pressed:) || action ==@selector(menuItem2Pressed:) ||
action == @selector(menuItem3Pressed:) || action ==@selector(menuItem4Pressed:))
{
return YES; //顯示菜單項
}
return NO; //隱藏系統默認的菜單項
}
至於相應的菜單響應通過各selector函數來實現,如:
- (IBAction) menuItem1Pressed:(id)sender
{
txtInputLabel.text = @”helleo world″;
[[UIMenuController sharedMenuController] setMenuVisible:NO animated:YES];
}
如果將系統默認的菜單也顯示出來,那么自定義的菜單將作為第二菜單,調用菜單時默認顯示的是第一菜單,如果要直接顯示第二菜單,可以先設置菜單可見性為NO即可:
[popMenu setMenuVisible:NO animated:YES];
舉例如下:
1.創建按鈕並設置必要的屬性和事件
//創建按鈕並設置相關屬性 UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(165, 255, 40, 40)]; //設置圓角 [btn.layer setMasksToBounds:YES]; btn.layer.cornerRadius = 8.0; //設置標題 [btn setTitle:@"設置" forState:UIControlStateNormal]; //背景顏色 btn.backgroundColor = [UIColor purpleColor]; //添加事件 [btn addTarget:self action:@selector(CreateMenu) forControlEvents:UIControlEventTouchUpInside]; //加入視圖中 [self.view addSubview:btn];
2.執行按鈕事件,創建菜單
#pragma mark -按鈕事件 -(void)CreateMenu { //創建菜單控制器對象 UIMenuController *menu = [UIMenuController sharedMenuController]; //創建自定義的三個菜單項 UIMenuItem *CutItem = [[UIMenuItem alloc]initWithTitle:@"剪貼" action:@selector(Cut:)]; UIMenuItem *copyItem = [[UIMenuItem alloc]initWithTitle:@"復制" action:@selector(Copy:)]; UIMenuItem *pasteItem = [[UIMenuItem alloc]initWithTitle:@"粘貼" action:@selector(Paste:)]; //設置菜單控制器箭頭風格(朝上) menu.arrowDirection = UIMenuControllerArrowUp; //設置菜單控制器可見 [menu setMenuVisible:YES]; //給菜單控制器定位 [menu setTargetRect:CGRectMake(10, 256, 350, 40) inView:self.view]; //設置第一響應者 [self becomeFirstResponder]; //設置菜單項數組 NSArray *Items = @[copyItem,pasteItem,CutItem]; //將菜單項加入到菜單控制器中 [menu setMenuItems:Items]; }
3.重寫 – (BOOL)canBecomeFirstResponder和– (BOOL)canPerformAction:withSender方法,顯示自定義菜單
#pragma mark -實現必須的方法 //設置可以成為第一響應者 -(BOOL)canBecomeFirstResponder { return YES; } //設置要顯示的菜單項 -(BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(Cut:) || action == @selector(Copy:) || action == @selector(Paste:)) { return YES; //顯示自定義的菜單項 } return NO; //隱藏系統默認的菜單項 }
4.執行菜單項的方法
#pragma mark -菜單項執行方法 //剪切 -(void)Cut:(UIMenuItem *)sender { NSLog(@"剪貼成功"); } //復制 -(void)Copy:(UIMenuItem *)sender { NSLog(@"復制成功"); } //粘貼 -(void)Paste:(UIMenuItem *)sender { NSLog(@"粘貼成功"); }
5、演示截圖如下:(箭頭方向可以根據菜單的位置frame設置)
點擊復制時:
2015-10-08 20:26:08.150 菜單控制器和菜單項[5850:321636] 復制成功
點擊粘貼時:
2015-10-08 20:26:10.039 菜單控制器和菜單項[5850:321636] 粘貼成功
點擊剪貼時:
2015-10-08 20:26:11.878 菜單控制器和菜單項[5850:321636] 剪貼成功