1

原生 iOSMail.app在创建新字母时有一个很棒的功能。整个屏幕是a UIScrollView,写信体的地方是a UITextView,滚动被禁用。

在此处输入图像描述

当您输入此高度TextView以及UIScrollView动态更改的高度时,UIScrollView向下滚动会在键盘上方留下一些像素以用于新文本。

我知道这个过程必须在textViewDidChange方法中完成,但是在尝试做同样的事情时,我的代码出现了问题 -UITextField有时可能会在UIScrollView. 这是我尝试执行此操作的方法:

-(void)textViewDidChange:(UITextView *)textView {

    CGRect frame = emailTextView.frame;
    frame.size.height = emailTextView.contentSize.height;
    emailTextView.frame = frame;
    mainScrollView.contentSize = CGSizeMake(320, emailTextView.contentSize.height + rightKeyboardSize.height + 20);

}

关于这里出了什么问题的任何想法?提前致谢!

4

1 回答 1

1

好的,我实现了自己的示例项目来找到答案。你应该替换你的名字。

首先,我将添加观察者来检测键盘何时显示或隐藏:

- (void)addKeyboardObserver
{
    // This could be in an init method.
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

- (void)keyboardDidShow:(NSNotification*)notification
{
    NSDictionary* keyboardInfo = [notification userInfo];
    NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey];
    _keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
    UIScrollView *_scrollView = (UIScrollView*)self.view;
    _scrollView.frame = CGRectMake(_scrollView.frame.origin.x,
                                   _scrollView.frame.origin.y,
                                   _scrollView.frame.size.width,
                                   _scrollView.frame.size.height - _keyboardFrameBeginRect.size.height);
}

- (void)keyboardDidHide:(NSNotification*)notification
{
    UIScrollView *_scrollView = (UIScrollView*)self.view;
    _scrollView.frame = CGRectMake(_scrollView.frame.origin.x,
                                   _scrollView.frame.origin.y,
                                   _scrollView.frame.size.width,
                                   _scrollView.frame.size.height +
                               _keyboardFrameBeginRect.size.height);
}

然后,将 textViewDidChange: 方法更改为:

- (void)textViewDidChange:(UITextView *)textView
{
    UIScrollView *_scrollView = (UIScrollView*)self.view;
    _textView.frame = CGRectMake(_textView.frame.origin.x,
                                 _textView.frame.origin.y,
                                 _textView.contentSize.width,
                                 _textView.contentSize.height);
    _scrollView.contentSize = _textView.frame.size;

    if (_scrollView.frame.size.height < _textView.frame.size.height) {
        CGPoint bottomOffset = CGPointMake(0,_textView.frame.size.height-_keyboardFrameBeginRect.size.height);
        [_scrollView setContentOffset:bottomOffset animated:NO];
    }
}

祝你好运!

于 2013-01-30T12:47:05.623 回答