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

How to get UIMenuController work for a custom view?

2012-06-18 13:26 645 查看
http://stackoverflow.com/questions/1146587/how-to-get-uimenucontroller-work-for-a-custom-view

I was not able to get it working even when I read all of your answers. I'm presenting ready code that will work for everyone.

Let's say we have a controller class named Controller. You can simply paste the following code to this controller to have the menu working on its view:

- (void)loadView {
[super loadView];

UILongPressGestureRecognizer *gr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self.view addGestureRecognizer:gr];
[gr release];
}

- (void) longPress:(UILongPressGestureRecognizer *) gestureRecognizer {
if ([gestureRecognizer state] == UIGestureRecognizerStateBegan) {
CGPoint location = [gestureRecognizer locationInView:[gestureRecognizer view]];
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *resetMenuItem = [[UIMenuItem alloc] initWithTitle:@"Item" action:@selector(menuItemClicked:)];

NSAssert([self becomeFirstResponder], @"Sorry, UIMenuController will not work with %@ since it cannot become first responder", self);
[menuController setMenuItems:[NSArray arrayWithObject:resetMenuItem]];
[menuController setTargetRect:CGRectMake(location.x, location.y, 0.0f, 0.0f) inView:[gestureRecognizer view]];
[menuController setMenuVisible:YES animated:YES];

[resetMenuItem release];
}
}

- (void) copy:(id) sender {
// called when copy clicked in menu
}

- (void) menuItemClicked:(id) sender {
// called when Item clicked in menu
}

- (BOOL) canPerformAction:(SEL)selector withSender:(id) sender {
if (selector == @selector(menuItemClicked:) || selector == @selector(copy:)) {
return YES;
}
return NO;
}

- (BOOL) canBecomeFirstResponder {
return YES;
}


What has to be done in order for menu to work is that the firstResponder(in our case our controller - see line with [self becomeFirstResponder]) has to be able to become first responder (override method canBecomeFirstResponder cause default implementation returns
NO) as well as
-
(BOOL) canPerformAction:(SEL)selector withSender:(id) sender
which should return YES to any action that can be performed by
firstResponder
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐