UIMenuController

UIMenuController的示例spa

 

UIMenuController須知orm

  • 默認狀況下, 有如下控件已經支持UIMenuController
    • UITextField
    • UITextView
    • UIWebView

讓其餘控件也支持UIMenuController(好比UILabel)get

  • 自定義UILabel
  • 重寫2個方法

```objc /* * label有資格成爲第一響應者/ - (BOOL)canBecomeFirstResponder { return YES; }string

/* * label能執行哪些操做(好比copy, paste等等) * @return YES:支持這種操做/ - (BOOL)canPerformAction:(SEL)action withSender:(id)sender { if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) return YES;it

return NO;io

} ```ast

  • 實現各類操做方法

```objc - (void)cut:(UIMenuController *)menu { // 將本身的文字複製到粘貼板 [self copy:menu];form

// 清空文字class

self.text = nil;cli

}

  • (void)copy:(UIMenuController )menu { // 將本身的文字複製到粘貼板 UIPasteboard board = [UIPasteboard generalPasteboard]; board.string = self.text; }
  • (void)paste:(UIMenuController )menu { // 將粘貼板的文字複製到本身身上 UIPasteboard board = [UIPasteboard generalPasteboard]; self.text = board.string; } ```
  • label成爲第一響應者

objc // 這裏的selflabel [self becomeFirstResponder];

  • 顯示UIMenuController

objc UIMenuController *menu = [UIMenuController sharedMenuController]; // targetRect: MenuController須要指向的矩形框 // targetView: targetRect會以targetView的左上角爲座標原點 [menu setTargetRect:self.bounds inView:self]; // [menu setTargetRect:self.frame inView:self.superview]; [menu setMenuVisible:YES animated:YES];

自定義UIMenuController內部的Item

  • 添加item

objc // 添加MenuItem(點擊item, 默認會調用控制器的方法) UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"" action:@selector(ding:)]; UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回覆" action:@selector(replay:)]; UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"舉報" action:@selector(report:)]; menu.menuItems = @[ding, replay, report];  

 

 

 

代碼示例

1、讓label有menu,須要自定義label

- (void)awakeFromNib

{

    [self setup];

}

- (instancetype)initWithFrame:(CGRect)frame

{

    if (self = [super initWithFrame:frame]) {

        [self setup ];

    }

    return self;

}

 

- (void)setup

{

    //label必定要能夠交互

    self.userInteractionEnabled = YES;

    [self addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(click)]];

}

 

/**

 *  label有資格成爲第一響應者

 */

- (BOOL)canBecomeFirstResponder

{

    return YES;

}

/**

 *  label能執行哪一個操做(好比copypaste)等

 */

- (BOOL)canPerformAction:(SEL)action withSender:(id)sender

{

    //只返回YES支持全部操做

    if (action == @selector(cut:) || action == @selector(copy:) || action == @selector(paste:)) {

        return YES;

    }

    

//    自定義menu的時候,這裏放回NO就好了

    return NO;

}

/**

 *  剪切方法

 */

- (void)cut:(UIMenuController *)menu

{   

    //將文字保存到粘貼板

    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];

    pasteBoard.string = self.text;

    

    //清空label的文字

    self.text = nil;

}

- (void)copy:(UIMenuController *)menu

{

    //將文字保存到粘貼板

    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];

    pasteBoard.string = self.text;

    

}

// 粘貼

- (void)paste:(UIMenuController *)menu

{

    //將文字保存到粘貼板

    UIPasteboard *pasteBoard = [UIPasteboard generalPasteboard];

    self.text = pasteBoard.string;

}

 

 

 

 

- (void)click

{

    //1、讓label成爲第一響應者

    [self becomeFirstResponder];

    

    //2、顯示MenuController

    UIMenuController *menu = [UIMenuController sharedMenuController];

    //menu圍着哪一個區域顯示,顯示上下左右由系統決定

    //[menu setTargetRect:self.frame inView:self.superview];

    //或者

    [menu setTargetRect:self.bounds inView:self];

    

    //自定義menu

    

 

    //顯示menu菜單

    [menu setMenuVisible:YES animated:YES];

}

 

 

2、自定義menu

UILabel *secondLabel = [[UILabel alloc] init];

    secondLabel.frame = CGRectMake(100, 200, 100, 50);

    secondLabel.backgroundColor = [UIColor yellowColor];

    [secondLabel addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(clickPP)]];

    secondLabel.text = @"ppppppp";

    secondLabel.userInteractionEnabled = YES;

    self.label = customLabel;

    [self.view addSubview:secondLabel];

    self.label = secondLabel;

 

- (void)clickPP

{

    //1、讓label成爲第一響應者

    [self becomeFirstResponder];

    

    //2、顯示MenuController

    UIMenuController *menu = [UIMenuController sharedMenuController];

    //menu圍着哪一個區域顯示,顯示上下左右由系統決定

    //[menu setTargetRect:self.frame inView:self.superview];

    //或者

    [menu setTargetRect:self.label.bounds inView:self.label];

    

    //自定義menu

    //自定義menu的按鈕方法必須放在控制器中

    UIMenuItem *ding = [[UIMenuItem alloc] initWithTitle:@"" action:@selector(ding:)];

    UIMenuItem *replay = [[UIMenuItem alloc] initWithTitle:@"回覆" action:@selector(replay:)];

    UIMenuItem *report = [[UIMenuItem alloc] initWithTitle:@"舉報" action:@selector(report:)];

    menu.menuItems = @[ding,replay,report];

    //顯示menu菜單

    [menu setMenuVisible:YES animated:YES];

}

 

/**

 *  label有資格成爲第一響應者

 */

- (BOOL)canBecomeFirstResponder

{

    return YES;

}

 

 

/**

 * 

 */

- (void)ding:(UIMenuController *)meun

{

    NSLog(@"ding");

}

 

/**

 * 

 */

- (void)replay:(UIMenuController *)meun

{

     NSLog(@"replay");

}

 

/**

 * 

 */

- (void)report:(UIMenuController *)meun

{

     NSLog(@"report");

}

相關文章
相關標籤/搜索