为啥当键盘弹出时我的 UIScrollView 滚动错误?
Posted
技术标签:
【中文标题】为啥当键盘弹出时我的 UIScrollView 滚动错误?【英文标题】:Why is my UIScrollView scrolling the wrong way when keyboard pops up?为什么当键盘弹出时我的 UIScrollView 滚动错误? 【发布时间】:2013-02-27 01:39:38 【问题描述】:因此,正如那些希望在键盘出现时将视图向上推的人们经常建议的那样,我使用 UIScrollView。我复制并粘贴了此页面上的信息 -- http://developer.apple.com/library/ios/#documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html#//apple_ref/doc/uid/TP40009542-CH5-SW7 -- 来做到这一点......
但是发生的情况是,当我点击文本字段时,键盘弹出,但视图实际上向下滚动,顶部显示黑色。之后,我实际上可以手动向上滚动视图并显示隐藏的文本字段......显然,这不是我想要做的!
有什么想法吗?我在 viewDidLoad() 方法中有以下内容:- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
我试过这个版本的keyboardWasShown:
- (void) keyboardWasShown:(NSNotification *)aNotification
NSDictionary * info = [aNotification userInfo];
CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 0,keyboardSize.height, 0);
[[self introScroll] setContentInset:contentInsets];
[[self introScroll] setScrollIndicatorInsets:contentInsets];
CGRect ltdRect=[[self view] frame];
ltdRect.size.height=keyboardSize.height;
if (!CGRectContainsPoint(ltdRect,[self activeField].frame.origin))
CGPoint scrollPoint = CGPointMake(0,[self activeField].frame.origin.y-keyboardSize.height);
[[self introScroll] setContentOffset:scrollPoint animated:YES];
NSLog(@"Keyboard out!");
还有这个版本的keyboardWasShown:
- (void)keyboardWasShown:(NSNotification*)aNotification
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
CGRect bkgndRect = [[[self activeField] superview ]frame];
bkgndRect.size.height += kbSize.height;
[[[self activeField] superview] setFrame:bkgndRect];
[[self introScroll] setContentOffset:CGPointMake(0.0, [self activeField].frame.origin.y-kbSize.height) animated:YES];
两者都给我完全相同的结果。
怎么了??我正在使用 Xcode 4.6。
【问题讨论】:
我的解决方案? AlexWien 的“将 44 添加到 scrollpoint.y”——除了我将其设为 344。:) 现在它可以工作了。 :) 谢谢,亚历克斯...顺便说一句,有什么方法可以使向上滚动与键盘同步,以便它们同时移动? 我在下面发布的解决方案不再适用于 ios7。你也为ios7解决了这个问题吗?怎么样? 【参考方案1】:我遇到了类似的问题,我的文本字段没有滚动到视图中。 苹果代码并不完美,我不得不修改它: 尝试通过在行中添加活动字段的高度来解决这个问题:
frame.origin.y + frame.size.height - keyboardSize.height
如果这不起作用,请将 44 添加到 scrollpoint.y(导航栏大小)
ios7 更新:
我改进了 ios7 中文本字段的不必要和错误滚动,这些字段已经在视图中 由
if (scrollPtY < 0)
return;
【讨论】:
谢谢,但没有这样做;它仍在向下滚动而不是向上滚动。 :(以上是关于为啥当键盘弹出时我的 UIScrollView 滚动错误?的主要内容,如果未能解决你的问题,请参考以下文章