Automatisches scrollen, wenn contentEditable/designMode in einer UIWebView
Ich bin versucht, eine rich-text-editor (mit HTML-export-Funktion) für eine iPhone-Anwendung, mit der ich arbeite, und beschlossen, iOS 5, WebKit-Unterstützung für contentEditable
/designMode
.
Ich habe eine Wand schlagen mit einem Thema, das zu brechen, was ich brauche. Bei der Bearbeitung der Inhalte in der UIWebView, es gibt keine automatische scrollen, um den cursor Folgen, wie, zum Beispiel, in UITextView. Bei der Eingabe, der cursor geht weiter unter der scrollView und der Benutzer muss manuell nach oben scrollen.
Hier einige relevante code:
- (void)webViewDidFinishLoad:(UIWebView *)webView
{
NSString *string = @"document.body.contentEditable=true;document.designMode='on';void(0)";
[webView stringByEvaluatingJavaScriptFromString:string];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
}
Irgendwelche Ideen wie man das Problem beseitigen? Ich bin nicht sicher, ob dies tritt auch in Safari oder nur in UIWebView
's WebKit-Implementierung.
Wenn du dieses problem, stellen Sie sicher, um den Kopf über https://bugreport.apple.com und doppelte rdar://16455638.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nach Stunden der recherche habe ich eine bessere Lösung gefunden, so dass ich dachte, ich würde Aktie.
Gibt es einen bug in iOS 5 ist contentEditable Umsetzung, wo die Haupt-scrollView nicht scrollen Sie mit dem Cursor. Wenn Sie den body-tag (oder dynamisch Größe element) contentEditable, das Einfügezeichen gehen immer off-screen.
Wenn Sie eine editierbare div overflow: scroll, werden Sie feststellen, dass das div scrollt. Die div ' s scrollen nicht "bounce" oder Bildlaufleisten standardmäßig, aber Sie können die
-webkit-overflow-scrolling: touch
- Attribut auf den div um dies zu beheben.Mit diesen Informationen, können Sie befestigen es mit einem wrapper in etwa so:
Grundsätzlich sind Sie scrollen der div anstelle des Dokuments.
Unfortuantly die div ' s "scrollView", ist sich nicht bewusst, dass die virtuelle Tastatur, so dass der Cursor verschwindet hinter der Tastatur. Sie werden jedoch feststellen, dass die caret-position ist immer noch auf dem Bildschirm an der Unterseite hinter der Tastatur. So, um das zu beheben, verringern Sie die Höhe des div - /UIWebView, um Platz für die Tastatur.
Etwas anderes möchten Sie vielleicht zu tun ist, deaktivieren Sie scrollen auf der Haupt-scrollView:
Den Haupt-scrollView sollte nicht scrollen sowieso, aber es sollte verhindern, dass jedes Blättern Störungen.
-webkit-overflow-scrolling
), aber es war immer noch etwas buggy-leider. Ich bin akzeptiert, weil es am nächsten ist, was, die ich brauchte in der Frage.Beantwortung meiner eigenen Frage, der wir schließlich tun eine Menge Arbeit, um sicherzustellen, dass dieses korrekt funktioniert auf mehreren iOS-Versionen. Wir fanden heraus, dass alle scroll-Ereignisse wurden aufgrund der
UIWebView
versuchen, verwalten IhreUIWebScrollView
. Wir beschlossen, statt mit einemUIWebView
, werden wir auf den internenUIWebDocumentView
/UIWebBrowserView
und fügen Sie es auf unsere eigene scroll-Ansicht. Dies erlaubt es uns, verwaltet den Inhalt, die Größe und das scrollen selbst und entfernt die meisten der Probleme, die wir bisher erlebt haben.Zuerst müssen Sie sich registrieren Tastatur-Benachrichtigungen, und in diesem keyboardWillShow Methode, trigger scroll-Methode mit 0,1-timer ein.
Stellen eine member-variable in der .h-Datei und Speicher es in der init () - Methode.
innen, die scroll-Methode, tun die folgende.
Dies ermöglicht es Ihnen, Blättern Sie zu der Unterseite, wenn Sie die Bearbeitung der Inhalte und der Inhalte ist größer als die WebView-Rahmen. Und zu anderen Zeiten werden Sie in der Lage, Blättern Sie zu der oben auf der Seite(autoscroll gestellt werden, halten zu dieser Zeit).
Konnte ich nicht auf den trick der Einstellung "overflow: scroll", da es versaut unsere bereits gute css (wenn änderten wir den überlauf, wenn Sie auf den bearbeitbaren div, dann das layout bekam, Durcheinander). Ging mit dieser:
Hoffe, das jemand hilft. PITA
Kann man versuchen, caret Rahmen mit wenig tricky hack und manuell scrollen sichtbar rect.