显示键盘时无法与 ScrollView 中的(某些)UI 元素交互

Posted

技术标签:

【中文标题】显示键盘时无法与 ScrollView 中的(某些)UI 元素交互【英文标题】:Can't interact with (some) UI elements in a ScrollView when the keyboard is displayed 【发布时间】:2012-07-15 13:44:14 【问题描述】:

我有一个相当基本的界面,通常看起来像这样:

相当缺乏灵感,但这就是规范所说的构建。无论如何,部分问题是当屏幕键盘弹出时,会发生这种情况:

现在这本身并不是什么大问题;我将所有内容都包含在 UIScrollView 中,并且正在使用以下代码来处理键盘的显示和隐藏:

- (void) moveTextViewForKeyboard:(NSNotification*)aNotification up: (BOOL) up
    NSDictionary* userInfo = [aNotification userInfo];

    // Get animation info from userInfo
    NSTimeInterval animationDuration;
    UIViewAnimationCurve animationCurve;

    CGRect keyboardEndFrame;

    [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
    [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];


    [[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];


    // Animate up or down
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:animationDuration];
    [UIView setAnimationCurve:animationCurve];

    CGRect newFrame = referrerInfoView.frame;
    CGRect keyboardFrame = [self.view convertRect:keyboardEndFrame toView:nil];

    newFrame.size.height -= (keyboardFrame.size.height - 71) * (up? 1 : -1);
    referrerInfoView.frame = newFrame;
    referrerInfoView.contentSize = CGSizeMake(703, 633);

    //FIXME:  doesn't play nice with rotation when the keyboard is displayed
    if (up && UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) 
        UIView* focusedField = [referrerInfoView findFirstResponder];
        if (focusedField && focusedField.frame.origin.y > 340.0) 
            referrerInfoView.contentOffset = CGPointMake(0.0, focusedField.frame.origin.y - 200.0);
        
    
    else 
        referrerInfoView.contentOffset = CGPointMake(0.0, 0.0);
    

    [UIView commitAnimations];

不是世界上最强大的东西,但它现在已经足够好了。这让我到了这里:

现在这很好,除了 当键盘保持在屏幕上时,阴影框中的任何元素都不会响应用户交互UIScrollView 响应交互,视图中的所有其他控件也是如此。但是所有“地址”字段都停止工作。

基本上,在我将它们滚动回视图之前隐藏在键盘后面的所有控件似乎仍然认为它们被隐藏在键盘后面。有关如何解决此问题的任何想法?

【问题讨论】:

尝试在动画后将 Scrollviews userInteractionEnabled 设置为 YES? aScrollView.userInteractionEnabled = YES; 【参考方案1】:

我找到了解决方案。基本上我最初的布局是这样的:

UIScrollView
    UIView
        <Components>

滚动视图内部的容器视图并不是绝对必要的,但它似乎也不应该伤害任何东西。事实证明,这种假设是不正确的。长话短说,我更改了界面,使其结构如下:

UIScrollView
    <Components>

这就解决了问题。不能说我真的明白为什么,但希望这些信息能帮助下一个碰巧遇到这个问题的人。

【讨论】:

这正是我的问题。但是,拥有那个 uiview 容器非常方便。你有没有想过如何在不移除容器的情况下解决它? 老兄,你刚刚救了我

以上是关于显示键盘时无法与 ScrollView 中的(某些)UI 元素交互的主要内容,如果未能解决你的问题,请参考以下文章

ScrollView 中的 UITextField 在 iOS 中不显示键盘

Android开发里遇到键盘出现时ScrollView不能滚动,怎么解决

以编程方式滚动 ScrollView,其中包含 StackView

Swift:当键盘显示时向上滚动视图

仅当键盘快速出现时如何使scrollView滚动

Android:在键盘显示中,将 ScrollView 固定到底部