在iOS 7中隐藏在键盘下的UITextViews

时间:2014-02-04 01:17:21

标签: ios7 keyboard uitextview hidden

我在屏幕的下半部分有几个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]; } } 的工作方式相同?

2 个答案:

答案 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作为参数。

我实际上有两个问题:

  1. 我使用textView.bounds.origin.y为滚动方法创建了CGRect,这是不正确的。 bounds属性返回相对于对象本身的坐标,而不是父视图,因此我实际上将0作为高度传递,因此没有滚动。要使用相对于父视图的坐标,必须使用textview.frame.origin.y

  2. 我在内容视图中有我的文本视图,而内容视图又在scrollview中,与scrollview的高度不同。这是一个问题,因为frame属性只会为您提供相对于父视图的值,因此这不是整个主视图的真实y。要解决此问题,请使用convertRect:toView:,这样可确保相对于yCGRect指定的视图传递正确的scrollRectToVisible值。

  3. 修复这两个问题后,当键盘显示在它们顶部时,文本视图可以平滑地滚动到位。

    我见过很多人都在问这个问题,并没有给出真正简明的答案。已经实施了整个班级和大解决方案,甚至都没有必要。

    无论如何,我希望这对未来的某个人有用......