我在屏幕的下半部分有几个UITextViews
,当点击时,键盘向上,但文本视图隐藏在它下面。我知道在Apple开发者论坛中有关于此的文档,我已尝试过,但该解决方案似乎只适用于UITextFields
,而不是UITextViews
。我添加了一个测试文本字段,并且使用名为UIScrollView
的{{1}}方法向上滚动。由于某些原因,它无法使用textview。
这是适用于scrollRectToVisible
的方法,取自Apple指南
UITextField
有没有办法让它// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your app might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, self.activeTextView.frame.origin) ) {
[self.scrollView scrollRectToVisible:self.activeTextView.frame animated:YES];
}
}
的工作方式相同?
答案 0 :(得分:1)
在.h文件中添加UITextViewDelegate
当键盘显示时,添加以下方法推送UITextview上行,并在隐藏键盘时设置原样。
-(void)textViewDidBeginEditing:(UITextView *)textView
{
if(textView.tag==0)
{
self.view.frame=CGRectMake(0, -100,[UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
}
// IF you have multiple UITextview then set different tag for them and access here as per tag
}
-(void)textViewDidEndEditing:(UITextView *)textView
{
if(textView.tag==0)
{
self.view.frame=CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height);
}
// IF you have multiple UITextview then set different tag for them and access here as per tag
}
-(BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text
{
if([text isEqualToString:@"\n"])
{
[textView resignFirstResponder];
return NO;
}
return YES;
}
答案 1 :(得分:1)
经过一些严肃的调试后,我终于找到了罪魁祸首...... scrollRectToVisible
实际上没有理由不使用UITextViews
,因为它将CGRect
作为参数。
我实际上有两个问题:
我使用textView.bounds.origin.y
为滚动方法创建了CGRect,这是不正确的。 bounds
属性返回相对于对象本身的坐标,而不是父视图,因此我实际上将0作为高度传递,因此没有滚动。要使用相对于父视图的坐标,必须使用textview.frame.origin.y
。
我在内容视图中有我的文本视图,而内容视图又在scrollview中,与scrollview的高度不同。这是一个问题,因为frame
属性只会为您提供相对于父视图的值,因此这不是整个主视图的真实y
。要解决此问题,请使用convertRect:toView:
,这样可确保相对于y
中CGRect
指定的视图传递正确的scrollRectToVisible
值。
修复这两个问题后,当键盘显示在它们顶部时,文本视图可以平滑地滚动到位。
我见过很多人都在问这个问题,并没有给出真正简明的答案。已经实施了整个班级和大解决方案,甚至都没有必要。
无论如何,我希望这对未来的某个人有用......