当我想将文本放入我的UITextField时,键盘显示在其顶部,并覆盖该字段。怎么预防这个?我刚读过:this solution但我不知道在哪里调整大小?这是一个好方法吗?
我的代码是:
UITextField * passwordTextField = [[[UITextField alloc] init] autorelease];
passwordTextField.keyboardType = UIKeyboardTypeDefault;
passwordTextField.delegate = self;
passwordTextField.placeholder = NSLocalizedString(@"somestr", @"");
passwordTextField.secureTextEntry = YES;
[_controls setObject:passwordTextField forKey:keyPassword];
然后我通过以下方式在Three20中展示:
...@"",
[NSArray arrayWithObjects:
[TTTableControlItem itemWithCaption:nil control:passwordTextField],
nil],...
答案 0 :(得分:3)
你只需要实现UITextField textFieldDidBeginEditing和textFieldDidEndEditing的委托。当调用textFieldDidBeginEditing时,将父框架的框架移动一些值,并在调用委托方法textFieldDidEndEditing时将其恢复为相同的值。
另一种方法是为UIKeyboardDidShowNotification添加观察者并向上移动框架并在UIKeyboardDidHideNotification触发时向下移动框架。
示例: -
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil];
并更改选择器中的帧: -
- (void)keyboardDidShow:(NSNotification *)aNotification
{
if ( keyBDidShow)
return;
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y -= 60;
[UIView beginAnimations:@"Rollback" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
viewUp= YES;
}
keyBDidShow= YES;
}
- (void)keyboardWasHidden:(NSNotification *)aNotification
{
if ( viewUp)
{
NSTimeInterval animationDuration = 0.300000011920929;
CGRect frame = self.view.frame;
frame.origin.y += 60;
[UIView beginAnimations:@"Rollback" context:nil];
[UIView setAnimationDuration:animationDuration];
self.view.frame = frame;
[UIView commitAnimations];
viewUp = NO;
}
keyBDidShow= NO;
}
同样可以为textfield代表完成。
答案 1 :(得分:0)
调整大小应该应用于根视图:想法是设置视图框以匹配键盘减少的可见区域,同时第一个响应者仍然可见。检查TTBaseViewController
属性autoresizesForKeyboard
和相应的方法
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardWillAppear:(BOOL)animated withBounds:(CGRect)bounds {
// Empty default implementation.
}
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardWillDisappear:(BOOL)animated withBounds:(CGRect)bounds {
// Empty default implementation.
}
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds {
// Empty default implementation.
}
///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardDidDisappear:(BOOL)animated withBounds:(CGRect)bounds {
// Empty default implementation.
}
对于表格视图,您无需更改尺寸,请参阅keyboardDidAppear
的{{1}}实施
TTTableViewController
答案 2 :(得分:-1)
你应该实现以下方法
- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField{
[self adjustFramesWhenKeyoradIsShown];
}
在实现中你应该重新调整textfield框架。如果你有其他你想要显示的视图而不是键盘隐藏你也应该移动它们。有两个方法可以重新调整2个位置的框架(一个显示键盘时,一个隐藏时显示,所以一旦文本字段完成编辑,你可以调用下面文本字段中的另一个方法委托方法:
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[self adjustFramesWhenKeyoradIsHidden];
}
在这两种帮助方法中,您可以更改帧位置并将视图更改为隐藏或不更改,如果您为其设置动画,它看起来会更好,如下所示:
- (void) adjustFramesWhenKeyoradIsShown{
[UIView animateWithDuration:0.3
delay:0.0
options: UIViewAnimationCurveEaseOut
animations:^{
logoArea.hidden = YES;
loginFieldsArea.frame = CGRectMake(0, 0, 320, 250);
}
completion:^(BOOL finished){
}];
}
答案 3 :(得分:-2)
我个人强烈建议使用Michael Tyson的TPKeyboardAvoiding。
这很容易使用......(引自自述):
要与 UITableViewController 类一起使用,请删除 TPKeyboardAvoidingTableView.m和TPKeyboardAvoidingTableView.h进入 您的项目,并使您的UITableView成为TPKeyboardAvoidingTableView 在xib中。如果您没有在控制器上使用xib,我知道 没有简单的方法使其UITableView成为自定义类:最少的路径 阻力是为它创造一个xib。
对于非 UITableViewControllers ,请删除 TPKeyboardAvoidingScrollView.m和TPKeyboardAvoidingScrollView.h 将源文件导入项目,将UIScrollView弹出到视图中 controller的xib,将滚动视图的类设置为 TPKeyboardAvoidingScrollView,并将所有控件放在其中 滚动视图。您也可以通过编程方式创建它,而无需使用 xib - 只需使用TPKeyboardAvoidingScrollView作为顶级 图。