我在根滚动视图中嵌入了标准UIView
(包含图像视图,两个文本字段和一个按钮)。我正在使用AutoLayout将UIView
放在滚动视图的中心,如下面的屏幕截图所示。
我正在尝试编写一种方法,当键盘出现时向上移动UIView
,以便此视图显示在较小的可见帧的中心。为实现这一目标,我计算了一些高度。
- (void)keyboardWillShow:(NSNotification *)notification {
// Determines the size of the keyboard frame
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
[UIView animateWithDuration:0.3 animations:^{
// Gets the root 'UIView' frame and stores it in a variable
CGRect viewFrame = self.itemsView.frame;
// This is the height of the visible frame once the keyboard appears
double visibleFrameHeight = (self.view.frame.size.height - keyboardSize.height);
// How much the 'UIView' should move up
double offset = ((visibleFrameHeight - viewFrame.size.height / 2);
// Moves up the 'UIView'
viewFrame.origin.y = -offset;
self.itemsView.frame = viewFrame;
}];
}
问题是UIView
向上移动了,如下所示。
为什么会发生这种情况,我该如何解决?
答案 0 :(得分:2)
如果您的视图已嵌入UIScrollView,那么您只需调整滚动视图contentOffset
即可移动视图(然后您可以免费获得动画)。
假设滚动视图在名为scrollView
的插座上可用,并且您希望将视图保持居中,则可以将内容偏移量调整为键盘高度的1/2。另外 - 使用UIKeyboardFrameEndUserInfoKey
获取键盘的最后一帧可能更安全:
- (void)keyboardWillShow:(NSNotification *)notification {
// Determines the size of the keyboard frame
CGSize keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size;
self.scrollView.contentOffset = CGPointMake(0, keyboardSize.height / 2);
}
- (void)keyboardWillHide:(NSNotification *)notification {
self.scrollView.contentOffset = CGPointZero;
}
答案 1 :(得分:0)
你必须在.h文件中为UIScrollView设置一个IBOutlet,如下所示: IBOutlet UIScrollView * scrLogin;
然后在 xib 文件中为 UIScrollview 和所有UiTextfield设置委托。
然后在.m文件中设置此代码
您已将所有设计设置为UIimageview,UItextfield和& UIButton& UIScrollView中的所有内容。
- (void)viewDidLoad {
[scrLogin setContentSize:CGSizeMake(320, 790)];
[scrLogin setContentOffset:CGPointMake(0, 0) animated:YES];
}
#pragma mark - Textfield Delegate
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
if (textField==txtUserName) {
[txtUserName resignFirstResponder];
[txtPsw becomeFirstResponder];
}else{
[txtPsw resignFirstResponder];
[scrLogin setContentOffset:CGPointMake(0, -60) animated:NO];
//[self btnLoginTapped:self];
}
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField{
if(textField==txtUserName){
if (IS_IPHONE_4s) {
[scrLogin setContentOffset:CGPointMake(0, 20) animated:true];
}else{
[scrLogin setContentOffset:CGPointMake(0, 0) animated:true];
}
}else if(textField==txtPsw){
[scrLogin setContentOffset:CGPointMake(0, 40) animated:true];
}
}
我希望它对你有所帮助。如果您有任何问题,请告诉我。
答案 2 :(得分:0)
我建议使用https://github.com/hackiftekhar/IQKeyboardManager,它易于使用并适用于整个应用程序(无需再次手动计算键盘高度)