【问题标题】:How to move up a UIScrollView when keyboard appears?键盘出现时如何向上移动 UIScrollView?
【发布时间】:2015-02-15 18:24:15
【问题描述】:

更新:

我的问题是:如何防止在单击另一个文本字段时将滚动视图重置到该位置?

其实我试过好几种方法,比如这个question的解决方法。

原来,我的scrollView(里面有多个textfield和textview,所有的位置都放在storyboard中)在位置(0, 302)。当键盘出现时,我想将它上移到 (0, 100)。首先,我尝试添加一个按钮并执行以下操作,它可以工作。

CGRect frame = self.informationScrollView.frame;
frame.origin.y = 100;
self.informationScrollView.frame = frame;

然后我尝试在 UIKeyboardDidShowNotification 的选择器中执行相同的代码,但它失败了。我发现即使活动 textField 发生更改,位置也总是会重置。谁能告诉我如何防止应用程序重置位置?非常感谢。

【问题讨论】:

  • 为什么不试试滚动视图的内容偏移量

标签: ios objective-c xcode uiscrollview keyboard


【解决方案1】:
CGRect frame = self.informationScrollView.frame;

[UIView animateWithDuration:1
                      delay:0
                    options: UIViewAnimationOptionCurveEaseInOut
                 animations:^{

                 self.informationScrollView setFrame:CGRectMake (frame.origin.x,
                                                                 frame.origin.y, 
                                                                 frame.size.width, 
                                               <change height as per requirement>);
                 }
                 completion:nil];

对于多个文本字段:

How to make a UITextField move up when keyboard is present?

希望这会有所帮助。

【讨论】:

  • 不,我要改的是frame.origin.y
  • 根据您的要求更新帧值,这只是一个示例代码。在您的情况下,将 Y 值设为 (frame.origin.y - )
  • 是的,它在开始时有效。但是当我点击另一个 textField 时,scrollView 会回到原来的位置(在情节提要中设置),我该如何防止呢?
  • 在这种情况下,我建议你做另一件事。检查我在回答中的更新。
  • 我也在我的问题上粘贴了链接。
【解决方案2】:

如果 ypu 正在使用 UIScrollView,那么您应该查看TPAvoidingScrollView。它易于使用并给出预期的结果。您只需将 TPAvoidingScrollView 设置为 UIScrollView 的超类,TPScrollView 将处理所有事情。就试一试吧。希望这会有所帮助。

【讨论】:

  • Moar 对此表示赞同,请。非常容易插入,非常宽松的许可证——没有理由不这样做。
【解决方案3】:

非常简单,在你的 viewDidLoad 方法中使用它

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

并针对其中的键盘高度编写滚动视图的代码

-(void)keyboardWasShown:(NSNotification*)notification
{
NSDictionary *info = [notification userInfo];
CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(self.view.frame.origin.x,self.view.frame.origin.y, kbSize.height+100, 0);
self.scrollViewChildDetail.contentInset = contentInsets;
self.scrollViewChildDetail.scrollIndicatorInsets = contentInsets;
}

-(void)keyboardWillBeHidden:(NSNotification *)notification
{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollViewChildDetail.contentInset = contentInsets;
self.scrollViewChildDetail.scrollIndicatorInsets = contentInsets;
}

它有效。

【讨论】:

  • 谢谢,但似乎只是向上移动了滚动视图的内容,而不是滚动视图。
  • 是的,这和你想要的一样。在显示键盘时移动滚动视图的编程很糟糕。我们在这里设置了滚动视图的内容而不是完整的滚动视图。
  • 但是我也想把scrollView上移,因为一开始内容只显示在手机底部,当键盘出现时,键盘会隐藏所有的scrollview。因此我需要向上移动整个滚动视图
  • 那么您只需在上述方法中设置滚动视图框架。
  • 那么这就是我的问题所在。当点击另一个 textField 时,滚动视图的框架总是被重置。
【解决方案4】:

使用@Sarat_Patel 解释的NSNotificationCenter 的最佳概念

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

并使用本地方法处理:

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

【讨论】:

  • 同理。亲爱的@DSP无需一而再再而三的回答
【解决方案5】:

使用 UIScrollView 的最佳做法是根据键盘的外观设置 contentInsetsscrollIndicatorInsets。如果滚动视图的内容是您的 UITextField 和 UITextView 实例,那么您应该通过 contentOffset 偏移滚动视图内容,而不是移动滚动视图的框架。

话虽这么说,如果您真的需要移动滚动视图并使其弹回,这可能与布局约束有关。

【讨论】:

  • 谢谢。也许我应该阅读更多示例,因为我是 iOS 开发新手,对 contentInsets、scrollIndicatorInsets 和 contentOffset 不太熟悉。我能做的是从“管理键盘:文本编程指南”的示例中复制代码,但不知道为什么是这样。
【解决方案6】:

这是 Apple 官方批准的方法:Managing The Keyboard: Text Programming Guide

但是,如果您使用 Autolayout,我建议您使用约束来管理 UITextView 和屏幕底部之间的空间,并以编程方式更改它的常量值以匹配键盘高度的值上述文章中提到的键盘显示通知以及此处的其他解决方案。这是因为您可以收到多个不同高度的键盘显示通知,如果您尝试切换视图框架,这些通知可能会中断。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    相关资源
    最近更新 更多