【问题标题】:UIMenuController is not Visible on UILongGestureRecognizerUIMenuController 在 UILongGestureRecognizer 上不可见
【发布时间】:2013-11-03 12:17:16
【问题描述】:

我针对同一个问题提到了关于 SO 的各种帖子。但仍然无法得到解决方案。

我有 子类 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];
    }
}

我已经覆盖了becomeFirstRespondercanBecomeFirstResponder

重要提示:当我长按按钮时,我的日志消息 “menu visible....” 正在被记录,但我看不到UIMenuController 可见。

我在上面的代码中还有什么遗漏吗?提前致谢。

【问题讨论】:

    标签: ios iphone objective-c uigesturerecognizer gesture


    【解决方案1】:

    在显示菜单之前添加这一行:

    [self becomeFirstResponder];
    

    并删除此代码:

    - (BOOL)becomeFirstResponder
    {
        return YES;
    }
    

    【讨论】:

    • 绝对......太好了......非常感谢...... +1。但是我仍然不明白,虽然我已经添加了[self becomeFirstResponder]; 这一行,但为什么我的 UIMenuController 不可见?另外,我已经实现- (BOOL)becomeFirstResponder 来返回YES,那么为什么这不能按预期工作呢?最重要的是接受您的回答.. 再次感谢。
    • 您可以覆盖canBecomeFirstResponder 以更新状态或执行一些操作,例如突出显示选择 - 但您仍然需要调用超类实现。
    • @DShah 菜单控制器不可见,因为在您的方法覆盖中您没有调用[super becomeFirstResponder] - 它实际上没有做任何事情,只是报告“是的,我已将自己添加到响应者链中并且让自己成为第一响应者
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 2011-04-30
    • 2011-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多