自动滚动 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 内的 UIWebView 框架不会拉伸大小以适应所有内容