我在聊天气泡中呈现了一个UIMenuController,它隐藏了键盘

时间:2014-07-15 08:27:14

标签: ios uitableview keyboard uitextview uimenucontroller

我有一个与UITableView聊天的应用,在UITabelViewcells内的气泡中,我提供了一个包含消息内容的UILabel。 当用户长按气泡的UIImageView(在单元格类中声明)时,我会显示UIMenuController

        [self.bubbleImageView addGestureRecognizer:recognizer];

除了tableView我还有一个UITextView用户可以写新消息。 如果焦点在textView(显示键盘),然后用户长按气泡键盘隐藏,用户体验不好......

即使textView不再是第一响应者,如何解决此问题并将键盘保留在屏幕上? 当然,如果屏幕上已经没有键盘,我不希望键盘出现。

P.S 我试着理解这个答案 - UIMenuController hides the keyboard 但是并没有真正弄清楚self.messageTextView是什么......

   @implementation TextChatCell

   - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString        *)reuseIdentifier
          {
       self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
       if (self) {
           // Initialization code
       }
       return self;
          }

   - (void)awakeFromNib
   {
       UILongPressGestureRecognizer *recognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleLongPress:)];
       [recognizer setMinimumPressDuration:0.5];
       [self.bubbleImageView addGestureRecognizer:recognizer];

   }
   -(BOOL)canBecomeFirstResponder{
       return YES;

   }

   - (BOOL) becomeFirstResponder {
       return [super becomeFirstResponder];
   }

   - (BOOL) canPerformAction:(SEL)action withSender:(id)sender {
       if (action == @selector(copy:))
           return YES;
       if (action == @selector(delete:)) {
           return YES;
       }
       return [super canPerformAction:action withSender:sender];
   }

   - (void)copy:(id)sender {
       [[UIPasteboard generalPasteboard] setString:self.contentLabel.text];
       [self resignFirstResponder];
   }
   -(void)delete:(id)sender {
       [[NSNotificationCenter defaultCenter] postNotificationName:DELETE_MESSAGE  object:self.chatMessage userInfo:nil];
       [self resignFirstResponder];

   }

   - (void) handleLongPress:(UILongPressGestureRecognizer *)longPressRecognizer {
       if (longPressRecognizer.state != UIGestureRecognizerStateBegan)
    return;

       if ([self becomeFirstResponder] == NO)
    return;

       UIMenuController *menu = [UIMenuController sharedMenuController];

       // Create Rect
       CGRect targetRect =self.bubbleImageView.frame;
       [menu setTargetRect:targetRect inView:self];

       [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(menuWillShow:)
                                             name:UIMenuControllerWillShowMenuNotification
                                           object:nil];
       [menu setMenuVisible:YES animated:YES];
   }

   - (void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
       [super touchesEnded:touches withEvent:event];
       if ([self isFirstResponder] == NO)
    return;

       UIMenuController *menu = [UIMenuController sharedMenuController];
       [menu setMenuVisible:NO animated:YES];
       [menu update];
       [self resignFirstResponder];
   }

   - (void) menuWillHide:(NSNotification *)notification {
       [[NSNotificationCenter defaultCenter] removeObserver:self               name:UIMenuControllerWillHideMenuNotification object:nil];
       self.bubbleImageView.alpha = 1.0;

   }

   - (void) menuWillShow:(NSNotification *)notification {
       [[NSNotificationCenter defaultCenter] removeObserver:self name:UIMenuControllerWillShowMenuNotification object:nil];
       [[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(menuWillHide:)
                                             name:UIMenuControllerWillHideMenuNotification
                                           object:nil];
       self.bubbleImageView.alpha = 0.5;
   }

1 个答案:

答案 0 :(得分:0)

@interface TextChatCell : UITableViewCell

@property (nonatomic, strong) UITextView *messageTextView;

@end

@implementation TextChatCell

- (void)handleLongPress:(UILongPressGestureRecognizer   *)longPressRecognizer {
   if (longPressRecognizer.state != UIGestureRecognizerStateBegan)
return;

   if ([_messageTextView isFirstResponder]) {
        _messageTextView.overrideNextResponder = self;
   } else {
       if ([self becomeFirstResponder] == NO)
       return;
   }

   UIMenuController *menu = [UIMenuController sharedMenuController];

   // Create Rect
   CGRect targetRect =self.bubbleImageView.frame;
   [menu setTargetRect:targetRect inView:self];

   [[NSNotificationCenter defaultCenter] addObserver:self
                                     selector:@selector(menuWillShow:)
                                         name:UIMenuControllerWillShowMenuNotification
                                       object:nil];
   [menu setMenuVisible:YES animated:YES];
}

- (void)handleMenuWillHideNotification:(NSNotification *)notification
{
    _messageTextView.overrideNextResponder = nil;

    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                name:UIMenuControllerWillHideMenuNotification
                                              object:nil];
}

@end