UIMenuController的使用,对UILabel拷贝以及定制菜单

1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES

2. Menu所处的View必须实现 – (BOOL)canPerformAction:withSender, 并根据需求返回YES或NO

3. 使Menu所处的View成为First Responder (becomeFirstResponder)

4. 定位Menu (- setTargetRect:inView:)

  1. 展示Menu (- setMenuVisible:animated:)

[obj-c]
@implementation UICopyLabel

// default is NO

  • (BOOL)canBecomeFirstResponder{

return YES;

}

//"反馈"关心的功能

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

return (action == @selector(copy:));

}

//针对于copy的实现

-(void)copy:(id)sender{

UIPasteboard *pboard = [UIPasteboard generalPasteboard];

pboard.string = self.text;

}

//UILabel默认是不接收事件的,我们需要自己添加touch事件

-(void)attachTapHandler{

self.userInteractionEnabled = YES; //用户交互的总开关

UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];

touch.numberOfTapsRequired = 2;

[self addGestureRecognizer:touch];

[touch release];

}

//绑定事件

  • (id)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

[self attachTapHandler];

}

return self;

}

//同上

-(void)awakeFromNib{

[super awakeFromNib];

[self attachTapHandler];

}

-(void)handleTap:(UIGestureRecognizer*) recognizer{

[self becomeFirstResponder];

UIMenuController *menu = [UIMenuController sharedMenuController];

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

[menu setMenuVisible:YES animated:YES];

}

@end

[/obj-c]

在view里添加一个UICopyLabel

现在可以使用UICopyLabel实现双击来对label的内容copy了

在你的view中

UICopyLabel *display = [[UICopyLabelalloc]initWithFrame:CGRectMake(30,100,250,30)];

 

awakeFromNib

在使用IB的时候才会涉及到此方法的使用,当.nib文件被加载的时候,会发送一个awakeFromNib的消息到.nib文件中的每个对象,每个对象都可以定义自己的awakeFromNib函数来响应这个消息,执行一些必要的操作。

看例子:

创建一个viewController with XIB

定义一个UIView的子类

打开xib,并把View的类型指定为上一步骤定义的子类

然后在TestView.m中加入** awakeFromNib方法,运行程序发现此方法被调用了!!!**

下面我们来定制菜单

在attachTapHandler中添加长按压手势

 

  1. -(void)attachTapHandler{
  2. self.userInteractionEnabled = YES; //用户交互的总开关
  3. //双击
  4. UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
  5. touch.numberOfTapsRequired = 2;
  6. [self addGestureRecognizer:touch];
  7. [touch release];
    1. //长按压
  8. UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
  9. press.minimumPressDuration = 1.0;
  10. [self addGestureRecognizer:press];
  11. [press release];
    1. }
 

添加方法longPress

    • (void)longPress:(UILongPressGestureRecognizer *)recognizer {
  1. if (recognizer.state == UIGestureRecognizerStateBegan) {

  2. // TSTableViewCell *cell = (TSTableViewCell *)recognizer.view;

  3. [self becomeFirstResponder];

  4. UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@”Flag” action:@selector(flag:)];

  5. UIMenuItem *approve = [[UIMenuItem alloc] initWithTitle:@”Approve” action:@selector(approve:)];

  6. UIMenuItem *deny = [[UIMenuItem alloc] initWithTitle:@”Deny” action:@selector(deny:)];

    1. UIMenuController *menu = [UIMenuController sharedMenuController];
  7. [menu setMenuItems:[NSArray arrayWithObjects:flag, approve, deny, nil]];

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

  9. [menu setMenuVisible:YES animated:YES];

  10. NSLog(@”menuItems:%@”,menu.menuItems);

  11. }

  12. }

      • (void)flag:(id)sender {
  13. NSLog(@”Cell was flagged”);

  14. }

      • (void)approve:(id)sender {
  15. NSLog(@”Cell was approved”);

  16. }

      • (void)deny:(id)sender {
  17. NSLog(@”Cell was denied”);

  18. }

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

  • // return (action == @selector(copy:));

  • if (action == @selector(copy:)||action == @selector(flag:)||action == @selector(approve:)||action == @selector(deny:)) {

  • return YES;

  • }

  • }

  •  

    ok。。。效果如图

    Share Comments