2016-09-01 5 views
1

Ich habe eine UIView und ich versuche, die Tastatur folgen, wenn der Benutzer die Tastatur bewegen. Stellen Sie sich vor, der Benutzer hat eine scrollview und eine offene Tastatur, der Benutzer möchte nach unten scrollen, die Tastatur halbiert, die Tastatur origin.y ändern. Das Problem ist, wenn die Tastatur geöffnet ist und kein Ereignis aufgerufen wird, sonst wird die Tastatur buchstäblich geschlossen.
Ich habe versucht, die Tastatur delegieren + Textfeld Delegierte verwendet, die ist:Tastatur Obeserver IOS

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

Alle diese Methoden nur dann aufgerufen werden, wenn Tastatur über öffnen/schließen und was geschieht, ist, dass, wenn der Benutzer bewegt sich die Tastatur, um die UIView wird sich nicht bewegen, da es darauf wartet, dass einer dieser Beobachter angerufen wird.

Was ich im Grunde bin auf der Suche nach ist eine Möglichkeit, die Tastatur origin.y (gezeigt Höhe), wenn Änderung seines Wertes

+0

Setzen Sie beobachten wollen Sie auf Ansicht bewegen, wenn Tastatur erscheint ? –

+0

@AgentChocks. Ich möchte meine Ansicht verschieben, wenn sich die Tastatur bewegt, etwa wenn die Tastatur geöffnet ist und der Benutzer sie nach oben und unten bewegt, aber nicht wirklich schließt. –

+0

haben Sie gesehen, dass https://github.com/michaeltyson/TPKeyboardAvoiding –

Antwort

-1

diesen Code unter

#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

dieser Code basiert auf Textfield-Ereignisse und nicht die Tastatur Y-Wert. wenn ich zum Beispiel versuche, nach unten zu scrollen (indem ich meinen Finger wische, während ich die Tastatur nach unten wische, aber nicht schließe), passiert nichts –

+0

habe meine Frage aktualisiert, um sie klarer zu machen –

+0

Tastaturgrößen nicht hartcodieren. Die Tastatur kann die Größe ändern - was ist, wenn der Benutzer die Autocomplete-Vorschlagsleiste anzeigt oder eine Zubehöransicht angezeigt wird? Welche Geräte haben diese magische Tastaturgröße? – jrturton