正如标题所说,我在UIScrollView中有一个UITextField。显示键盘时,我调整滚动视图的contentOffset,以隐藏文本字段。问题是文本字段是否位于滚动视图的底部。弹出键盘时,滚动视图会根据需要进行调整。但是,如果用户触摸并滚动键盘上方的区域,则滚动视图会向下捕捉。直觉上,这是有道理的,因为我以编程方式滚动滚动视图,但从用户的角度来看,这并不好。
我该怎么办?我想到的一件事是移动整个滚动视图框而不是设置内容偏移。我不知道该怎么做。我对存储在CGFloat中的偏移量进行了所需的更改。有人可以帮忙吗?
答案 0 :(得分:1)
您需要更改contentInset
。 contentOffset
是当前滚动位置,因此当用户滚动时,它将被重置。
答案 1 :(得分:0)
您可以做的一件事是收听UIKeyboardWillShowNotification
和UIKeyboardWillHideNotification
系统通知,了解何时修改UIScrollView的contentInset
。您可以在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 ...)