当键盘出现滚动视图时文本字段消失

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 开发的新手

以上是关于当键盘出现滚动视图时文本字段消失的主要内容,如果未能解决你的问题,请参考以下文章

Swift:当键盘出现时如何让视图控制器滚动到文本字段

滚动到滚动视图/滚动视图中的特定文本字段 当键盘在屏幕上时停止滚动

键盘出现多次时,滚动视图不会向上移动

仅当键盘快速出现时如何使scrollView滚动

滚动浏览集合视图后,为什么视图会消失?

当键盘出现并启用滚动时,TextField 向上移动