ユーザー入力を取得する必要がある単純なフォームのように見えるように、いくつかのテキスト フィールドとラベルを設定しました。しかし、私の問題は、テキスト フィールドの一部が選択され、キーボードがスライドするたびに、テキスト フィールドが覆われて入力が見えなくなることです。私の質問は、テキスト フィールドを上に移動して、選択したときに表示されたままにするにはどうすればよいかということです。たぶん、より経験豊富な人がこれについて私を助けることができます.
4 に答える
私がやりたいこれに対する良い解決策は、テキストフィールドが次のデリゲート関数で編集を開始するときに聞くことです:
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
//keep a member variable to store where the textField started
_yPositionStore = textField.frame.origin.y;
//If we begin editing on the text field we need to move it up to make sure we can still
//see it when the keyboard is visible.
//
//I am adding an animation to make this look better
[UIView beginAnimations:@"Animate Text Field Up" context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:YES];
commentTextField.frame = CGRectMake(commentTextField.frame.origin.x,
160 , //this is just a number to put it above the keyboard
commentTextField.frame.size.width,
commentTextField.frame.size.height);
[UIView commitAnimations];
}
そして、このコールバックで元の場所に戻すことができます:
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[UIView beginAnimations:@"Animate Text Field Up" context:nil];
[UIView setAnimationDuration:.3];
[UIView setAnimationBeginsFromCurrentState:YES];
commentTextField.frame = CGRectMake(commentTextField.frame.origin.x,
_yPositionStore ,
commentTextField.frame.size.width,
commentTextField.frame.size.height);
[UIView commitAnimations];
}
}
_yPositionStore を CGFloat のメンバー変数として宣言し、textFields デリゲートをそれを所有するビュー コントローラーに設定する必要があります (Interface builder を使用してデリゲートをファイルの所有者にドラッグするか、yourTextField.delegate = self を設定します)。
それが役立つことを願っています
これを行うには、次の 2 つの手順
に従う
必要があり
ます。UITextViews
UIScrollView
UIScrollView
UITextfieldのデリゲートメソッドを呼び出して、要件に応じてカスタマイズできます。
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField: textField up: YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
[self animateTextField: textField up: NO];
}
- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
const int movementDistance = 110;
const float movementDuration = 0.3f;
int movement = (up ? movementDistance : -movementDistance);
[UIView beginAnimations: @"aimation" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
yourView.frame= CGRectOffset(yourView.frame,0, movement);
[UIView commitAnimations];
}
私のアプリケーションでは、keyboardHeight が縦向きモードで 216、横向きモードで 162 であると仮定して、次のコードを使用します。
#pragma mark - textField delegate
- (void)textFieldDidBeginEditing:(UITextField *)textField
{
// keyboard is visible, move views
CGRect myScreenRect = [[UIScreen mainScreen] bounds];
int keyboardHeight = 216;
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.35];
int needToMove = 0;
CGRect frame = self.view.frame;
if (textField.frame.origin.y + textField.frame.size.height + self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height > (myScreenRect.size.height - keyboardHeight)) {
needToMove = (textField.frame.origin.y + textField.frame.size.height + self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height) - (myScreenRect.size.height - keyboardHeight);
}
frame.origin.y = -needToMove;
[self.view setFrame:frame];
[UIView commitAnimations];
}
- (void)textFieldDidEndEditing:(UITextField *)textField
{
// resign first responder, hide keyboard, move views
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.35];
CGRect frame = self.view.frame;
frame.origin.y = 0;
[self.view setFrame:frame];
[UIView commitAnimations];
}
この式では、ステータス バー、ナビゲーション バー、および表示サイズが考慮されます。もちろん、フィールドにデリゲートを設定することを忘れないでください。
そして:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[[UIApplication sharedApplication] sendAction:@selector(resignFirstResponder) to:nil from:nil forEvent:nil];
}
ユーザーがフィールドの外側をタップすると、キーボードを非表示にできます。