菜鸟教程小白 发表于 2022-12-13 02:51:44

ios - 有键盘会显示通知,但键盘窗口为零


                                            <p><p>我有点困惑。我正在创建一个应用程序,用户可以在页面之间水平滑动 ScrollView ,并且每个页面都有一个文本字段或一个 TextView 。我订阅了 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 通知,并且卡片在键盘弹出时会降低高度,在键盘隐藏时会增加回来。
此外,当拖动 ScrollView 时,所有 textViews/textField 都会辞职第一响应者。就是这个样子:</p>

<pre><code>-(void)keyboardWillHide:(NSNotification*)notification{
//    NSLog(@&#34;notification user info = %@&#34;,notification.userInfo);
    auto userInfo=notification.userInfo;
    auto curve= unsignedIntegerValue];
    auto duration= doubleValue];
    auto startFrame= CGRectValue];
    auto endFrame= CGRectValue];
    auto dY=endFrame.origin.y-startFrame.origin.y;

    ;
    ;
    ;
    _feedbackTextView.height+=dY;
    _feedbackUserDataView.height+=dY;
    ;
}

-(void)keyboardWillShow:(NSNotification *)notification{
//    NSLog(@&#34;notification user info = %@&#34;,notification.userInfo);
    auto userInfo=notification.userInfo;
    auto curve= unsignedIntegerValue];
    auto duration= doubleValue];
    auto startFrame= CGRectValue];
    auto endFrame= CGRectValue];
    auto dY=endFrame.origin.y-startFrame.origin.y;

    ;
    ;
    ;
    _feedbackTextView.height+=dY;
    _feedbackUserDataView.height+=dY;
    ;
}

-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
    ;
    ;
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{
//    NSLog(@&#34;%s&#34;,sel_getName(_cmd));
    CGFloat width = scrollView.frame.size.width;
    NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
    switch(page){
      case 0:{
            ;
      }break;
      case 1:{
            ;
      }break;
    }
}

-(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
//    NSLog(@&#34;decelerate = %d&#34;,decelerate);
    if(decelerate==NO){
      CGFloat width = scrollView.frame.size.width;
      NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
      switch(page){
            case 0:{
                ;
            }break;
            case 1:{
                ;
            }break;
      }
    }
}
</code></pre>

<p>_feedbackTextView是scrollView第一页的子view,_feedbackUserDataView是scrollView第二页的子view。
我测试了我的应用程序。我滚动,困惑地点击 textViews/textFields。我在日志中收到警告</p>

<pre><code>|warning| Got a keyboard will show notification, but keyboard window is nil.
</code></pre>

<p>令我惊讶的是,谷歌对此一无所知,所以我在这里发布了一个问题。很抱歉格式不好。</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>此警告似乎是在键盘呈现后立即关闭时产生的,在动画完成之前。</p>

<p>在这种情况下 <code>scrollViewDidEndDecelerating:</code> 可以在用户再次开始平移而 ScrollView 仍在减速时被调用。然后立即调用 <code>scrollViewDidScroll:</code>,这导致键盘出现并立即关闭。</p>

<p>一个解决方法是检查 scrollView 的 panGestureRecogniser 状态,如果它在 <code>UIGestureRecognizerStateBegan</code></p> 中,则避免使文本字段成为第一响应者

<pre><code>-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView{

    if (.state == UIGestureRecognizerStateBegan) {
      return;
    }

    //    NSLog(@&#34;%s&#34;,sel_getName(_cmd));
    CGFloat width = scrollView.frame.size.width;
    NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
    switch(page){
      case 0:{
            ;
      }break;
      case 1:{
            ;
      }break;
    }
}
</code></pre>

<p>这应该会删除大部分警告。如果用户在键盘出现时开始平移,可能仍然存在一些问题。这些将更难处理 - 您需要确保键盘已完成其演示动画,然后再通过订阅 <code>UIKeyboardDidShowNotification</code> 并在用户平移时将其关闭。</code> p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 有键盘会显示通知,但键盘窗口为零,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/26582656/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/26582656/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 有键盘会显示通知,但键盘窗口为零