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が呼び出されたときに親ビューのフレームをある値だけ上に移動し、デリゲートメソッドtextFieldDidEndEditingが呼び出されたときに同じ値で復元します。

もう1つの方法は、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つの位置に再調整する2つのメソッドがあると便利です(1つはキーボードが表示されているとき、もう1つは非表示のときです。したがって、テキストフィールドの編集が終了したら、次のテキストフィールドデリゲートメソッドでもう1つのメソッドを呼び出します。

    - (BOOL)textFieldShouldReturn:(UITextField *)textField {
        [self adjustFramesWhenKeyoradIsHidden];
    }

これらの2つのヘルプ方法では、フレームの位置を変更し、ビューを非表示にするかどうかを変更します。これらをアニメーション化すると、次のように見栄えが良くなります。

    - (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

個人的には、MichaelTysonによるTPKeyboardAvoidingを使用することを強くお勧めします。

使い方はとても簡単です...(Read Meからの引用):

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 に答える