UIMenuController не отображается в UILongGestureRecognizer
Я сослался на различные посты на эту тему. Но так и не смог получить решение.
У меня есть подкласс UIButton
где я UILongGestureRecognizer
, Моя реализация идет следующим образом:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
UILongPressGestureRecognizer *longGesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(longPress:)];
[self addGestureRecognizer:longGesture];
}
return self;
}
- (BOOL)becomeFirstResponder
{
return YES;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender
{
return YES;
}
- (BOOL)canBecomeFirstResponder
{
return YES;
}
- (void)longPress:(UILongPressGestureRecognizer *)gesture
{
if (gesture.state == UIGestureRecognizerStateBegan)
{
NSLog(@"ButtonView: longPress: event called");
UIMenuController *menu = [UIMenuController sharedMenuController];
if (![menu isMenuVisible])
{
ButtonView *btn = (ButtonView *)gesture.view;
if (![btn becomeFirstResponder])
{
NSLog(@"couldn't become first responder");
return;
}
UIMenuItem *menuItem = [[UIMenuItem alloc] initWithTitle:@"Change Color" action:@selector(changeColor:)];
UIMenuController *menuCont = [UIMenuController sharedMenuController];
menuCont.arrowDirection = UIMenuControllerArrowDown;
menuCont.menuItems = [NSArray arrayWithObject:menuItem];
if([btn canBecomeFirstResponder])
{
[menuCont setTargetRect:btn.frame inView:btn.superview];
[menuCont setMenuVisible:YES animated:YES];
NSLog(@"menu visible....");
}
}
}
if (gesture.state == UIGestureRecognizerStateEnded || gesture.state == UIGestureRecognizerStateCancelled || gesture.state == UIGestureRecognizerStateFailed)
{
[self.layer setBorderColor:[UIColor clearColor].CGColor];
[self.layer setBorderWidth:0.0];
}
}
Я переопределил becomeFirstResponder
а также canBecomeFirstResponder
,
Важное примечание: мое сообщение журнала "menu visible...." регистрируется, когда я долго нажимал кнопку, но я не могу видеть UIMenuController видимым.
Есть ли что-то, что мне все еще не хватает в коде выше?? Заранее спасибо.
1 ответ
Решение
Добавьте эту строку перед отображением меню:
[self becomeFirstResponder];
И удалите этот код:
- (BOOL)becomeFirstResponder
{
return YES;
}