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设置到键盘的顶部。否则,您可能无法访问键盘下方的内容。不确定这是否与您的问题完全相关。
我有以下代码可以在用户点击背景时关闭键盘。如果滚动视图处于 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设置到键盘的顶部。否则,您可能无法访问键盘下方的内容。不确定这是否与您的问题完全相关。