键盘模糊了输入字段

时间:2012-05-17 12:49:18

标签: objective-c ios three20

当我想将文本放入我的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],...

4 个答案:

答案 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作为顶级   图。