UITextField辞职第一响应者后如何更改UIScrollView contentSize
Posted
技术标签:
【中文标题】UITextField辞职第一响应者后如何更改UIScrollView contentSize【英文标题】:How to change UIScrollView contentSize after UITextField resigns first responder 【发布时间】:2013-02-20 02:59:27 【问题描述】:我正在编写一个 iPhone 应用程序,我有一些 UITextfields 会在键盘出现时被覆盖;因此,我将 UITextFields 放在 UIScrollView
中,并将自己设置为委托,这样当键盘激活时,就会调用此方法:
-(void) textFieldDidBeginEditing:(UITextField *)textField
self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
[self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
请注意,我将 contentSize 设置得更高,这样即使文本字段成为焦点,用户仍然可以滚动。
同样,当文本字段退出第一响应者状态时,会调用此方法:
-(void) textFieldDidEndEditing:(UITextField *)textField
[self.myScrollView setContentOffset:CGPointMake(0, 0) animated:YES];
self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width,self.myScrollView.frame.size.height);
请注意,一旦放下键盘,所有内容都可见,因此无需启用滚动(contentSize = frame.size)。
但是,我的问题是因为我在设置 contentOffset 之后立即设置 contentSize,所以 setContentOffset 动画没有时间完成。相反,动画看起来非常生涩。有什么建议吗?
【问题讨论】:
【参考方案1】:使用 UIKeyboardDidShowNotification 和 UIKeyboardWillHideNotification 是个好主意:
第1步:监听两个通知
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardDidShow:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
第 2 步:在键盘显示时做一些事情
- (void)keyboardDidShow:(NSNotification*)notification
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
BOOL Need_Resize; // judge by yourself
if (Need_Resize)
double offset; // judge by yourself
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDelegate:self];
[UIView setAnimationDuration:0.5];
[UIView setAnimationBeginsFromCurrentState:YES];
[self.view setCenter:CGPointMake(self.view.center.x, self.view.center.y - offset];
[UIView commitAnimations];
第 3 步:在键盘隐藏时做一些事情
// in animation code, set the view back to the original place
[self.view setCenter:CGPointMake(self.view.center.x, self.view.frame.size.height/2)];
这个方案不需要UIScrollView,只需要调整view的位置,加上动画就够了。
【讨论】:
【参考方案2】:这个呢? 不知道它是否会起作用,但只是从我的头顶开始:
[UIView animateWithDuration:0.5
animations:^
self.myScrollView.contentSize = CGSizeMake(self.myScrollView.contentSize.width, 560);
completion:^(BOOL finished)
[self.myScrollView setContentOffset:CGPointMake(0, 200) animated:YES];
];
祝你好运
【讨论】:
【参考方案3】:您可以尝试使用scrollRectToVisible:animated: 并将其传递给您的文本字段的矩形或CGRectZero
,而不是设置内容偏移量,具体取决于您要去的方向。
【讨论】:
以上是关于UITextField辞职第一响应者后如何更改UIScrollView contentSize的主要内容,如果未能解决你的问题,请参考以下文章
iPhone-在 UITextField 上辞职第一响应者后,无法重新聚焦
Swift 如何让所有 uiTextfield 上的第一响应者辞职