我对Apple文档Moving content located under the keyboard中的代码有疑问。我已经对此进行了研究,但在我开始对替代解决方案开始变幻想之前,我正在寻找有关我在这里模糊的概念的澄清。
不幸的是,只要键盘动画完成向上移动键盘,视图就会向下移动并完全脱离现场。无论文本字段实际上是否被键盘覆盖,都会发生这种情况。所以现在我又回来试图理解文档中提供的代码,在尝试更改各种参数后,我无法使其正常工作。
Apple提供的相关代码是:
- (void)keyboardWasShown:(NSNotification*)aNotification
NSLog(@"keyboardWasShown");
NSDictionary* info = [aNotification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
scrollView.contentInset = contentInsets;
scrollView.scrollIndicatorInsets = contentInsets;
// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;
if (!CGRectContainsPoint(aRect, activeField.frame.origin) ) {
NSLog(@"if");
CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
NSLog(@"scrollPoint is %@", NSStringFromCGPoint(scrollPoint));
[scrollView setContentOffset:scrollPoint animated:YES];
首先,在我改变任何内容之前,如下所述,这是我得到的:
GO[4614:c07] keyboardWasShown
2012-09-08 22:58:23.892 DRO GO[4614:c07] if
2012-09-08 22:58:23.892 DRO GO[4614:c07] scrollPoint is {0, -281}
所以,打破它:
NSLog只是告诉我方法的信息
NSDictionary - 包含有关键盘的信息,包括其尺寸,以便自动考虑不同设备或方向中的不同键盘尺寸。
CGSize - 从词典中获取实际大小
UIEdgeInsets - 在UIKit函数参考中找到参考 - 为按钮或视图创建边缘插图,其中插图是绘图矩形周围的边距,其中每一边(左,右,顶部和底部)可以有不同的边值。在这种情况下,将底边设置在键盘的高度。由于我的观点是向下移动而不是向上移动,我试图反转“顶部”和“底部”值,认为它们可能是倒置的。而不是视图使用动画顺利滚动,现在当键盘弹出时它只是眨眼,我得到了这个:
GO [4829:c07]如果 2012-09-08 23:06:57.146 DRO GO [4829:c07] scrollPoint是{0,-281}
scrollView.contentInset:内容视图从封闭滚动视图中插入的距离。 使用此属性可添加到内容周围的滚动区域。单位是点。默认值为UEdgeInsetsZero 这似乎应该是在滚动视图的底部添加区域,以允许它与键盘一起向上移动。
scrollView.scrollIndicatorInset - 告诉滚动指示器按比例移动到视图移动以响应键盘
CGRect - 使用视图尺寸创建aRect对象。
aRect - CGRect的高度值,减去键盘的高度。我在这里超级模糊 - 应该是键盘未覆盖的视图区域。
if - 如果CGpoint不是(在键盘下方的矩形中,在活动文本字段内的某个点) - 这没有意义;这里的逻辑逃脱了我
NSLog - 告诉我,我们到目前为止
CGScrollPoint - 定义视图应滚动到的点。由于视图原点是左上角,因此减去键盘高度应使其向上滚动键盘高度的距离,使文本字段保持在视图中。只是为了踢,当我尝试将其更改为+ kbSizeHeight时,我的视图迅速消失并且:GO [4682:c07] 2012-09-08 23:02:48.078 DRO GO [4682:c07] scrollPoint是{0,679}
NSLog - 告诉我要将视图移动到哪个滚动点
[scrollView - 告诉scrollView使用动画调整到新的scrollPoing
答案 0 :(得分:4)
我不知道Apple是如何做到的,我相信他们建议将内容放入滚动视图,然后当您点击文本字段时,您告诉滚动视图向上滚动以便您可以看到您正在键入的内容。
我是一个懒惰的人,所以我所做的就是告诉视图本身在用户点击将被键盘隐藏的字段时向上移动。
我通常这样做:
// shift view up
self.view.transform = CGAffineTransformMakeTranslation(0, -someYOffsetValue);
// shift view back down to original value
self.view.transform = CGAffineTransformMakeTranslation(0, 0);
您可以将其包装在UIView animateWithDuration:块中以实现平滑过渡。