1

我对位于键盘下方的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}

所以,分解它:

  1. NSLog 只是我的信息,表明该方法被调用

  2. NSDictionary - 包含有关键盘的信息,包括其尺寸,以便自动考虑不同设备或方向中的不同键盘尺寸。

  3. CGSize - 从字典中获取实际大小

  4. UIEdgeInsets - 在 UIKit 函数参考中找到参考 - 为按钮或视图创建边缘插入,其中插入是绘图矩形周围的边距,其中每一边(左、右、顶部和底部)可以具有不同的值。在这种情况下,将底部边缘设置为键盘的高度。由于我的视图是向下移动而不是向上移动,因此我尝试颠倒“顶部”和“底部”值,认为它们可能是颠倒的。而不是视图随着动画顺利向下滚动,现在它只是在键盘弹出时闪烁而看不见,我得到了这个:

    GO[4829:c07] 如果 2012-09-08 23:06:57.146 DRO GO[4829:c07] 滚动点为 {0, -281}

  5. scrollView.contentInset:内容视图插入到封闭滚动视图的距离。使用此属性可添加到内容周围的滚动区域。大小的单位是点。默认值是UIEdgeInsetsZero 看起来这应该是在滚动视图的底部添加区域以允许它与键盘一起向上移动。

  6. scrollView.scrollIndicatorInset - 告诉滚动指示器按比例移动以响应键盘的视图移动

  7. CGRect - 创建一个具有视图尺寸的 aRect 对象。

  8. aRect - CGRect 的高度值,减去键盘的高度。我在这里超级模糊-应该是键盘未覆盖的视图区域。

  9. if - 如果 CGpoint 不是(在位于键盘下方的矩形中,在活动文本字段内的某个点) - 这没有意义;这里的逻辑让我无法理解

  10. NSLog - 告诉我我们已经走到了这一步

  11. CGScrollPoint - 定义视图应该滚动到的点。由于视图原点是左上角,减去键盘高度应该让它向上滚动键盘高度的距离,保持文本字段在视图中。只是为了好玩,当我尝试将其更改为 +kbSizeHeight 时,我的视图迅速消失并且: GO[4682:c07] if 2012-09-08 23:02:48.078 DRO GO[4682:c07] scrollPoint is {0, 679 }

  12. NSLog - 告诉我视图要移动到哪个滚动点

  13. [scrollView - 使用动画告诉scrollView 适应新的scrollPoing

4

1 回答 1

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: 块中以实现平滑过渡。

于 2012-09-10T04:37:22.690 回答