2016-09-01 5 views
1

У меня есть UIView, и я пытаюсь сделать это, следуя клавиатуре, когда пользователь перемещает клавиатуру. представьте себе, что пользователь имеет scrollview и открытую клавиатуру, пользователь хочет прокрутить вниз, что заставляет клавиатуру закрываться наполовину, клавиатура origin.y меняется. проблема в том, что клавиатура открыта и перемещается, никакое событие не называется иначе, вы буквально закрываете клавиатуру.
Я попытался с помощью клавиатуры делегата + TextField делегат, который:keyboard obeserver ios

* UIKeyboardWillShowNotification 
* UIKeyboardDidShowNotification 
* UIKeyboardWillHideNotification 
* UIKeyboardDidHideNotification 
* UIKeyboardWillChangeFrameNotification 
* textFieldDidBeginEditing: 
* textFieldShouldBeginEditing: 
* textFieldDidEndEditing: 
* textFieldShouldEndEditing: 

Все эти методы называют только тогда, когда клавиатура собирается открыть/сбрасывать со счетов и то, что происходит в том, что, когда пользователь перемещает клавиатуры на UIView не будет двигаться, пока он ждет вызова одного из этих наблюдателей.

То, что я в основном ищу способ наблюдения клавиатуры origin.y (показано высоту), если ее изменение значения

+0

вы хотите, чтобы переместить точку зрения, когда появляется клавиатура ? –

+0

@AgentChocks. Я хочу переместить мой взгляд, когда клавиатура перемещается, как при открытой клавиатуре, и пользователь перемещает ее вверх и вниз, но не закрывает ее. –

+0

Вы видели это https://github.com/michaeltyson/TPKeyboardAvoiding –

ответ

-1

Поместите этот код ниже

#import 

    static const CGFloat KEYBOARD_ANIMATION_DURATION = 0.3; 
    static const CGFloat MINIMUM_SCROLL_FRACTION = 0.2; 
    static const CGFloat MAXIMUM_SCROLL_FRACTION = 0.8; 
    static const CGFloat PORTRAIT_KEYBOARD_HEIGHT = 216; 
    static const CGFloat LANDSCAPE_KEYBOARD_HEIGHT = 140; 

textfieldDelegate 

    - (void)textFieldDidBeginEditing:(UITextField *)textField 
     { 
      CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField]; 
      CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view]; 
      CGFloat midline = textFieldRect.origin.y + 0.5 * textFieldRect.size.height; 
      CGFloat numerator = midline - viewRect.origin.y - MINIMUM_SCROLL_FRACTION * viewRect.size.height; 
      CGFloat denominator = (MAXIMUM_SCROLL_FRACTION - MINIMUM_SCROLL_FRACTION) * viewRect.size.height; 
      CGFloat heightFraction = numerator/denominator; 
      if (heightFraction < 0.0) 
      { 
       heightFraction = 0.0; 
      } 
      else if (heightFraction > 1.0) 
      { 
       heightFraction = 1.0; 
      } 
      UIInterfaceOrientation orientation = 
      [[UIApplication sharedApplication] statusBarOrientation]; 
      if (orientation == UIInterfaceOrientationPortrait || 
       orientation == UIInterfaceOrientationPortraitUpsideDown) 
      { 
       animatedDistance = floor(PORTRAIT_KEYBOARD_HEIGHT * heightFraction); 
      } 
      else 
      { 
       animatedDistance = floor(LANDSCAPE_KEYBOARD_HEIGHT * heightFraction); 
      } 
      CGRect viewFrame = self.view.frame; 
      viewFrame.origin.y -= animatedDistance; 
      [UIView beginAnimations:nil context:NULL]; 
      [UIView setAnimationBeginsFromCurrentState:YES]; 
      [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 
      [self.view setFrame:viewFrame]; 
      [UIView commitAnimations]; 
     } 
     - (void)textFieldDidEndEditing:(UITextField *)textField 
     { 
      CGRect viewFrame = self.view.frame; 
      viewFrame.origin.y += animatedDistance; 
      [UIView beginAnimations:nil context:NULL]; 
      [UIView setAnimationBeginsFromCurrentState:YES]; 
      [UIView setAnimationDuration:KEYBOARD_ANIMATION_DURATION]; 
      [self.view setFrame:viewFrame]; 
      [UIView commitAnimations]; 
     } 
     -(BOOL)textFieldShouldReturn:(UITextField*)textField 
     { 
      NSInteger nextTag = textField.tag + 1; 
      // Try to find next responder 
      UIResponder* nextResponder = [textField.superview viewWithTag:nextTag]; 
      if (nextResponder) 
      {   
       // Found next responder, so set it. 
       [nextResponder becomeFirstResponder]; 
      } 
      else 
      { 
       //Not found, so remove keyboard. 
       [textField resignFirstResponder]; 

      } 
      return NO; // We // We do not want UITextField to insert line-breaks. 
     } 
+0

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

+0

обновил мой вопрос, чтобы сделать его понятным –

+0

Не печатайте размеры клавиатуры. Клавиатура может изменять размеры - что, если у пользователя есть панель подсказок автозаполнения, или есть дополнительный вид? Какие устройства имеют этот волшебный размер клавиатуры? – jrturton