После нескольких часов исследований я нашел лучшее решение, поэтому решил поделиться.
В реализации iOS 5 contentEditable есть ошибка, из-за которой основной scrollView не будет прокручиваться вместе с кареткой. Если сделать тег body (или любой динамически изменяемый элемент) contentEditable, каретка всегда будет отключена от экрана.
Если вы установите редактируемый div в overflow: scroll, вы заметите, что div будет прокручивать . Прокрутка в div не «отскакивает» и не имеет полос прокрутки по умолчанию, но вы можете применить атрибут -webkit-overflow-scrolling: touch
к div, чтобы это исправить.
С помощью этой информации вы можете исправить это с помощью обёртки:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width; initial-scale=1.0; maximum-scale=1.0; user-scalable=no;"/>
<style type="text/css">
html, body {height: 100%;}
body {
margin: 0;
}
#wrap {
height: 100%;
width: 100%;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
}
#editor {
padding: 10px;
}
</style>
</head>
<body>
<div id="wrap">
<div id="editor" contenteditable="true">
</div>
</div>
</body>
</html>
По сути, вы прокручиваете div вместо документа.
К сожалению, scrollView div не знает о виртуальной клавиатуре, поэтому каретка исчезнет за клавиатурой. Тем не менее, вы заметите, что позиция каретки по-прежнему на экране внизу за клавиатурой. Чтобы это исправить, уменьшите высоту div / UIWebView, чтобы разместить клавиатуру.
Что-то еще, что вы можете сделать, это отключить прокрутку в главном scrollView:
webView.scrollView.scrollEnabled = NO;
Основной scrollView все равно не должен прокручиваться, но он должен предотвращать любые сбои прокрутки.