2014-09-02 2 views
1

У меня есть экран, который выполняет анимацию (сдвигает экран вверх), когда пользователь вводит текстовое поле, поэтому он остается видимым при вводе данных, а затем сдвигается назад, как только пользователь будет вводить данные. Проблема, с которой я сталкиваюсь, заключается в том, что пользователь пытается использовать кнопку очистки внутри текстового поля (устанавливается с помощью site_TextField.clearButtonMode = UITextFieldViewModeAlways). Поток для текстовых полей, когда кнопка нажата ясно, должно быть:Использование кнопки очистки UITextField с анимацией экрана

textFieldShouldEndEditing -> textFieldDidEndEditing -> textFieldShouldClear -> textFieldShouldBeginEditing -> textFieldDidBeginEditing

Однако метод textFieldDidEndEditing есть где анимация вызывается из и когда выполняется анимация, эта последовательность останавливается, а textFieldShouldClear не вызывается. Я надеюсь, что это что-то простое, я просто отсутствую. Любой вход оценивается!

- (BOOL)textFieldShouldBeginEditing:(UITextField *) textField 
{ 
    NSLog(@"In textFieldShouldBeginEditing"); 
    return YES; 
} 

- (void)textFieldDidBeginEditing:(UITextField *)textField 
{ 
    if (textField == site_TextField || textField == phone_TextField) { 
     [self animateTextField: textField up: YES]; 
    } 
} 

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
{ 
    NSLog(@"In textFieldShouldEndEditing"); 
    return YES; 
} 

- (void)textFieldDidEndEditing:(UITextField *)textField 
{ 
    if (textField == site_TextField || textField == phone_TextField) { 
     [self animateTextField: textField up: NO]; 
    } 
} 

- (BOOL)textFieldShouldClear:(UITextField *)textField { 

    NSLog(@"In textFieldShouldClear"); 
    return YES; 
} 

- (void) animateTextField: (UITextField*) textField up: (BOOL) up 
{ 
    if (textField != site_TextField && textField != phone_TextField) { 
     return; 
    } 

    int movementDistance = 0; 
    if (textField == site_TextField) { 
     movementDistance = 100; 
    } else if (textField == phone_TextField) { 
     movementDistance = 170; 
    } 

    int movement = (up ? -movementDistance : movementDistance); 

    [UIView animateWithDuration:0.3 
          delay:0.0 
         options: UIViewAnimationOptionAllowUserInteraction 
        animations:^{ 
         self.view.frame = CGRectOffset(self.view.frame, 0, movement); 
        } 
        completion:^(BOOL finished){ 
        }]; 
} 
+0

Ваш текст не имеет возвращаемого значения в 'textFieldShouldBeginEditing'? – pbasdf

+0

Извините, скопируйте/вставьте ошибку, исправлено сообщение. Этот метод даже не нужен, я просто вставляю его, когда я отлаживаю такой трассировку через код и вижу, в каком порядке убедиться, что я правильно слежу за ним. –

ответ

0

Я подозреваю, что первый textFieldShouldEndEditing и textFieldDidEndEditing вызваны нажатием вниз на кнопку ясно. И textFieldShouldClear запускается прикосновением. Но с вашей анимацией, textField движется сразу после касания, так что прикосновение вверх не регистрируется. Попробуйте использовать событие textField didEndOnExit, чтобы вызвать метод, который уменьшает анимацию.

+0

Это меня близко к тому, что я хотел сделать (я внедрил textFieldShouldReturn из делегата, но я считаю, что оба они вызваны одним и тем же событием). Я также использовал распознаватель жестов, чтобы закончить редактирование, и ему также нужно было вызвать код анимации из цели для распознавателя жестов. –

Смежные вопросы