自动滚动 UIScrollView 以适应原生 iOS Mail.app 中的内容

Posted

技术标签:

【中文标题】自动滚动 UIScrollView 以适应原生 iOS Mail.app 中的内容【英文标题】:Autoscroll UIScrollView to fit content like in native iOS Mail.app 【发布时间】:2013-01-30 12:19:14 【问题描述】:

原生 ios Mail.app 有一个很棒的创建新字母的功能。整个屏幕是UIScrollView,写信正文的地方是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);


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

【问题讨论】:

【参考方案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];
    

祝你好运!

【讨论】:

您的方法仅在 UITextView 可滚动时有效,而不是在其滚动被禁用时有效。另外,我有一个 UIScrollView,我也需要滚动它。 UIScrollView 有屏幕大小吗? 不,它的大小取决于 UINavigationBar 并且是可定制的 哇,非常感谢!我一定会试一试并报告结果! 我在github.com/luisespinoza/TextViewAutoScrollDown上传示例项目

以上是关于自动滚动 UIScrollView 以适应原生 iOS Mail.app 中的内容的主要内容,如果未能解决你的问题,请参考以下文章

滚动 UIScrollView 以适应 iOS 中的键盘

iOS自动布局:相等的空间以适应超级视图宽度[重复]

具有自适应布局的 UIScrollView

UIScrollView 内的 UIWebView 框架不会拉伸大小以适应所有内容

如何以编程方式自动旋转UIScrollView和UIImageView?

调整 UIView 的大小以适应 uiScrollView 中的所有内容