【发布时间】:2011-03-23 12:28:30
【问题描述】:
UIMenuController点击后如何在UIBarButtonItem下显示?
【问题讨论】:
标签: iphone objective-c
UIMenuController点击后如何在UIBarButtonItem下显示?
【问题讨论】:
标签: iphone objective-c
假设您的 UIBarButtonItem 已连接到:
-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event;
然后将这些代码粘贴到您的视图控制器中:
-(void)buttonClicked:(UIBarButtonItem*)sender event:(UIEvent*)event{
[self becomeFirstResponder];
/*get the view from the UIBarButtonItem*/
UIView *buttonView=[[event.allTouches anyObject] view];
CGRect buttonFrame=[buttonView convertRect:buttonView.frame toView:self.view];
UIMenuController *menuController = [UIMenuController sharedMenuController];
UIMenuItem *resetMenuItem = [[UIMenuItem alloc] initWithTitle:@"Menu 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:buttonFrame inView:self.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:)*/ /*<--enable that if you want the copy item */) {
return YES;
}
return NO;
}
- (BOOL) canBecomeFirstResponder {
return YES;
}
关键是canBecomeFirstResponder和canPerformAction返回YES。
Here 是您需要的示例项目。
这些代码其实来自stackoverflow的其他帖子,我只是把它们组合起来。
【讨论】:
CGRect buttonFrame=[buttonView convertRect:buttonView.frame toView:self.view]; 和 [menuController setTargetRect:buttonFrame inView:self.view]; 到:[menuController setTargetRect:buttonView.frame inView:buttonView.superview]; 给出了更准确的位置。