我有点困惑。我正在创建一个应用程序,用户可以在页面之间水平滑动 ScrollView ,并且每个页面都有一个文本字段或一个 TextView 。我订阅了 UIKeyboardWillShowNotification 和 UIKeyboardWillHideNotification 通知,并且卡片在键盘弹出时会降低高度,在键盘隐藏时会增加回来。 此外,当拖动 ScrollView 时,所有 textViews/textField 都会辞职第一响应者。就是这个样子:
-(void)keyboardWillHideNSNotification*)notification{
// NSLog(@"notification user info = %@",notification.userInfo);
auto userInfo=notification.userInfo;
auto curve=[userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue];
auto duration=[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
auto startFrame=[userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
auto endFrame=[userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
auto dY=endFrame.origin.y-startFrame.origin.y;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurveUIViewAnimationCurve)curve];
[UIView setAnimationDuration:duration];
_feedbackTextView.height+=dY;
_feedbackUserDataView.height+=dY;
[UIView commitAnimations];
}
-(void)keyboardWillShowNSNotification *)notification{
// NSLog(@"notification user info = %@",notification.userInfo);
auto userInfo=notification.userInfo;
auto curve=[userInfo[UIKeyboardAnimationCurveUserInfoKey] unsignedIntegerValue];
auto duration=[userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
auto startFrame=[userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue];
auto endFrame=[userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
auto dY=endFrame.origin.y-startFrame.origin.y;
[UIView beginAnimations:nil context:nil];
[UIView setAnimationCurveUIViewAnimationCurve)curve];
[UIView setAnimationDuration:duration];
_feedbackTextView.height+=dY;
_feedbackUserDataView.height+=dY;
[UIView commitAnimations];
}
-(void)scrollViewDidScrollUIScrollView *)scrollView{
[_feedbackTextView resignFirstResponder];
[_feedbackUserDataView resignFirstResponder];
}
-(void)scrollViewDidEndDeceleratingUIScrollView *)scrollView{
// NSLog(@"%s",sel_getName(_cmd));
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
switch(page){
case 0:{
[_feedbackTextView becomeFirstResponder];
}break;
case 1:{
[_feedbackUserDataView becomeFirstResponder];
}break;
}
}
-(void)scrollViewDidEndDraggingUIScrollView *)scrollView willDecelerateBOOL)decelerate{
// NSLog(@"decelerate = %d",decelerate);
if(decelerate==NO){
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
switch(page){
case 0:{
[_feedbackTextView becomeFirstResponder];
}break;
case 1:{
[_feedbackUserDataView becomeFirstResponder];
}break;
}
}
}
_feedbackTextView是scrollView第一页的子view,_feedbackUserDataView是scrollView第二页的子view。 我测试了我的应用程序。我滚动,困惑地点击 textViews/textFields。我在日志中收到警告
|warning| Got a keyboard will show notification, but keyboard window is nil.
令我惊讶的是,谷歌对此一无所知,所以我在这里发布了一个问题。很抱歉格式不好。
此警告似乎是在键盘呈现后立即关闭时产生的,在动画完成之前。
在这种情况下 scrollViewDidEndDecelerating:
可以在用户再次开始平移而 ScrollView 仍在减速时被调用。然后立即调用 scrollViewDidScroll:
,这导致键盘出现并立即关闭。
一个解决方法是检查 scrollView 的 panGestureRecogniser 状态,如果它在 UIGestureRecognizerStateBegan
-(void)scrollViewDidEndDeceleratingUIScrollView *)scrollView{
if ([scrollView panGestureRecognizer].state == UIGestureRecognizerStateBegan) {
return;
}
// NSLog(@"%s",sel_getName(_cmd));
CGFloat width = scrollView.frame.size.width;
NSInteger page = (scrollView.contentOffset.x + (0.5f * width)) / width;
switch(page){
case 0:{
[_feedbackTextView becomeFirstResponder];
}break;
case 1:{
[_feedbackUserDataView becomeFirstResponder];
}break;
}
}
这应该会删除大部分警告。如果用户在键盘出现时开始平移,可能仍然存在一些问题。这些将更难处理 - 您需要确保键盘已完成其演示动画,然后再通过订阅 UIKeyboardDidShowNotification
并在用户平移时将其关闭。 p>
关于ios - 有键盘会显示通知,但键盘窗口为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26582656/
欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) | Powered by Discuz! X3.4 |