Обходной путь для ошибки TextField в FP 10.3.183.5 и 10.3.183.7
У меня есть клиент, у которого большие проблемы с приложением AS2, которое мы разработали несколько лет назад.
Насколько я могу судить, это вызвано признанной ошибкой в последних версиях Flash Player (см. http://forums.adobe.com/message/3859034 и https://bugbase.adobe.com/index.cfm?event=bug&id=2941694).
Это затрагивает две версии FP (10.3.183.5 и 10.3.183.7), и ошибка была исправлена в 10.3.183.10.
Очевидно, что обновление Flash Player решит проблему, но мы все знаем, что пользователи не всегда делают это, и она получала электронные письма о проблеме.
Я собираюсь обновить ее код SWFObject для явного обнаружения для 10.3.183.10 и заставить ExpressInstall "поощрять" пользователей к обновлению, но я не знаю, произойдет ли это.
Я попробовал несколько из обходных путей, которые обнаружили поиски, но ни один не работает в моем случае.
Мне было интересно, если кто-нибудь нашел надежный способ исправить это?
3 ответа
Первым делом я бы попытался использовать textField.htmlText вместо textField.text и посмотреть, не решит ли это проблему (хотя я был бы удивлен, если бы это произошло).
Второй потенциальный способ исправить это (и это на самом деле не очень красиво) - это ручная переноска слов. Следующее в AS3, потому что это то, что я использую. Я оставлю это вам, чтобы преобразовать его в AS2, но я предполагаю, что это должно быть возможно и в AS2.
var text : String = "some text here";
var textField : TextField = new TextField();
textField.wordwrap = false;
textField.multiline = false;
textField.autosize = false;
textField.width = MAX_TEXT_WIDTH;
//other formatting stuff
var words : Array = text.split(" ");
var line : String = words[0];
textField.text = words[0];
var lines : Array = new Array();//will contain all lines
for(var i : int = 1; i < words.length; ++i)//start at second word
{
textField.text += " " + words[i];//try adding another word to the line
if(textField.textWidth > MAX_TEXT_WIDTH)//overflowed line
{
lines.push(line);
line = words[i];
textField.text = line;
}
else//doesn't overflow, line is still valid
{
lines += textField.text;
}
}
lines.push(line);
var text : String = lines[0];
for(i = 1; i < lines.length; ++i)
{
text += "\n" + lines[i];
}
textField.multiline = true;
textField.height = lines.length * HEIGHT_PER_LINE;//HEIGHT_PER_LINE can be found using getLineMetrics and
//adding gutter pixels to the height - might have to
//play a little with this
textField.text = text;
Не уверен, что это компилируется (это, вероятно, в любом случае не совместимо с AS2), но это должно дать общее представление. Сделайте перенос слов самостоятельно и посмотрите, работает ли это. Также убедитесь, что форматирование применяется к тексту при проверке textWidth. Я думаю, вам нужно вызывать setTextFormat (myTextFormat) каждый раз, когда вы меняете значение textField.text.
Я также видел, что, очевидно, многострочный может не работать в этой версии. В этом случае вам, возможно, придется создать новый объект TextField для каждой строки и сместить их значения y, чтобы он выглядел так, как будто это тот же TextField (надеюсь, вы не используете границы или фоны в своих textFields, если это так).)
Теперь, когда проблема устранена, вряд ли кто-нибудь потрудится найти обходной путь. Вероятно, предложенный вами метод SWFObject - это путь. Просто проверьте, находятся ли версии в пределах 10.3.183.5 и 10.3.183.7, и, если это так, отобразите ExpressInstall.
Окончательная версия AS, я думаю, работает лучше всего
the_textfield.autoSize = false;
the_textfield.multiline = false;
the_textfield.wordWrap = false;
var words : Array = the_textfield.text.split(" ");
var line : String = words[0];
the_textfield.text = words[0];
var lines : Array = new Array();
for (var i : Number = 1; i < words.length; ++i) {
the_textfield.text += " " + words[i];
if (the_textfield.textWidth > SOME_WIDTH) {
lines.push(line);
line = words[i];
the_textfield.text = line;
} else {
line += " " + words[i];
}
}
lines.push(line);
var t : String = lines[0];
for (i = 1; i < lines.length; ++i) {
t += "\n" + lines[i];
}
the_textfield.text = t;
the_textfield.autoSize = true;
the_textfield.multiline = true;
the_textfield.wordWrap = false;
В моем случае я должен был SOME_WIDTH
, но текстовое поле было создано, и происходят некоторые странные изменения масштаба, поэтому я просто вычислил число эмпирически.