我有一个与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;
}
答案 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