iOS:菜單控制器和菜單項:UIMenuController和UIMenuItem


菜單控制器和菜單項:彈出自定義的菜單欄窗口

提示:

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個方法,缺一不可:

  1. becomFirstResponder方法,使view或者viewController的self成為第一響應者,可以在相應文件的任意地方調用實現該方法,不過建議與UIMenuController放在一起。

    [self becomeFirstResponder];

  2. 設置-(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] 剪貼成功

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM