我设置滚动视图偏移量以显示键盘隐藏的文本字段。如果用户在显示键盘时滚动,则滚动视图会向下捕捉

时间:2015-09-02 07:53:12

标签: ios swift

正如标题所说,我在UIScrollView中有一个UITextField。显示键盘时,我调整滚动视图的contentOffset,以隐藏文本字段。问题是文本字段是否位于滚动视图的底部。弹出键盘时,滚动视图会根据需要进行调整。但是,如果用户触摸并滚动键盘上方的区域,则滚动视图会向下捕捉。直觉上,这是有道理的,因为我以编程方式滚动滚动视图,但从用户的角度来看,这并不好。

我该怎么办?我想到的一件事是移动整个滚动视图框而不是设置内容偏移。我不知道该怎么做。我对存储在CGFloat中的偏移量进行了所需的更改。有人可以帮忙吗?

3 个答案:

答案 0 :(得分:1)

您需要更改contentInsetcontentOffset是当前滚动位置,因此当用户滚动时,它将被重置。

可在此处找到此示例:https://stackoverflow.com/a/16806736/78496

答案 1 :(得分:0)

您可以做的一件事是收听UIKeyboardWillShowNotificationUIKeyboardWillHideNotification系统通知,了解何时修改UIScrollViewcontentInset。您可以在viewWillAppear:

执行此操作
- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification
                                               object:nil];

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

不要忘记以观察者身份移除自己,

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}

当键盘显示或隐藏时,您可以根据键盘的高度调整contentInset

- (void)keyboardWillShow:(NSNotification *)notification {
    CGRect keyboardEndFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
    UIEdgeInsets scrollInsetWithKeyboard = UIEdgeInsetsMake(0, 0, 0, -keyboardEndFrame.height, 0)
    self.scrollView.contentInset = scrollInsetWithKeyboard; // If you have a custom inset maybe now would be a good idea to save it so you can restore it later
}

- (void)keyboardWillHide:(NSNotification *)notification {
    self.scrollView.contentInset = UIEdgeInsetsZero; // Or to whatever inset you had before
}

当这两种方法被触发时,如果您愿意,还可以为contentOffset设置动画。

答案 2 :(得分:-1)

您应该使用此库:https://github.com/hackiftekhar/IQKeyboardManager

真的很棒,你只需要在你的项目中添加这个lib,它将管理你所有的文本域。你有零行代码来实现这个lib,它是自动的。我在我的所有项目中使用它并且它在任何地方都可以正常工作(对于单元格中的文本字段,tableview,scrollview ...)