如何在屏幕上移动UITextField,使其不在iOS7中被键盘覆盖,然后在键盘被解除后将其返回到UIView内的原始位置?如何移动UITextField以响应iOS7中出现和消失的键盘?
回答
在Viewcontroller.h
@interface ViewController : UIViewController<UITextFieldDelegate>
{
CGFloat animatedDistance;
}
在ViewController.M
//粘贴任何地方低于4行上的类(的方法外)
static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3;
static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2;
static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8;
static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216;
在委托方法是
-(void)textFieldDidBeginEditing:(UITextField *)textField
{
CGRect textFieldRect =
[self.view.window convertRect:textField.bounds fromView:textField];
CGRect viewRect =
[self.view.window convertRect:self.view.bounds fromView:self.view];
CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height;
CGFloat numerator =
midline - viewRect.origin.y
- MINIMUM_SCROLL_FRACTION * viewRect.size.height;
CGFloat denominator =
(MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION)
* viewRect.size.height;
CGFloat heightFraction = numerator/denominator;
if (heightFraction < 0.0)
{
heightFraction = 0.0;
}
else if (heightFraction > 1.0)
{
heightFraction = 1.0;
}
animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction);
CGRect viewFrame = self.view.frame;
viewFrame.origin.y -= animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
CGRect viewFrame = self.view.frame;
viewFrame.origin.y += animatedDistance;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION];
[self.view setFrame:viewFrame];
[UIView commitAnimations];
}
非常感谢,它适合你 –
哇!一些比较古老的动画方法。鉴于问题标题问iOS 7,这是一个遗憾,你发布这一点 - 他们相当气馁。 – Luke
你必须赶上UIKeyboardWillShowNotification
的通知,并编辑你的帧以将UITextField移动到正确的位置(例如通过使用[UIView animateWithDuration:(NSTimeInterval)动画:^(void)动画])。
这里是一个示例...
在init
,在UIKeyboardWillShowNotification
添加一个观察者:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow) name:UIKeyboardWillShowNotification object:nil];
然后添加- keyboardWillShow
方法来更新您的视图(假设_textfield
是你UITextField
的名称) :
- (void)keyboardWillShow {
NSLog(@"Show Keyboard");
[UIView animateWithDuration:.2 animations:^{
[_textField setFrame:_textField.frame];
[_textField setFrame:CGRectMake(_textfield.frame.origin.x, _textfield.frame.origin.y - 240, _textfield.frame.size.width, _textfield.frame.size.height)];
}];
}
您可以使用UIKeyboardWillShowNotification
通知n来执行反向操作。
我推荐使用UIScrollView将内容向上移动,当显示键盘时。 另请参阅Apple discourages us使用自定义常量的键盘大小:其他语言可能有不同的大小。正确的尺寸是嵌入在通知的用户信息:
获得通知键盘变化:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeShown:)
name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
记住清除观察者这样的:
-(void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
这些方法处理的键盘变化:
- (void)keyboardWillBeShown:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
CGRect kbRect = [self.view.window convertRect:[[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue] fromView:self.scrollView];
CGSize kbSize = kbRect.size;
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
}
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
NSDictionary* info = [aNotification userInfo];
NSTimeInterval duration = [info[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
[UIView animateWithDuration:duration animations:^{
UIEdgeInsets contentInsets = UIEdgeInsetsZero;
self.scrollView.contentInset = contentInsets;
self.scrollView.scrollIndicatorInsets = contentInsets;
}];
}
当然你也可以操作fra使用这些方法的UITextView的我。
- 1. 键盘出现时向上移动UITextField
- 2. 当UITextField弹出键盘时,UIView消失
- 3. UITextField键盘不会消失
- 4. 当键盘出现时将UITextField和UITableView向上移动
- 5. 动态UITextfield不响应键盘输入
- 6. 如何自动移动UIScrollView以使UITextfield基于键盘可见?
- 7. UISeachBar和键盘出现,消失,然后再次出现
- 8. BottomNavigationBar在键盘出现时消失
- 9. 移动位于键盘下的UITextField
- 10. UITextField无法响应屏幕键盘按?
- 11. 移动焦点以响应XAML中的键盘事件
- 12. 在UITextField中退出键盘
- 13. 如何检测Android键盘出现/消失的时间? (5.02)
- 14. 如何使键盘消失?
- 15. 如何让键盘消失?
- 16. 如何让键盘消失?
- 17. 检测国际键盘的出现和消失
- 18. 键盘出现时移动UIView
- 19. 当键盘出现时移动视图
- 20. 键盘出现时移动UIView
- 21. UITableViewController和UITextField键盘
- 22. 当键盘出现时,如何停止tableView以外的标题消失
- 23. UITextField自定义键盘和对设备方向的响应
- 24. 如何在键盘出现点击时管理UITextField的高度?
- 25. 如何移除在onCreate时自动出现的键盘?
- 26. 当UITextField成为第一响应者时自动使用键盘
- 27. 如何使BalloonPopupExtender出现并通过键盘上的Tab键消失?
- 28. 移动视图以适应键盘
- 29. UItextview在iPhone应用程序中上下移动(当键盘出现并消失时)
- 30. UITextField的键盘不会消失。不,真的
[如何使键盘存在时使UITextField向上移动]的可能重复(http://stackoverflow.com/questions/1126726/how-to-make-a-uitextfield-move-up-when-keyboard- is-present) – katzenhut
将其标记为重复。此外,你还问过之前谷歌这个? – katzenhut
我需要UItextfield向上滚动当用户输入第一个字母在文本域 – user3182143