2015-05-14 4 views
0

Я сделал так, чтобы, когда пользователь нажимает на текстовое поле, вид слегка сдвигается, так что поля все еще видны во время ввода пользователем. Он отлично работает, однако иногда после того, как клавиатура уволена, вместо того, чтобы вернуться в исходное положение, вид слишком слабеет (оставляя небольшую пустую черную полосу вверху). Кто-нибудь знает, как я могу просто вернуть представление в исходное положение? Вот мой код:Вернуться к исходной позиции после анимации

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 


    _userField.returnKeyType = UIReturnKeyDone; 
    [_userField setDelegate:self]; 

    _passField.returnKeyType = UIReturnKeyDone; 
    [_passField setDelegate:self]; 


    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
    [self.view addGestureRecognizer:tap]; 
} 


- (void)dismissKeyboard 
{ 
    [_userField resignFirstResponder]; 
    [_passField resignFirstResponder]; 

} 

-(void)textFieldShouldReturn:(UITextField *)textField 
{ 
    [textField resignFirstResponder]; 
} 

-(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 = -130; // tweak as needed 
     const float movementDuration = 0.3f; // tweak as needed 

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

     [UIView beginAnimations: @"animateTextField" context: nil]; 
     [UIView setAnimationBeginsFromCurrentState: YES]; 
     [UIView setAnimationDuration: movementDuration]; 
     self.view.frame = CGRectOffset(self.view.frame, 0, movement); 
     [UIView commitAnimations]; 
    } 
+0

Что такое обстрел этого метода? Вы слушаете уведомления о клавиатуре? – Dare

+0

Вы не используете AutoLayout? (Не знаю, просто интересно). Полное понимание фреймов, обеспечивающее сохранение вашего предыдущего местоположения ПОСЛЕ загрузки изображения (может измениться с помощью анимации), а Quartz 2D позволит вам выяснить, куда входит этот странный сдвиг. Необходимо увидеть другой код для изменения, хранения позиции и автоопределения. –

+0

Привет @StephenJ, да, я использую AutoLayout. Я предполагаю, что, поскольку мой код перемещает представление на определенное расстояние, мне просто нужно переместить представление назад на 130 после того, как клавиатура будет уволена. Есть идеи, как это может выглядеть? См. Приведенные выше изменения кода. – Brittany

ответ

0

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

Во-первых, в контроллере представления, регистрации и отмены регистрации для уведомлений:

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShowNotification:) name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHideNotification:) name:UIKeyboardWillHideNotification object:nil]; 
} 

- (void)viewWillDisappear:(BOOL)animated { 
    [super viewWillDisappear:animated]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil]; 
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil]; 
} 

Затем реализует два метода вызывается, когда уведомления срабатывают:

- (void)keyboardWillShowNotification:(NSNotification *)notification { 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    [UIView setAnimationCurve:(UIViewAnimationCurve)[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; 
    [self.mainView adjustContentWithKeyboardHeight:keyboardFrame.size.height]; 
    [UIView commitAnimations]; 
} 

- (void)keyboardWillHideNotification:(NSNotification *)notification { 
    [UIView beginAnimations:nil context:NULL]; 
    [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; 
    [UIView setAnimationCurve:(UIViewAnimationCurve)[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; 
    [UIView setAnimationBeginsFromCurrentState:YES]; 
    [self.mainView adjustContentWithKeyboardHeight:0]; 
    [UIView commitAnimations]; 
} 

Наконец, реализовать adjustContentWithKeyboardHeight публичный метод, на ваш взгляд. Поскольку этот метод вызывается в анимации UIView, все изменения будут анимированы.

Если вы перемещаете представления напрямую (помещаете их в вид контейнера, который вы будете перемещать), сохраните исходную позицию Y в частной собственности, а затем вычтите из этого свойства клавиатуруHeight минус оставшееся пространство ниже вашего текстового поля, и назначьте это обратно в это поле (или установите рамку по своему вкусу):

CGFloat offsetY = keyboardHeight - (CGRectGetHeight(self.bounds) - CGRectGetMaxY(self.containerView.frame)); 
    CGRect containerFrame = self.containerView.frame; 
    containerFrame.origin.y = self.containerViewPositionY - offsetY; 
    self.containerView.frame = containerFrame; 
Смежные вопросы