我有一个相当简单的UILabel子类,允许点击显示UIMenuController,以便可以复制文本。在大多数情况下,这一切都很好。
#import "EPHighlightLabel.h"
#import <QuartzCore/QuartzCore.h>
@interface EPHighlightLabel()
@property (unsafe_unretained) bool hasMenuController;
@end
@implementation EPHighlightLabel
- (id)init {
if ( (self = [super init]) ) {
self.highlightedTextColor = [UIColor blueColor];
}
return self;
}
- (void)awakeFromNib {
[super awakeFromNib];
self.highlightedTextColor = [UIColor blueColor];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(willHideMenu)
name:UIMenuControllerWillHideMenuNotification
object:nil];
self.userInteractionEnabled = YES;
UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(wasTapped:)];
[self addGestureRecognizer:tapGesture];
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if(action == @selector(copy:)) {
return YES;
}
else {
return [super canPerformAction:action withSender:sender];
}
}
- (BOOL)canBecomeFirstResponder {
return YES;
}
- (BOOL)resignFirstResponder {
if ([super resignFirstResponder]) {
self.hasMenuController = false;
self.highlighted = NO;
return YES;
}
return NO;
}
- (void)copy:(id)sender {
UIPasteboard *board = [UIPasteboard generalPasteboard];
[board setString:self.text];
[self resignFirstResponder];
}
- (void)willHideMenu {
if (self.hasMenuController) {
[self resignFirstResponder];
}
}
- (IBAction)wasTapped:(id)sender {
if([self isFirstResponder]) {
self.hasMenuController = false;
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuVisible:NO animated:YES];
[menu update];
[self resignFirstResponder];
}
else if([self becomeFirstResponder]) {
self.hasMenuController = true;
UIMenuController *menu = [UIMenuController sharedMenuController];
[menu setMenuVisible:NO animated:YES];
[menu setTargetRect:self.bounds inView:self];
[menu setMenuVisible:YES animated:YES];
self.highlighted = YES;
}
}
@end
在视图中,UIView中有三个EPHighlightLabel
,它本身就是一个子视图。一切正常,您可以点击标签,文本将突出显示,然后再次点击或点击,菜单将被解除,标签不会突出显示。这是通过- (void)willHideMenu
调用实现的。但是,在以下情况下,不会发送UIMenuControllerWillHideMenu通知:
有什么建议吗?