当用户点击UITextField时,键盘将出现。我向上滚动UITextField使其位于键盘上方。在iPhone上运行正常:

- (void) someWhere
{
    [[NSNotificationCenter defaultCenter]
        addObserver:self
        selector:@selector(onKeyboardShow:)
        name:UIKeyboardWillShowNotification
        object:nil];
}

- (void) onKeyboardShow:(NSNotification *)notification
{
    CGRect keyboardRect = [[[notification userInfo]
        objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue
    ];

    if (keyboardRect.size.height >= IPAD_KEYBOARD_PORTRAIT_HEIGHT) {
        self.containerView.y = self.containerView.y - keyboardRect.size.width;
    } else {
        self.containerView.y = self.containerView.y - keyboardRect.size.height;
    }
}

但是,它在iPad上已损坏。在iPad上,模态视图 Controller 可以显示为仅占据屏幕一部分的表格。您会看到最后一个UITextField与iPad上的键盘之间存在间隙。
UINavigationController* nav = [[UINavigationController alloc]
    initWithRootViewController:someRootViewController];
nav.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentViewController:nav animated:YES completion:nil];

我需要从屏幕底部检测模态视图的偏移并将其添加到UITextField的Y坐标。这将使UITextField与键盘顶部齐平。通过一些逆向工程,我遍历了未记录的 View 层次结构,从而获得了模态视图的框架:
- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // describe is a category function on UIView that prints out the frame
    [self.viewController.view.superview.superview.superview.superview describe];
}



最后,要从屏幕底部获取模态视图的偏移量,请执行以下操作:
UIView* modalView = self.viewController.view.superview.superview.superview.superview;
// usage of self-explanatory UIView category methods
CGFloat bottomOffset = modalView.superview.height - (modalView.y + modalView.height);

令我烦恼的是,这仅适用于纵向模式。由于某种原因,无论iPad处于什么方向,模态视图的 super View 始终固定在768的宽度和1024的高度。因此,这是我寻求帮助的地方。在iPad上,无论方向如何,如何可靠地获取模态视图与屏幕底部的偏移量?

最佳答案

我看到两种可能的解决方案:

  • 使用 inputAccessoryView 将文本字段自动附加到键盘。
  • 将键盘rect转换为您要移动的containerView的superview。然后,您可以在containerView的 super View 的坐标中获取其顶部Y值。

  • 就像是:
    CGRect rectInWindowCoordinates = [self.containerView.window convertRect:keyboardRect fromWindow:nil];
    CGRect rectCoveredByKeyboard = [self.containerView.superview convertRect:rectInWindowCoordinates fromView:nil];
    CGFloat top = CGRectGetMinY(rectCoveredByKeyboard);
    self.containerView.y = top - self.containerView.frame.size.height;
    

    关于ios - 如何在iPad上计算模态视图的底部偏移?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18776275/

    10-09 16:31