UIScrollView scrollRectToVisible: animiert: wird auf iOS7 nicht berücksichtigt

8
%Vor%

Hat jemand eine Ahnung, warum das auf iOS6.1 und auf iOS7.0.4 einwandfrei funktioniert? Scrollt immer zum UITextField, das zu FirstResponder geworden ist, egal, welche Art von Rect ich als Argument sende?

%Vor%

Dieser Code scrollt das UIScrollView nach unten, wenn die Tastatur aufgrund eines UITextField in UIScrollView angezeigt wird. Er wurde zum ersten Responder auf iOS6.1, aber auf iOS7.0.4 wird gescrollt, so dass UITextFiled stattdessen sichtbar ist.

Wie ich finde, scrollt die UIScrollView im iOS7 SDK, egal was passiert, automatisch auf das, was zum ersten Responder geworden ist, wenn scrollRectToVisible: animated: aufgerufen wird.

    
Henrik Lineholm 29.01.2014, 14:56
quelle

4 Antworten

9

Ich vermute, dass die meisten Entwickler scrollRectToVisible:Animated: in Verbindung mit Systemtastaturbenachrichtigungen verwenden, wie in Apple Docs hier . Für mich funktionierte der von Apple bereitgestellte Beispielcode nicht (naja, nur die Hälfte davon).

Das Aufrufen des Methodenaufrufs in einem Verteilerblock hat das Problem für mich behoben:

%Vor%

Ich verstehe nicht ganz, warum das funktioniert und ich bin mir nicht sicher, ob das 100% sicher ist, aber auf der anderen Seite fühlt es sich viel sicherer an, als den Anruf um 0,1 Sekunden zu verzögern, wie in eine andere Antwort von Rikkles .

Ich bin (noch) kein Experte für Threading-Probleme, aber es scheint, als ob die versteckte Systemmethode das Scroll-Verhalten außer Kraft setzt, ist bereits in der Hauptwarteschlange, wenn UIKeyboardDidShowNotification gesendet wird. Wenn wir also unseren Methodenaufruf auf die Hauptwarteschlange setzen, wird er danach ausgeführt und führt daher zu dem gewünschten Effekt. (Aber das ist nur eine Vermutung.)

    
Mischa 03.12.2015 13:14
quelle
8

Auf iOS 8 (und möglicherweise 7) scrollt das Betriebssystem automatisch zum UITextField am Ende der Runloop-Operation, kurz bevor es wieder Benutzereingaben abgehört hat. Ich habe keine Möglichkeit gefunden, nach dem OS-Autoscroll und vor der Benutzereingabe hereinzukommen. Weder UIKeyboardWillShowNotification noch UIKeyboardDidShowNotification sind Hooks, die funktionieren.

Was jedoch immer funktioniert, ist der gute alte Trick, einen Selektor nach der Verzögerung auszuführen. Setzen Sie den Scroll-Code einfach in eine eigene Methode und rufen Sie diese Methode wie folgt auf:

%Vor%

Und das wird ausgeführt, nachdem das Betriebssystem automatisch scrollt, und Sie sind golden.

    
Rikkles 15.10.2014 15:28
quelle
4

Ich habe dieses Problem schon einmal getroffen. Nicht einfach, aber sicher langweilig.

Es war, weil ich contentSize auf 0 gesetzt habe (weil Sie nicht wollen, dass es scrollt). Und du solltest mindestens 1 setzen.

%Vor%

Ich hoffe, es ist die Lösung;)

    
AncAinu 29.01.2014 15:42
quelle
1

Ich habe eine Lösung für dieses Problem gefunden, aber es ist keine schöne. Um den Bildlauf zum gewünschten Ort zu blättern, müssen Sie sich sowohl für die Meldungen keyboardWillShow als auch für keyboardDidShow registrieren. Der Code zum Festlegen der Scrollview-Einfügungen wird dann in den Selektor der TastaturWillShowNotification gestellt, und der Code zum Scrollen der Scrollansicht an die gewünschte Position wird im Selektor der keywordDidShowNotification-Observatorin platziert. Hier ist was ich habe:

InnenansichtDidLoad:

%Vor%

Benachrichtigungsmethoden:

%Vor%     
minimike08 27.06.2014 01:08
quelle