Мне не удалось заставить его работать, даже когда я прочитал все ваши ответы. Я представляю готовый код, который будет работать для всех.
Допустим, у нас есть класс контроллера с именем Controller. Вы можете просто вставить следующий код в этот контроллер, чтобы меню работало на его вид:
- (void)loadView {
[super loadView];
UILongPressGestureRecognizer *gr = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self.view addGestureRecognizer:gr];
}
- (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];
}
}
- (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;
}
Что нужно сделать для того, чтобы меню работало, это то, что firstResponder (в нашем случае наш контроллер - смотрите строку с [selfcomeFirstResponder]) должен иметь возможность стать первым респондентом (метод переопределения canBecomeFirstResponder вызывает реализацию по умолчанию, возвращающую NO ), а также - (BOOL) canPerformAction:(SEL)selector withSender:(id) sender
, который должен возвращать YES любому действию, которое может быть выполнено с помощью firstResponder