Xcode / iOS5:出现键盘时向上移动UIView
当显示键盘时,我想提出我的看法。 键盘(身高:216)应该推高我的看法,它的高度。 这是可能的一个简单的代码?
要移动视图,只需更改其center
。 首先,将原始的一个保存在CGPoint
属性中。
- (void)viewDidLoad { ... self.originalCenter = self.view.center; ... }
然后,在键盘显示时根据需要更改:
self.view.center = CGPointMake(self.originalCenter.x, /* new calculated y */);
最后,在隐藏键盘时恢复它:
self.view.center = self.originalCenter;
根据需要添加animation糖
您有多种方式知道键盘何时出现。
观察UIKeyboardDidShowNotification通知。
/* register notification in any of your initWithNibName:bundle:, viewDidLoad, awakeFromNib, etc. */ { ... [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; ... } - (void)keyboardDidShow:(NSNotification *)note { /* move your views here */ }
用UIKeyboardDidHideNotification
做相反的UIKeyboardDidHideNotification
。
-要么-
实现UITextFieldDelegate
在编辑开始/结束时检测以移动视图。
- (void)textFieldDidBeginEditing:(UITextField *)textField { /* keyboard is visible, move views */ } - (void)textFieldDidEndEditing:(UITextField *)textField { /* resign first responder, hide keyboard, move views */ }
根据实际的文本字段,您可能需要跟踪用户编辑的字段,请添加一个计时器以避免移动视图太多。
这样做。 在键盘可见之后使用这个代码
- (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,-10,320,480); [UIView commitAnimations]; }
这是实现这个最简单有效的方法:
添加以下常量:
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; static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 162;
添加到您的视图控制器:
CGFloat animatedDistance;
并将这些方法添加到您的代码中:
- (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; } UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown) { animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction); } else { animatedDistance = floor(LANDSCAPE_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]; }
除了我调整了视图的框架原点而不是中心之外,我以类似于djromero的方式做了这个。
我正在移动的视图是UIScrollView,我希望它相对于UITextField元素移动,以便文本字段始终显示。 该文本字段的位置可以根据滚动视图的偏移而变化。
所以我的代码如下所示:
- (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil]; } - (BOOL)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; dispatch_async(dispatch_get_main_queue(), ^{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; self.scrollView.frame = CGRectMake(0,0,self.scrollView.frame.size.width,self.scrollView.frame.size.height); [UIView commitAnimations]; }); return YES; } - (NSInteger)getKeyBoardHeight:(NSNotification *)notification { NSDictionary* keyboardInfo = [notification userInfo]; NSValue* keyboardFrameBegin = [keyboardInfo valueForKey:UIKeyboardFrameBeginUserInfoKey]; CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue]; NSInteger keyboardHeight = keyboardFrameBeginRect.size.height; return keyboardHeight; } -(void) keyboardDidShow:(NSNotification*) notification { NSInteger keyboardHeight; keyboardHeight = [self getKeyBoardHeight:notification]; NSInteger scrollViewFrameHeight = self.scrollView.frame.size.height; NSInteger textFieldRelativePosition = self.tableView.frame.origin.y - self.scrollView.contentOffset.y; NSInteger textFieldFrameOffset = scrollViewFrameHeight - textFieldRelativePosition; NSInteger movement = MAX(0,keyboardHeight-textFieldFrameOffset); // Offset from where the keyboard will appear. dispatch_async(dispatch_get_main_queue(), ^{ [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:0.2]; [UIView setAnimationCurve:UIViewAnimationCurveLinear]; self.scrollView.frame = CGRectMake(0,-movement, self.scrollView.frame.size.width, self.scrollView.frame.size.height); [UIView commitAnimations]; }); }
视图控制器是一个UITextFieldDelegate,并且还订阅了UIKeyboardDidShowNotification,以便我们能够访问键盘的大小。
当键盘显示时,我们计算UITextField(调整滚动偏移量)和键盘的相对偏移量,它们改变了UIScrollView的原点,使它移动到足以让UITextField仍然显示。
如果即使出现键盘,UITextField仍然会显示,那么原点不会改变。
标记,苹果文档: pipe理键盘 – 移动位于键盘下的内容
-(void)textFieldDidBeginEditing:(UITextField *)textField { CGFloat y = textField.frame.origin.y; if (y >= 350) //not 380 { CGRect frame = self.view.frame; frame.origin.y = 320 - textField.frame.origin.y; [UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}]; } } -(void)textFieldDidEndEditing:(UITextField *)textField { CGRect returnframe =self.view.frame; returnframe.origin.y = 0; [UIView animateWithDuration:0.3 animations:^{self.view.frame = frame;}]; }
只需编辑这两个方法。
简单的答案,所有的d代码。 在if语句中,根据iphone更改值,即如果iPhone 4S将其更改为265,并且在didbeginediting中将320更改为240,如果iphone 5将其更改为350,并在didbeginediting方法中将其保持为320,因为它是逻辑如果你明白
推测你有一些代码调用[myTextField becomeFirstResponder];
。 这个电话之后,你应该移动你的视图。
这是Tendulkar的解决scheme,但要记住原来的框架大小和删除键盘。 此解决scheme适用于所有设备。
-(BOOL) textFieldShouldReturn:(UITextField *)textField{ [textField resignFirstResponder]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,0,self.view.frame.size.width,self.view.frame.size.height); [UIView commitAnimations]; return YES; } - (void)textFieldDidBeginEditing:(UITextField *)textField { [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:0.25]; self.view.frame = CGRectMake(0,-50,self.view.frame.size.width,self.view.frame.size.height); [UIView commitAnimations]; }
不要忘记设置UITextField委托!
示例项目基于 Apple参考键盘文档
H文件:(不要忘记UITextFieldDelegate )
@property (weak, nonatomic) IBOutlet UIScrollView *scrollview; @property (weak, nonatomic) IBOutlet UIView *myView; //items on view @property (weak, nonatomic) IBOutlet UISwitch *partySwitch; @property (weak, nonatomic) IBOutlet UILabel *partyLabel; @property (weak, nonatomic) IBOutlet UITextField *partyNameTextfield;
M文件:
//MARK: View Loading - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. }//eom -(void)viewDidAppear:(BOOL)animated { [self registerForKeyboardNotifications]; }//eom //MARK: textfield delegates -(bool)textFieldShouldReturn:(UITextField *)textField { [textField resignFirstResponder]; return true; }//eom //MARK: - Keyboard Observers // Call this method somewhere in your view controller setup code. - (void)registerForKeyboardNotifications { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil]; } - (void)keyboardWasShown:(NSNotification*)aNotification { NSDictionary* info = [aNotification userInfo]; CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; CGRect bkgndRect = myView.superview.frame; bkgndRect.size.height += kbSize.height; [myView.superview setFrame:bkgndRect]; [scrollview setContentOffset:CGPointMake(0.0, myView.frame.origin.y-kbSize.height) animated:YES]; }//eom // Called when the UIKeyboardWillHideNotification is sent - (void)keyboardWillBeHidden:(NSNotification*)aNotification { UIEdgeInsets contentInsets = UIEdgeInsetsZero; scrollview.contentInset = contentInsets; scrollview.scrollIndicatorInsets = contentInsets; }//eom