【问题标题】:Autoscroll UIScrollView to fit content like in native iOS Mail.app自动滚动 UIScrollView 以适应原生 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);

}

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

【问题讨论】:

    标签: iphone ios objective-c cocoa-touch uiscrollview


    【解决方案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 并且是可定制的
    • 哇,非常感谢!我一定会试一试并报告结果!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-18
    相关资源
    最近更新 更多