1

当我想将文本放入我的 UITextField 时,键盘会显示在它的顶部,并覆盖该字段。如何防止这种情况?我刚刚读过:这个解决方案,但我不知道在哪里调整大小?是个好办法吗?

我的代码是:

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

4 回答 4

3

您只需要实现 UITextField textFieldDidBeginEditing 和 textFieldDidEndEditing 的委托。当调用 textFieldDidBeginEditing 时,将 parentview 的框架向上移动某个值,并在调用委托方法 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; 
} 

文本字段代表也可以这样做。

于 2012-05-17T13:03:32.630 回答
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实现TTTableViewController

///////////////////////////////////////////////////////////////////////////////////////////////////
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds {
  [super keyboardDidAppear:animated withBounds:bounds];
  self.tableView.frame = TTRectContract(self.tableView.frame, 0, bounds.size.height);
  [self.tableView scrollFirstResponderIntoView];
  [self layoutOverlayView];
  [self layoutBannerView];
}
于 2012-05-17T13:14:15.200 回答
-1

你应该实现以下方法

    - (BOOL) textFieldShouldBeginEditing:(UITextField *)textField{
        [self adjustFramesWhenKeyoradIsShown];
    }

在实现中,您应该重新调整文本字段框架。如果您还希望显示其他视图并且不被键盘隐藏,您也应该移动它们。有两种方法可以为 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){
                 }];
     }
于 2012-05-17T13:11:10.667 回答
-2

我个人强烈推荐使用Michael Tyson 的TPKeyboardAvoiding

它非常易于使用...(引自自述文件):

要与UITableViewController类一起使用,请将 TPKeyboardAvoidingTableView.m 和 TPKeyboardAvoidingTableView.h 放入您的项目中,并使您的 UITableView 在 xib 中成为 TPKeyboardAvoidingTableView。如果您没有在控制器中使用 xib,我知道没有简单的方法使其 UITableView 成为自定义类:阻力最小的路径是为其创建 xib。

对于非UITableViewControllers,将 TPKeyboardAvoidingScrollView.m 和 TPKeyboardAvoidingScrollView.h 源文件拖放到项目中,将 UIScrollView 弹出到视图控制器的 xib 中,将滚动视图的类设置为 TPKeyboardAvoidingScrollView,然后将所有控件放在该滚动视图中。您也可以通过编程方式创建它,而无需使用 xib - 只需使用 TPKeyboardAvoidingScrollView 作为您的顶级视图。

于 2012-05-17T13:18:18.433 回答