私はこの質問が数回尋ねられたことを知っています。キーボードが表示されたときにビューまたはテキストフィールドを上に移動する方法は理解していますが、理解できないような不具合が発生しています。
上に移動しようとしているビューは、2つのビューのコンテナーとして機能するUIViewController内にあります。このコンテナは、それ自体がスライディングビューコントローラ内のビューです(Facebookが実装しているようなものです)。
ビューを最初にロードしたときにテキストフィールドは正常に上に移動しますが、別のビューに移動して戻った場合、キーボードによってビューが非表示になります。
ビューを上に移動するために使用しているコードは次のとおりです。
- (void) animateTextField:(BOOL)up {
const int movementDistance = 350; // tweak as needed
const float movementDuration = 0; // tweak as needed
int movement = (up ? -movementDistance : movementDistance);
[UIView beginAnimations: @"anim" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, movement);
self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, movement);
//[splitController moveViewUp:up];
[UIView commitAnimations];
}
- (void)registerForKeyboardNotifications
{
NSLog(@"was this method called");
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWasShown:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification object:nil];
}
// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification
{
[self animateTextField:YES];
}
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
[self animateTextField:NO];
}
このグリッチが発生する可能性がある理由はありますか?ありがとう
ブール値の提案を追加して、テキストフィールドがすでに表示されているかどうかを確認した後、ビューを離れて戻ったときだけでなく、キーボードが表示されているときは常にビューが消えます。改訂された方法は次のとおりです。
- (void) animateTextField:(BOOL)up {
const int movementDistance = 350; // tweak as needed
const float movementDuration = 0; // tweak as needed
int movement = movementDistance;
[UIView beginAnimations: @"anim" context: nil];
[UIView setAnimationBeginsFromCurrentState: YES];
[UIView setAnimationDuration: movementDuration];
if(textFieldIsUp && (up == YES)) {
NSLog(@"Case 1");
// Do nothing since text field is already up
}
else if(textFieldIsUp && (up == NO)) {
NSLog(@"Case 2");
// Move the text field down
self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, -movement);
self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, -movement);
textFieldIsUp = NO;
}
else if((textFieldIsUp == NO) && (up == YES)) {
NSLog(@"Case 3");
// Move the text field up
self.sendingToolbar.frame = CGRectOffset(self.sendingToolbar.frame, 0, movement);
self.messagesTable.frame = CGRectOffset(self.messagesTable.frame, 0, movement);
textFieldIsUp = YES;
}
else if((textFieldIsUp == NO) && (up == NO)) {
NSLog(@"Case 4");
// Do nothing since the text field is already down
}
else {
NSLog(@"Default");
// Default catch all case. Does nothing
}
[UIView commitAnimations];
}
これが私のセットアップに関するいくつかの詳細です:
ビューコントローラーは、アプリのメッセージングセンターです。ビューコントローラには2つのサブビューが含まれています。左側のサブビューは会話を選択するためのメニューであり、右側のメニューはその会話内のメッセージを含むサブビューです。メッセージを下から上にロードしたいので、テーブルビューは180度回転し、セルも反対方向に180度回転します。また、NSTimerを使用してテーブルビューが5秒ごとにリロードされるため、メッセージを新しいメッセージで更新できます。