您的位置:首页 > 产品设计 > UI/UE

UIMenuController的使用,对UILabel拷贝以及定制菜单 .posted on 2013-03-18 16:20

2015-11-09 14:43 369 查看
1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES

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

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

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

 

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

 

 

@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 generalPasteboar
4000
d];    

    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  

@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

 

在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方法,运行程序发现此方法被调用了!!!

 

 

下面我们来定制菜单

在[b]attachTapHandler中添加长按压手势[/b]

 

 

-(void)attachTapHandler{    

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

    //双击   

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

    touch.numberOfTapsRequired = 2;    

    [self addGestureRecognizer:touch];   

     [touch release];   

      

    //长按压   

    UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];  

    press.minimumPressDuration = 1.0;  

    [self addGestureRecognizer:press];  

    [press release];  

      

}   

-(void)attachTapHandler{
self.userInteractionEnabled = YES;  //用户交互的总开关
//双击
UITapGestureRecognizer *touch = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTap:)];
touch.numberOfTapsRequired = 2;
[self addGestureRecognizer:touch];
[touch release];

//长按压
UILongPressGestureRecognizer *press = [[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longPress:)];
press.minimumPressDuration = 1.0;
[self addGestureRecognizer:press];
[press release];

}


添加方法longPress

 

- (void)longPress:(UILongPressGestureRecognizer *)recognizer {  

if (recognizer.state == UIGestureRecognizerStateBegan) {  

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

        [self becomeFirstResponder];  

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

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

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

          

        UIMenuController *menu = [UIMenuController sharedMenuController];  

[menu setMenuItems:[NSArray arrayWithObjects:flag, approve, deny, nil]];  

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

        [menu setMenuVisible:YES animated:YES];  

         NSLog(@"menuItems:%@",menu.menuItems);  

}  

}  

  

- (void)flag:(id)sender {  

NSLog(@"Cell was flagged");  

}  

  

- (void)approve:(id)sender {  

NSLog(@"Cell was approved");  

}  

  

- (void)deny:(id)sender {  

NSLog(@"Cell was denied");  

}  

- (void)longPress:(UILongPressGestureRecognizer *)recognizer {
if (recognizer.state == UIGestureRecognizerStateBegan) {
//	 TSTableViewCell *cell = (TSTableViewCell *)recognizer.view;
[self becomeFirstResponder];
UIMenuItem *flag = [[UIMenuItem alloc] initWithTitle:@"Flag" action:@selector(flag:)];
UIMenuItem *approve = [[UIMenuItem alloc] initWithTitle:@"Approve" action:@selector(approve:)];
UIMenuItem *deny = [[UIMenuItem alloc] initWithTitle:@"Deny" action:@selector(deny:)];

UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuItems:[NSArray arrayWithObjects:flag, approve, deny, nil]];
[menu setTargetRect:self.frame inView:self.superview];
[menu setMenuVisible:YES animated:YES];
NSLog(@"menuItems:%@",menu.menuItems);
}
}

- (void)flag:(id)sender {
NSLog(@"Cell was flagged");
}

- (void)approve:(id)sender {
NSLog(@"Cell was approved");
}

- (void)deny:(id)sender {
NSLog(@"Cell was denied");
}


修改canPerformAction

 

 

-(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;  

    }  

}  

-(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。。。效果如图



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios UILabel