Tipp: Tastatur verbirgt UITextView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Tipp: Tastatur verbirgt UITextView

    Hi!

    Für einige (viele?) von Euch mag das nachfolgende Posting trivial sein, dann ignoriert es einfach. Vielleicht hilft es aber auch dem ein oder anderen...

    Ich bin gestern über den Effekt gestolpert, dass unter iOS 7 die Tastatur Teile einer bildschirmfüllenden UITextView überlagert. Gut, das ist nicht sehr überraschend (eigentlich sogar logisch) und kurzes Googlen ergab, dass ich (1.) in guter Gesellschaft bin und (2.) neben verschiedenen, teilweise recht kruden, Lösungsansätzen auf StackOverflow auch eine Apple-Lösung existiert.

    Diese war schnell implementiert und siehe da: Nun zeigte meine UITextView genau das Verhalten, das mich seit Erscheinen von iOS 7 z. B. in Mail massiv nervt: Zwar kann ich nach Einblenden der Tastatur den Text sauber scrollen und so auch Teile, die hinter der Tastatur lägen, bearbeiten. Aber habt Ihr schon einmal versucht, einen längeren Text zu markieren, so dass Ihr die Markierung bis an den Rand der Tastatur (und darüber hinaus) ziehen müsstet: Richtig, die UITextView fängt nicht an zu (auto-) scrollen und man kann den Text nur extrem umständlich markieren.

    Ich habe also statt der Insets die Frame-Größe verändert (und dabei noch die unterschiedliche Tastatur-Größe je nach Orientierung berücksichtigt) und bin mit der Lösung recht zufrieden: Sie macht, was ich erwarte und ist recht übersichtlich. Allerdings habe ich auf ein Scrollen zur aktuellen Einfügemarke / markierten Bereich verzichtet:


    Quellcode

    1. ​- (void)viewDidLoad
    2. {
    3. NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
    4. [nc addObserver:self selector:@selector(keyboardWasShown:) name:UIKeyboardDidShowNotification object:nil];
    5. [nc addObserver:self selector:@selector(keyboardWillBeHidden:) name:UIKeyboardWillHideNotification object:nil];
    6. ...
    7. }
    8. - (void)keyboardWasShown:(NSNotification*)aNotification
    9. {
    10. // Adjust the view size as the textview would extend under the a shown keyboard, affecting proper scrolling and text selection
    11. NSDictionary* info = [aNotification userInfo];
    12. CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    13. UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    14. CGFloat kbHeight = (interfaceOrientation == UIInterfaceOrientationPortrait) ? kbSize.height : kbSize.width;
    15. // Apple's solution changes the view's insets, still breaking the selection of text behind the keyboard
    16. CGRect frame = self.view.frame;
    17. frame.size.height -= kbHeight;
    18. self.view.frame = frame;
    19. }
    20. - (void)keyboardWillBeHidden:(NSNotification*)aNotification
    21. {
    22. // Reset the view size
    23. NSDictionary* info = [aNotification userInfo];
    24. CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    25. UIInterfaceOrientation interfaceOrientation = [UIApplication sharedApplication].statusBarOrientation;
    26. CGFloat kbHeight = (interfaceOrientation == UIInterfaceOrientationPortrait) ? kbSize.height : kbSize.width;
    27. CGRect frame = self.view.frame;
    28. frame.size.height += kbHeight;
    29. self.view.frame = frame;
    30. }
    Alles anzeigen


    Komisch, dass Apple so etwas als "Musterlösung" präsentiert (aber konsequent, dass ein Fehlverhalten dann auch deren Apps auftritt). Oder habe ich etwas übersehen?

    Ciao, Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • Eigentlich brauchst Du die Orientierung nicht selber auszuwerten, wenn Du die Koordinaten über die entsprechenden Methoden umrechnest (siehe z. B. hier). Die Verwendung des Rechtecks aus der Benachrichtigung ist hingegen extrem sinnvoll, weil Du damit auch Sonderfälle wie Hardware-Tastatur und Input-Accessory-Views richtig behandelst.
    „Meine Komplikation hatte eine Komplikation.“
  • An eine Koordinatenumrechnung habe ich in dem Zusammenhang gar nicht gedacht, muss ich bei Gelegenheit mal ausprobieren.

    Willst Du sagen, ich hätte mir das Austüfteln sparen können, wenn ich in Euer Buch geschaut hätte? Was soll ich sagen ... okay, es liegt 800 km von mir entfernt (Online-Version zählt nicht) und man wird durch's Selbermachen nicht dümmer :D

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.