ios - 键盘重叠时向上移动 UITextField

标签 ios objective-c iphone uiscrollview autolayout

在 ViewA 之上有一个 subview 。请在下面找到屏幕布局。当键盘在选择 UITextField 时显示,即使它不与 UITextField 重叠, View 也会向上滚动。

ViewA
  -> UIButton

subView
  -> UIScrollView
        -> UITextField
        -> UITextField


   ViewA
 -----------
|           |
|           |
|  Button   |
|           |
|           |
 -----------

   subView
 --------------
|              |
|              |
|  UITextField |
|  UITextField |
|              |
 --------------

我已经注册了键盘通知

    - (void) viewWillAppear:(BOOL)animated {

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardDidShow:)
                                                     name:UIKeyboardDidShowNotification
                                                   object:nil];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillBeHidden:)
                                                     name:UIKeyboardWillHideNotification
                                                   object:nil];
    }


- (void) keyboardDidShow:(NSNotification *)notification {

            NSDictionary* info = [notification userInfo];
            CGRect kbRect = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];

            UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbRect.size.height, 0.0);
            self.scrollViewIb.contentInset = contentInsets;
            self.scrollViewIb.scrollIndicatorInsets = contentInsets;

            CGRect aRect = self.viewSelf.frame;
            aRect.size.height -= kbRect.size.height;
            CGRect frame = [self.viewSelf convertRect:self.activeField.frame toView:self.viewSelf.superview];
            if (!CGRectContainsPoint(aRect, frame.origin) ) {
                [self.scrollViewIb scrollRectToVisible:self.activeField.frame animated:YES];
            }
    }

- (void) keyboardWillBeHidden:(NSNotification *)notification {

        self.scrollViewIb.scrollEnabled = true;

        UIEdgeInsets contentInsets = UIEdgeInsetsZero;
        self.scrollViewIb.scrollIndicatorInsets = contentInsets;
        [self.scrollViewIb setContentOffset:CGPointZero animated:false];

}

最佳答案

坐标系转换有一个小错误:convertRect:toView:从接收器的坐标系 转换为传递的 View 的坐标。

如果 self.activeField.frame 如代码所示是 self.scrollViewIb 坐标系中的一个矩形,那么转换应该是这样的...

    CGRect frame = [self.scrollViewIb convertRect:self.activeField.frame toView:self.view];

请注意,我还建议将 self.viewSelf.superview 更改为 self.view。如果此代码在包含所有这些 subview 的 View Controller 中运行,则 self.view 应该足够且正确。

关于ios - 键盘重叠时向上移动 UITextField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44120176/

相关文章:

ios - iOS 是否存在导致应用程序崩溃的内存限制?

iOS - 限制使用单个应用程序

iphone - 如何使 NSManagedObject NSString 属性与 "copy"而不是 "retain"?

iPhone如何调试客户手机

ios - AVCaptureVideoPreviewLayer 能够使用 Quicktime 在横向模式下进行录制

ios - 在 iOS 应用程序中采用侧边菜单。查看 Controller 结构问题

ios - 从 TabBar View Controller 中移除 UIElement

objective-c - 将文字字符串分配给具有 "="的 NSString 实际上有什么作用?

iphone - 发布到 Facebook 好友墙而不是使用 iOS 发送通知

ios - NSDate 语言环境在将 NSDateFormatter 与 NSString 和 NSDate 一起使用时导致其他语言环境出现问题