2016-06-20 19 views
0

Ich habe ein UIScrollView mit einem UIView innerhalb basierend auf einem Artikel, wie Auto-Layout mit Eingabefeldern zu verwenden. Der Artikel erläutert, wie die UIView auf die gleiche Höhe und mit der normalen Ansicht für weitere Information festgelegt wird: https://www.natashatherobot.com/ios-autolayout-scrollview/.UIScrollView Höhe mit Tastatur

Jetzt habe ich mehrere UITextFields in meiner Inhaltsansicht. Wenn ich ein UITextField drücke, möchte ich in meiner Ansicht die Tastatur anzeigen und zum UITextField blättern. Zuerst habe ich versucht, einen Ansatz, der von mehreren verwendet, aber das Problem ist, am unteren Rand des Bildschirms, bekomme ich viel Platz von der Unterseite der Ansicht, die unerwünscht ist. Der Ansatz, den ich versucht wird, mit den folgenden Zeilen:

- (void)keyboardWillHide:(NSNotification *)notification { 
    [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, 0.0f, 0.0f)]; 
} 

- (void)keyboardWillShow:(NSNotification *)notification { 
    [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height, 0.0f)]; 
} 

Um dies zu ändern, dachte ich den Boden auf einen besser geeigneten Wert zu ändern würde den Trick tun, aber wenn ich dies tun, wird die Ansicht blättern nicht auf die UITextField mehr, wenn ich es drücke. Ich kann das Feld jedoch manuell scrollen. Die Art, wie ich dieses Ziel erreichte, wird mit dem folgenden:

- (void)keyboardWillShow:(NSNotification *)notification { 
    float keyboard = [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height; 
    float offset = [[[[self contentView] subviews] lastObject] frame].size.height + [[[[self contentView] subviews] lastObject] frame].origin.y + 30.0f; 

    if ([[self contentView] frame].size.height - [[[notification userInfo] objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].size.height < offset) { 
     [[self scrollView] setContentInset:UIEdgeInsetsMake([[self scrollView] contentInset].top, 0.0f, offset - ([[self view] frame].size.height - keyboard), 0.0f)]; 
    } 
} 

Wer weiß, wie ich den leeren Raum unter dem UITextFields ignorieren kann beim Scrollen, aber erlaubt, die Scrollview auf den ausgewählten UITextField blättern. Ich habe versucht, die Methode scrollRectToVisible zu verwenden, aber das tut nichts.

+0

Verwenden Sie https://github.com/michaeltyson/TPKeyboardAviiding Bibliothek, super einfach. Stellen Sie TPKeyboardAvoidingScrollView als benutzerdefinierte Klasse Ihrer Bildlaufansicht ein, es kümmert sich um alle Dinge, die Sie verwalten müssen, wenn die Tastatur angezeigt wird. –

+0

Danke für die Bibliothek, aber gibt es einen Weg, es ohne die Bibliothek zu tun? Ich habe versucht, den Code zu verwenden, und der Scrollview wird zum Eingabefeld scrollen, aber der Scrollview springt hoch und scrollt von oben, wenn ich den Code aus der Bibliothek verwende. – Sietse

Antwort

0

Ich habe festgestellt, dass die obigen Antworten veraltet sind. Auch nicht perfekt beim Scrollen.

Hier ist eine schnelle Version.

Es scrollt direkt unter dem TextField, kein Platz frei. Und es wird so wiederhergestellt werden, wie es ursprünglich war.

//add observer 
override func viewDidLoad() { 
    super.viewDidLoad() 

    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidShow(_:)), name: UIKeyboardDidShowNotification, object: nil) 
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(ARVHttpPlayVC.keyboardDidHide(_:)), name: UIKeyboardDidHideNotification, object: nil) 
} 

func keyboardDidShow(notification: NSNotification) { 
    let userInfo: NSDictionary = notification.userInfo! 
    let keyboardSize = userInfo.objectForKey(UIKeyboardFrameEndUserInfoKey)!.CGRectValue.size 

    //calculate the space it needs to show the firstResponder textField completely 
    var difference: CGFloat 
    if inputTextField1.isFirstResponder() == true { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField1.frame.origin.y - inputTextField1.frame.size.height) 
    } else if inputTextField2.isFirstResponder() == true { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField2.frame.origin.y - inputTextField2.frame.size.height) 
    } else { 
     difference = keyboardSize.height - (self.view.frame.height - inputTextField3.frame.origin.y - inputTextField3.frame.size.height) 
    } 
    //if the textField frame under the keyboard, so scroll up to show it 
    if difference > 0 { 
     var contentInset:UIEdgeInsets = self.scrollView.contentInset 
     contentInset.bottom = difference 
     self.scrollView.contentInset = contentInset 

     let scrollPoint = CGPointMake(0, difference) 
     self.scrollView.setContentOffset(scrollPoint, animated: true) 
    } 

} 

func keyboardDidHide(notification: NSNotification) { 
    let contentInset:UIEdgeInsets = UIEdgeInsetsZero 
    self.scrollView.contentInset = contentInset 
} 

//remove observer 
deinit { 
    NSNotificationCenter.defaultCenter().removeObserver(self) 
}