【问题标题】:UITextField in UIScrollviewUIScrollview 中的 UITextField
【发布时间】:2014-11-12 22:53:40
【问题描述】:

我有一个简单的UIScrollView,其中包含 2 个UITextFields,还有一段对我来说没有任何意义的代码,但它正在工作。

这是屏幕(我使用的是自动布局):

代码如下:

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillHide:)
                                                 name:UIKeyboardWillHideNotification
                                               object:nil];
}

- (void)keyboardWillShow:(NSNotification*) notif
{
    NSDictionary *info = [notif userInfo];
    CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
    keyboardRect = [self.view convertRect:keyboardRect fromView:nil];

    UIEdgeInsets contentInset = self.scrollView.contentInset;
    contentInset.bottom = keyboardRect.size.height;
    self.scrollView.contentInset = contentInset;
}

- (void) keyboardWillHide:(NSNotification*) notif
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    _scrollView.contentInset = contentInsets;
}

我希望将滚动视图向上移动 352 点(键盘的高度),因为这是我将 contentInset.bottom 设置为的值,并且选择哪个 UITextField 并不重要,因为高度键盘总是一样的。

但是结果是它向上滚动,所以作为第一响应者的UITextField 不会被键盘覆盖。因此,在底部UITextField 的情况下滚动更多,在顶部的情况下滚动更少。这看起来当然比我预期的结果要好得多,但我不知道为什么它会起作用。有人解释一下吗?

【问题讨论】:

    标签: ios uiscrollview


    【解决方案1】:

    发生这种情况的原因是更改内容插图仅更改插图,它实际上并没有更改滚动视图的 contentOffset。

    请参阅这篇关于滚动键盘视图的 SO 帖子:How do I scroll the UIScrollView when the keyboard appears?

    从那篇文章中,我认为您需要在最后滚动视图以显示两个字段的部分:

    // 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) ) {
            CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height);
            [scrollView setContentOffset:scrollPoint animated:YES];
        }
    

    【讨论】:

    • 感谢您的回答。我对它的工作方式很满意,我只是不明白为什么它会起作用。对我来说,contentInset 中的“内容”指的是UITextFields 以及它们周围由contentSize 定义的空间。我不明白UIScrollView 如何知道哪个UITextField 处于活动状态并准确滚动到那里。
    • Levi,它可能正在寻找当前的响应者(即 becomeFirstResponder)并滚动到该响应者的框架。
    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    相关资源
    最近更新 更多