uikeyboard оставляет черную часть сверху при навигации

У меня есть форма на Ipad, который имеет много текстового поля и кнопку в конце. Есть некоторые поля, которые находятся под клавиатурой, когда она активна. Чтобы вытянуть скрытое текстовое поле за клавиатурой, чтобы оно было видно, я использую следующий код.

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
[self animateTextField:textField up:YES];
}

- (void)textFieldDidEndEditing:(UITextField *)textField
{
_scrollView.frame=CGRectMake(0, 0, 1024, 655);
[self animateTextField:textField up:NO];
}

- (void) animateTextField: (UITextField*) textField up: (BOOL) up
{
CGPoint temp = [textField.superview convertPoint:textField.frame.origin toView:nil];
UIInterfaceOrientation orientation =
[[UIApplication sharedApplication] statusBarOrientation];
if (orientation == UIInterfaceOrientationPortrait)
{
    // NSLog(@"portrait");
    if(up)
    {
        int moveUpValue = temp.y+textField.frame.size.height;
        animatedDis = 264-(1024-moveUpValue-5);
    }
}
else if(orientation == UIInterfaceOrientationPortraitUpsideDown)
{
    if(up)
    {
        int moveUpValue = 1004-temp.y+textField.frame.size.height;
        animatedDis = 264-(1004-moveUpValue-5);
    }
}
else if(orientation == UIInterfaceOrientationLandscapeLeft)
{
    if(up)
    {
        int moveUpValue = temp.x+textField.frame.size.height;
        animatedDis = 352-(768-moveUpValue-5);
    }
}
else
{
    if(up)
    {
        int moveUpValue = 768-temp.x+textField.frame.size.height;
        animatedDis = 352-(768-moveUpValue-5);
        _scrollView.frame = CGRectMake(0, 0, 1024, 655-240);
    }

}
if(animatedDis>0)
{
    const int movementDistance = animatedDis;
    const float movementDuration = 0.3f;
    int movement = (up ? -movementDistance : movementDistance);
    [UIView beginAnimations: nil context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: movementDuration];
    if (orientation == UIInterfaceOrientationPortrait)
    {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }
    else if(orientation == UIInterfaceOrientationPortraitUpsideDown)
    {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }
    else if(orientation == UIInterfaceOrientationLandscapeLeft)
    {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }
    else
    {
        self.view.frame = CGRectOffset(self.view.frame, 0, movement);
    }
    [UIView commitAnimations];
}
}

Я также использую вид прокрутки. Моя проблема в том, что когда клавиатура активна, и я нажимаю кнопку, я перехожу на следующий экран. Теперь, если я вернусь назад, клавиатура активна и предыдущие анимации установлены. Теперь, если я прячу клавиатуру, весь вид прокручивается вниз, оставляя черную часть сверху. Как справиться с этой ситуацией?

1 ответ

Решение

Хорошо. После долгих исследований я нашел простой метод. Это использование уведомлений. В моем viewDidLoad я добавил эти два уведомления клавиатуры.

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasShown:) name: UIKeyboardDidShowNotification object:nil];

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];

Это 2 метода выбора:

-(void)keyboardWasShown:(NSNotification *)aNotification
{

if (displayKeyboard==YES) {
    return;
}
NSDictionary* info = [aNotification userInfo];
NSValue* aValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
//NSValue* aValue = [info objectForKey:UIKeyboardFrameBeginUserInfoKey];
CGSize keyboardSize = [aValue CGRectValue].size;

NSLog(@"kbw====%fkbh====%f",keyboardSize.width,keyboardSize.height);

offset = _scrollView.contentOffset;

CGRect viewFrame = _scrollView.frame;

NSLog(@"svw====%fsvh===%f",viewFrame.size.width,viewFrame.size.height);
viewFrame.size.height -= keyboardSize.height-49;
NSLog(@"new view hgt =====%f",viewFrame.size.height);
_scrollView.frame = viewFrame;

CGRect textFieldRect = [activeField frame];
textFieldRect.origin.y += 10;
[_scrollView scrollRectToVisible: textFieldRect animated:YES];
displayKeyboard = YES;
}
-(void)keyboardWillBeHidden:(NSNotification *)aNotification
{

if (!displayKeyboard) {
    return; 
}

_scrollView.frame = CGRectMake(0, 0, 1024, 655);
_scrollView.contentOffset =offset;
displayKeyboard = NO;
}

-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField {
activeField = textField;
return YES;
}

displayKeyboard, offset и activeField объявляются в файле.h.

Также не забудьте удалить уведомления в viewDidDisappear:animated

Хотя этот метод сильно отличается от предыдущего, этот метод не оставляет черную часть сверху при перемещении между классами, когда активна uikeyboard.

Также то, что я заметил, было, если я использовал устаревший UIKeyboardBoundsUserInfoKey Я использовал, чтобы получить правильную ширину и высоту клавиатуры (я работаю только в ландшафтном режиме). Тогда как когда я использовал UIKeyboardFrameBeginUserInfoKey значения ширины и высоты менялись местами. Я все еще пытаюсь понять эту проблему.

Также, когда клавиатура раньше появлялась, над ней было добавлено фиксированное пространство в 49 пикселей. Я предположил, что это была моя высота табуляции и поэтому вычел 49.

Другие вопросы по тегам