当键盘出现滚动视图时文本字段消失
Posted
技术标签:
【中文标题】当键盘出现滚动视图时文本字段消失【英文标题】:textfield disappearing when keyboard present for scrollview 【发布时间】:2013-10-04 17:47:11 【问题描述】:我在 UIscrollView 中出现键盘问题。
我添加了一个 UIScrollview 作为
scrlView=[[UIScrollView alloc] initWithFrame:CGRectMake(10, 140, 1000, 600)];
scrlView.scrollEnabled=YES;
scrlView.showsVerticalScrollIndicator=YES;
scrlView.bounces=NO;
到这个滚动视图,我添加了 10 行 UITextField,每行有 5 个文本字段,每个文本字段高度为 50 像素。 当尝试编辑文本字段时,它与键盘重叠。为此我尝试了此代码
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
- (void)keyboardWasShown:(NSNotification*)aNotification
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGRect bkgndRect = selectetTxtfld.superview.frame;
bkgndRect.size.height += kbSize.height;
[selectetTxtfld.superview setFrame:bkgndRect];
[scrlView setContentOffset:CGPointMake(0.0, selectetTxtfld.frame.origin.y) animated:YES];
//发送UIKeyboardWillHideNotification时调用
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
[UIView animateWithDuration:0.4 animations:^
scrlView.contentInset = contentInsets;
];
scrlView.scrollIndicatorInsets = contentInsets;
但是 textField 没有出现在键盘上。它出现在滚动视图的 ypoint 位置
帮我解决这个问题。我在 *** 中看到了很多答案。但没有解决我的问题
【问题讨论】:
【参考方案1】:- (void)keyboardWillBeHidden:(NSNotification*)aNotification
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGFloat offSetAfterKeyboardIsDisplayed = scrlview.contentOffset.y + kbSize.height;
[UIView animateWithDuration:0.3 animations:^
//adding content inset at the bottom of the scrollview
scrlView.contentInset = UIEdgeInsetMake(0,0,kbSize.height,0);
[scrlview setContentOffset:offSetAfterKeyboardIsDisplayed]
];
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGFloat offSetAfterKeyboardResigns = scrlview.contentOffset.y - kbSize.height;
[UIView animateWithDuration:0.3 animations:^
scrlView.contentInset = UIEdgeInsetsZero;
[scrlview setContentOffset:offSetAfterKeyboardResigns]
];
【讨论】:
在 scrlView.contentInset = UIEdgeInsetMake(0,0,kbSize.height,0) 处显示错误;从不兼容的类型“int”分配给“UIEdgeInsets”(又名“struct UIEdgeInsets”) 在 [scrlView setContentOffset:offSetAfterKeyboardIsDisplayed] 显示错误将“const CGFloat”(又名“const float”)发送到不兼容类型“CGPoint”(又名“struct CGPoint”)的参数 tnks 再次回答。现在对我来说很重要 哦.. 很抱歉.. 我现在没有 xcode.. 而不是 setContentOffset:offSetAfterKeyboardIsDisplayed 你需要写 setContentOffset:CGPointMake(scrlView.contentOffset.x, offSetAfterKeyboardIsDisplayed)。请对 setContentOffset:offSetAfterKeyboardResigns 进行相同的更改.. 抱歉这个错误.. 这个错误的原因(据您所知)是 offSetAfterKeyboardIsDisplayed 是 CGFloat 类型,但 ContentSize 是 CGPoint 类型(这是一个结构).. 及其 UIEdgeInsetsMake 不是 UIEdgeInsetMake .. :) 我的错【参考方案2】:在键盘显示中: 1.在滚动视图底部添加内容插图,其值等于键盘的高度。 2. setContentOffset = 当前偏移量+ 键盘高度。 注意:1&3 应该在动画块中完成,持续时间等于 0.30
在键盘WillBeHidden 中: 1.set contentInset = UIEdgeInsetsZero 2. setContentOffset = 当前偏移量 - 键盘高度。 注意:1&3 应该在动画块中完成,持续时间等于 0.30
这应该可以解决你的问题:)
【讨论】:
感谢您的回答。请您简要介绍一些示例代码。我是 xcode 开发的新手以上是关于当键盘出现滚动视图时文本字段消失的主要内容,如果未能解决你的问题,请参考以下文章