xcode 滚动视图上的 UITapGestureRecognizer 直到第二次点击才调用

xcode UITapGestureRecognizer on scrollview not calling until second tap

我有以下代码可以在用户点击背景时关闭键盘。如果滚动视图处于 PointZero 位置,它工作正常,但如果用户滚动视图然后选择文本视图,它不会调用“dismissKeyboard”方法,直到第二次背景点击。

在第一次点击时(出于某种原因)移动滚动视图偏移以与屏幕底部的滚动视图框架对齐。第二次点击将关闭键盘和 运行 下面的代码。我知道这与滚动视图有关。任何帮助将不胜感激。

谢谢

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

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

- (void)keyboardWasShown:(NSNotification *)notification {
    scrollViewRect = _scrollView.contentOffset.y;

    NSDictionary* info = [notification userInfo];
    CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    keyboardSize.height += 10;
    CGFloat viewBottom = CGRectGetMaxY(self.scrollView.frame);

    if ([_itemNotes isFirstResponder]) {
        CGFloat notesBottom = CGRectGetMaxY(_itemNotes.frame);
        viewBottom -= notesBottom;
        if (viewBottom < keyboardSize.height) {
            keyboardSize.height -= viewBottom;

            CGPoint scrollPoint = CGPointMake(0.0, keyboardSize.height);

            [self.scrollView setContentOffset:scrollPoint animated:YES];
        }
        else {
            [self.scrollView setContentOffset:CGPointZero animated:YES];
        }
    }
    else {
        [self.scrollView setContentOffset:CGPointZero animated:YES];
    }
}

- (void)keyboardWillBeHidden:(NSNotification *)notification {
    CGPoint scrollPoint = CGPointMake(0.0, scrollViewRect);
    [self.scrollView setContentOffset:scrollPoint animated:YES];
}

编辑: 所以我想出了一个解决方案,但似乎必须有更好的方法来处理这个问题。问题是因为我设置了 scrollView 的 contentOffset,使得 contentSize 超出了屏幕边界。因此,第一次点击是将 scrollView contentOffset 移回屏幕边界内,第二次是执行点击手势。我将post下面的解决方案希望有人有更好的答案。

我假设一定有更好的解决方案,但我能够通过在显示键盘时扩展 contentSize 然后在隐藏键盘时缩小它来解决这个问题。

设置一个浮点数 (scrollViewHeight) 来保存重置的原始内容大小。

//add this right before setting the content offset
scrollViewHeight = _scrollView.contentSize.height;
_scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width , scrollViewHeight + keyboardSize.height);

//add this right before reseting the content offset
_scrollView.contentSize = CGSizeMake(_scrollView.frame.size.width , scrollViewHeight);

看来确实有更好的方法我不知道。我将不得不返回查看文档以查看是否有其他方法。

我会推荐设置

_scrollView.layer.borderColor = [UIColor redColor].CGColor;
_scrollView.layer.borderWidth = 1;

这将准确显示滚动视图边界的位置,这可能不是您认为的位置,或者可能被其他东西覆盖。还有,当我打开键盘的时候,我一般会把scrollview frame bottom设置到键盘的顶部。否则,您可能无法访问键盘下方的内容。不确定这是否与您的问题完全相关。