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

时间:2012-07-15 13:44:15

标签: objective-c ios ipad uiscrollview uikeyboard

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

enter image description here

相当没有灵感,但这就是规范所说的。在任何情况下,部分问题是当屏幕键盘弹出时,会发生这种情况:

enter image description here

现在这本身并不是一个大问题;我已经拥有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];
}

这不是世界上最强大的东西,但它现在做得还不错。这让我来到这里:

enter image description here

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

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

1 个答案:

答案 0 :(得分:2)

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

UIScrollView
    UIView
        <Components>

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

UIScrollView
    <Components>

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