Obj-C - 通过在UITextView屏幕上的任意位置点击关闭键盘?

Obj-C - 通过在UITextView屏幕上的任意位置点击关闭键盘?

问题描述:

当我的用户点击我的UITextView(不是uitextfield ...)时,会出现动画。但是在UITextView开始编辑之后,没有其他的UITapGesture被识别出来(例如,如果我添加一个tapGesture到我的UIView来消除这个动画,它根本不会执行)。我一直试图解决这个问题,感觉像是永远。帮助表示赞赏,我很难过。Obj-C - 通过在UITextView屏幕上的任意位置点击关闭键盘?

ViewController.m

- (void)viewDidLoad 
     { 
      [super viewDidLoad]; 

     self.replyField.delegate = self; 

     [self.replyField setUserInteractionEnabled:YES]; 


     UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(textViewTapped)]; 
     [self.view addGestureRecognizer:gestureRecognizer]; 

     } 

    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer { 

     return YES; 

    } 


    -(void)textViewTapped { 
     NSLog(@"DISMISS PLEASE!"); 
     [self animateTextView:NO]; 

    } 

     - (void)textViewDidBeginEditing:(UITextView *)textView 
    { 

     [self animateTextView: YES]; 
     self.replyField.gestureRecognizers = nil; 


    } 


    - (void)textViewDidEndEditing:(UITextView *)textView 
    { 
     [self animateTextView:NO]; 


    } 


    - (void) animateTextView:(BOOL) up 
    { 
     const int movementDistance = 206; 
     const float movementDuration = 0.3f; 
     int movement= movement = (up ? -movementDistance : movementDistance); 
     NSLog(@"%d",movement); 

     [UIView beginAnimations: @"anim" context: nil]; 
     [UIView setAnimationBeginsFromCurrentState: YES]; 
     [UIView setAnimationDuration: movementDuration]; 
     self.view.frame = CGRectOffset(self.inputView.frame, 0, movement); 
     [UIView commitAnimations]; 



    } 


    - (void)textViewDidChange:(UITextView *)textView 
    { 

    } 
+1

尝试结合使用'resignFirstResponder'用'endEditing:' –

+0

@AlejandroIván试了一下,没有去:( – Brittany

+0

'[self.replyField resignFirstResponder]' –

您的问题与手势识别器无关。 问题引起的线:

self.view.frame = CGRectOffset(self.inputView.frame, 0, movement); 

你为self.viewself.inputView具有偏移设定帧。

而当self.view大小发生变化时,其子视图(包括文本视图)可能具有超出视图范围的位置。如果触摸点超出了超视界,UIView不响应触摸事件。 您可以轻松地设置视图背景色检查并显示他们帧日志:

... 
- (void) animateTextView:(BOOL) up 
{ 
    NSLog(@"self.view state1:%@", self.view); 
    NSLog(@"self.replyField state1:%@", self.replyField); 
    self.view.backgroundColor = [UIColor redColor]; 
    self.replyField.backgroundColor = [UIColor blueColor]; 

    const int movementDistance = 206; 
    const float movementDuration = 0.3f; 
    int movement= movement = (up ? -movementDistance : movementDistance); 
    NSLog(@"%d",movement); 

    [UIView beginAnimations: @"anim" context: nil]; 
    [UIView setAnimationBeginsFromCurrentState: YES]; 
    [UIView setAnimationDuration: movementDuration]; 
    //self.view.frame = CGRectOffset(self.inputView.frame, 0, movement); 
    self.replyField.frame = CGRectOffset(self.replyField.frame, 0, movement); 
    [UIView setAnimationDidStopSelector:@selector(afterAnimationStops)]; 
    [UIView commitAnimations]; 
} 

- (void)afterAnimationStops { 
    NSLog(@"self.view state2:%@", self.view); 
    NSLog(@"self.replyField state2:%@", self.replyField); 
} 
... 

还什么是self.inputView?它是否设置正确?

BTW:代码的目标是什么?你想移动文本视图以避免键盘重叠?然后考虑将它放在UIScrollView中。 例如参见这里的讨论:How to make a UITextField move up when keyboard is present?

+0

你是个天才。大声笑。谢谢,这让我非常疯狂!修正了基于此的代码。 – Brittany

在的viewController可以做到这一点

- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event 
{ 
    [self.view endEditing:Yes]; 
} 

在viewDidLoad中:

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] 
             initWithTarget:self 
             action:@selector(dismissKeyboard)]; 
[self.view addGestureRecognizer:tap]; 

创建一个方法:

-(void)dismissKeyboard { 

    [textView resignFirstResponder]; 
} 

我遇到过类似的问题,请使用下面的代码通过点击屏幕视图上的任意位置来关闭键盘。希望对你有帮助。

目标C

- (void)viewDidLoad 
{ 
    UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
    [self.view addGestureRecognizer:gestureRecognizer]; 
    gestureRecognizer.cancelsTouchesInView = NO; 

} 
- (void)dismissKeyboard 
{ 
    [self.view endEditing:YES]; 
} 

斯威夫特4

func viewDidLoad() { 
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(self.dismissKeyboard)) 
    view.addGestureRecognizer(gestureRecognizer) 
    gestureRecognizer.cancelsTouchesInView = false 
} 

func dismissKeyboard() { 
    view.endEditing(true) 
} 
+0

我结束了使用这种方法,它的工作原理 - 但在这种情况下,如何在键盘显示时将视图向上移动? – Brittany

没有搞清楚什么是你想要顺便说一句让我解释一下。

首先,如果你想隐藏你的键盘,你可以通过单行代码来完成。

目标C

[self.view endEditing:YES]; 

斯威夫特

view.endEditing(true) 

现在在你的代码,你self.view加点触手势就意味着如果触摸主视图中的任何地方,然后你的姿态方法会呼叫。如果你希望当我触摸主视图时我的键盘将被隐藏,那么在点击手势的方法中,你应该写上面的代码[self.view endEditing:YES];但是如果你点击你的textView,确保键盘将被打开。

但如果你想键盘的时候我就UITextView然后双击的方法有很多,但按照以下

目标C

UIView* dummyInputView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];  
myTextView.inputView = dummyInputView; 

斯威夫特不应打开

let dummyInputView = UIView(frame: CGRect(x: 0, y: 0, width: 1, height: 1)) 
myTextView.inputView = dummyInputView 

这里键盘不会打开,但是如果是y,则光标会闪烁OU想隐藏光标则可以如果你有那么任何问题做评论下面的代码

目标C

myTextView.tintColor = [UIColor clearColor]; 

斯威夫特

myTextView.tintColor = UIColor.clear 

做的。