Баги TextField в iOS
На днях столкнулся с занимательным багом в TextField под iOS.
Суть в следующем, если программно менять текст в текстовом поле, то введенный ранее текст выделяется и... добавленный текст не отображается. Хотя свойство text при этом изменяется, правда ровно до того момента пока не будет нажата любая клавиша на клавиатуре.
Как воспроизвести
Вот минимальный код для воспроизведения бага:
package { import flash.display.Graphics; import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.FocusEvent; import flash.events.MouseEvent; import flash.system.Capabilities; import flash.text.TextField; import flash.text.TextFieldType; public class TextFieldBug extends Sprite { private var _textField:TextField; private var _dpi:Number = Capabilities.screenDPI; public function TextFieldBug() { super(); stage.align = StageAlign.TOP_LEFT; stage.scaleMode = StageScaleMode.NO_SCALE; stage.addEventListener(FocusEvent.MOUSE_FOCUS_CHANGE, stage_mouseFocusChangeHandler); _textField = new TextField(); _textField.type = TextFieldType.INPUT; _textField.height = realToPixels(0.5); _textField.width = realToPixels(2); addChild(_textField); var button:Sprite = createButton(); addChild(button); button.addEventListener(MouseEvent.CLICK, button_clickHandler); _textField.requestSoftKeyboard(); } private function button_clickHandler(event:MouseEvent):void { _textField.text += ":("; } //lock focus on TextField private function stage_mouseFocusChangeHandler(event:FocusEvent):void { if (event.relatedObject is TextField) return; event.preventDefault(); } private function createButton():Sprite { var button:Sprite = new Sprite(); var g:Graphics = button.graphics; g.beginFill(0xFF0000); g.drawRect(0, 0, realToPixels(1), realToPixels(1)); g.endFill(); return button; } private function realToPixels(inch:Number):Number { return inch * _dpi; } } }
Пути обхода
К счастью удалось найти workaround.
Необходимо создать два текстовых поля, одно будет отображаться на экране, второе понадобится позже. В момент когда необходимо добавить текст, копируем текст из первого поля во второе. Убираем первое поле, добавляем второе и вызываем на втором поле requestSoftKeyboard().
При этом клавиатура останется на экране хотя и будут отправлены SOFT_KEYBOARD_DEACTIVATE и SOFT_KEYBOARD_ACTIVATE для соответствующих текстовых полей.
А как же Android?
В андроиде ситуация лучше. Текст добавляется... правда после курсора. Приходится смещать курсор в конец строки или использовать костыль для iOS.
Проверено в iOS6 на iPad и на Samsung Galaxy 3 с Android 4.1.2 для AIR 3.7.
У кого есть возможность проверить на иных девайсах и версиях AIR просьба отписаться и при подтверждении проголосовать тут.
Всего комментариев 4
Комментарии
29.07.2013 23:47 | |
Название "Баги TextField" заставляет думать, что баги везде, хотя речь идет о мобильных устройствах. То есть, вводит в заблуждение.
|
30.07.2013 01:07 | |
Предложи название.
|
30.07.2013 13:38 | |
Баги TextField в iOS?)
|
10.10.2013 15:06 | |
В связи с низким приоритетом (приоритет напрямую связан с количеством голосов), баг отложен до "лучших времен" (как показывает практика, это может длиться годами). Всем спасибо.
|
Последние записи от alatar
- Трансформации вокруг произвольной точки (05.02.2015)
- Декомпозиция матрицы. (25.12.2014)
- Баги TextField в iOS (29.07.2013)
- [Spark] Стрелочный индикатор. (06.12.2012)
- RSLs Monkey Patching (23.01.2012)