【问题标题】:Obj-C - Dismiss keyboard by tapping anywhere on screen from UITextView?Obj-C - 通过点击 UITextView 屏幕上的任意位置来关闭键盘?
【发布时间】:2017-10-22 04:55:34
【问题描述】:

当我的用户点击我的 UITextView(不是 uitextfield...)时,会出现动画。然而,在 UITextView 开始编辑后,似乎没有其他 UITapGesture 被识别(例如,如果我向我的 UIView 添加一个 tapGesture 来关闭这个动画,它根本不会执行)。我一直在努力解决这个问题,因为我感觉就像永远一样。感谢您的帮助,我很难过。

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
    {

    }

【问题讨论】:

  • 尝试将resignFirstResponderendEditing:结合使用
  • @AlejandroIván 试过了,不行:(
  • [self.replyField resignFirstResponder]?
  • 您确定您正在触摸视图,因为手势已添加到视图中,并且 textView 没有填充视图边界?
  • @AlejandroIván 没有骰子。我实际上不能在我的 textView 之外点击任何其他按钮而不关闭它?这正常吗?

标签: ios objective-c uitextview uitapgesturerecognizer


【解决方案1】:

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

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

您从 self.inputViewself.view 设置了带有偏移量的框架。

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?设置正确吗?

顺便说一句:代码的目标是什么?你想移动文本视图以避免键盘重叠吗?然后考虑将它放在 UIScrollView 中。 例如,请参阅此处的讨论:How to make a UITextField move up when keyboard is present?

【讨论】:

  • 你是个天才。哈哈。谢谢,这让我发疯了!基于此修复了我的代码。
【解决方案2】:

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

目标 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)
}

【讨论】:

  • 我最终使用了这种方法并且它有效 - 但在这种情况下,当键盘显示时我如何才能将我的视图向上移动?
【解决方案3】:

在 ViewDidLoad 中:

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

创建一个方法:

-(void)dismissKeyboard {

    [textView resignFirstResponder];
}

【讨论】:

    【解决方案4】:

    不清楚你想要什么顺便说一下让我解释一下。

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

    目标 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
    

    这里的键盘不会打开,但是如果你想隐藏光标,光标会闪烁,然后你可以通过下面的代码来做

    目标 C

     myTextView.tintColor = [UIColor clearColor];
    

    斯威夫特

     myTextView.tintColor = UIColor.clear
    

    如果您有任何问题,请发表评论。

    【讨论】:

      【解决方案5】:

      在 viewController 中你可以这样做

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

      【讨论】:

        猜你喜欢
        • 2011-10-22
        • 2017-01-15
        • 2014-07-30
        • 1970-01-01
        • 1970-01-01
        • 2020-02-02
        • 2019-06-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多