我一直在使用不同的方法在运行时确定“标签”的宽度,以便我可以调整“标签”的大小,因为我不希望它被截断。我终于通过 UITextField 找到了一个简单的解决方案,它允许我设置 .autoSize ,这很棒!但是,现在我正在尝试 UITextField 的“样式”(只是调整字体和字体大小),但似乎我必须使用' .htmlText 手动完成'(如果这是唯一的方式,我很乐意接受。)
我正在使用 .text 来设置标签的值。
我的测试用例涉及 HBox (我实际上使用的是Grid,但它们应该是相同的,我已经对它们进行了测试):
正在进行更改,但当我将其添加到显示器时,它们似乎已被覆盖。
那么除了手动设置UITextField以及 .htmlText 中的内容之外,我还需要做什么才能设置UITextField的样式?不使用UITextField的解决方案就好了只要有一些简单的方法可以不截断文本。
编辑:我想做textField.setStyle('fontSize',20),并希望每次更改文本时,我都不需要使用HTML(因此我可以只使用textField。 text ='something else'并期望它的字体大小仍为20)。这就是我不使用 .htmlText 的意思(对不起,如果我以前不清楚)。
第二次编辑:我想我应该提出整个问题,也许这将澄清我做错了什么或无法实现的目标。
我的目的是拥有一个 Grid 并在其中添加文本。我不希望它包装或滚动,所以当当前行的子总宽度超过某个数字时,我将它添加到 Grid 的下一行。为了将它添加到下一行,我需要能够计算文本的宽度。我希望能够根据案例单独设置该文本的样式,并且可能还有其他组件(如 TextInput )。基本上我想要完成的是“填补空白”。
我已经提供了代码来展示我目前正在做的事情,并且它有点运作。它可能与原始的样式问题无关,但我无法弄清楚如何调整每个UITextField之间的距离,但除此之外,这符合我想要完成的任务。与此问题相关的是:我想改变我将每个 UITextField (目前设置 .htmlText )的方式改为有点直截了当的方式,尽管我之前提到过我会很高兴接受使用 .htmlText ,如果这是唯一的解决方案。
所以我有一个带有x行的网格,在每行中,我只有一个GridItem。根据输入,我将UITextField和TextInput添加到GridItem中,在必要时继续下一个GridItem。如果你有更好的方法,那就更好了,但我想我真正想要的是找到一种不同的造型方式。
另外另一个问题,我不确定将TextField添加到显示中的确切方法。我试过了:
var t : TextField = new TextField();
t.text = "I'm a TextField";
hBox.addChild(t); // doesn't work
//this.addChild(t); // doesn't work either
但是我收到以下错误:
TypeError:错误#1034:类型强制失败:无法将flash.text :: TextField @ 172c8f9转换为mx.core.IUIComponent。
这就是我的工作。
private function styleQuestionString(str : String) : String {
return '<FONT leading="1" face="verdana" size="20">' + str + '</FONT>';
}
private function loadQuestion(str : String) : void {
/* Split the string */
var tmp : Array = str.split("_");
/* Track the current width of the GridItem */
var curWidth : int = 0;
/* Display components that we will add */
var txtField : UITextField = null;
var txtInput : TextInput = null;
/* Track the current GridItem */
var curGridItem : GridItem = null;
/* Track the GridItem we can use */
var gridItemAC : ArrayCollection = new ArrayCollection();
var i : int = 0;
/* Grab the first GridItem from each GridRow of Grid */
var tmpChildArray : Array = questionGrid.getChildren();
for (i = 0; i < tmpChildArray.length; i++) {
gridItemAC.addItem((tmpChildArray[i] as GridRow).getChildAt(0));
}
curGridItem = gridItemAC[0];
gridItemAC.removeItemAt(0);
/* Used to set the tab index of the TextInput */
var txtInputCounter : int = 1;
var txtFieldFormat : UITextFormat = new UITextFormat(this.systemManager);
txtFieldFormat.leading = "1";
//var txtFieldFormat : TextFormat = new TextFormat();
//txtFieldFormat.size = 20;
/* Proper Order
txtField = new UITextField();
txtField.text = tmp[curItem];
txtField.autoSize = TextFieldAutoSize.LEFT;
txtField.setTextFormat(txtFieldFormat);
*/
var txtLineMetrics : TextLineMetrics = null;
var tmpArray : Array = null;
curGridItem.setStyle("leading", "1");
var displayObj : DisplayObject = null;
for (var curItem : int= 0; curItem < tmp.length; curItem++) {
/* Using UITextField because it can be auto-sized! */
/** CORRECT BLOCK (ver 1)
txtField = new UITextField();
txtField.text = tmp[curItem];
txtField.autoSize = TextFieldAutoSize.LEFT;
txtField.setTextFormat(txtFieldFormat);
***/
tmpArray = (tmp[curItem] as String).split(" ");
for (i = 0; i < tmpArray.length; i++) {
if (tmpArray[i] as String != "") {
txtField = new UITextField();
txtField.htmlText = styleQuestionString(tmpArray[i] as String);
//txtField.setTextFormat(txtFieldFormat); // No impact on output
txtLineMetrics = curGridItem.measureHTMLText(txtField.htmlText);
curWidth += txtLineMetrics.width + 2;
if (curWidth >= 670) {
curGridItem = gridItemAC[0];
curGridItem.setStyle("leading", "1");
if (gridItemAC.length != 1) {
gridItemAC.removeItemAt(0);
}
// TODO Configure the proper gap distance
curWidth = txtLineMetrics.width + 2;
}
displayObj = curGridItem.addChild(txtField);
}
}
//txtField.setColor(0xFF0000); // WORKS
if (curItem != tmp.length - 1) {
txtInput = new TextInput();
txtInput.tabIndex = txtInputCounter;
txtInput.setStyle("fontSize", 12);
txtInputCounter++;
txtInput.setStyle("textAlign", "center");
txtInput.width = TEXT_INPUT_WIDTH;
curWidth += TEXT_INPUT_WIDTH;
if (curWidth >= 670) {
curGridItem = gridItemAC[0];
if (gridItemAC.length != 1) {
gridItemAC.removeItemAt(0);
}
// TODO Decide if we need to add a buffer
curWidth = TEXT_INPUT_WIDTH + 2;
}
curGridItem.addChild(txtInput);
txtInputAC.addItem(txtInput);
/* Adds event listener so that we can perform dragging into the TextInput */
txtInput.addEventListener(DragEvent.DRAG_ENTER, dragEnterHandler);
txtInput.addEventListener(DragEvent.DRAG_DROP, dragDropHandler);
txtInput.addEventListener(DragEvent.DRAG_EXIT, dragExitHandler);
}
/* Add event so that this label can be dragged */
//txtField.addEventListener(MouseEvent.MOUSE_MOVE, dragThisLabel(event, txtField.text));
}
}
答案 0 :(得分:2)
经过大约8个小时的搜索解决方案似乎是一个简单的问题,我终于在这里发现了你的帖子......谢谢你!
我一直在试图让TextField工作并且没有Joy,标签很好,但格式有限,我需要能够使用嵌入字体和旋转。阅读完上述内容后,这最终对我有用:
var myFormat:TextFormat = new TextFormat();
myFormat.align = "center";
myFormat.font = "myFont";
myFormat.size = 14;
myFormat.color = 0xFFFFFF;
var newTxt:UITextField = new UITextField();
newTxt.text = "HELLO";
addChild(newTxt);
newTxt.validateNow();
newTxt.setTextFormat(myFormat);
最后两步之前addChild的顺序至关重要! (myFont是我正在使用的嵌入字体)。
再一次......一千个谢谢你......
约翰
答案 1 :(得分:1)
基于ASKERS FEEDBACK的编辑: 我没有意识到你只想在整个文本区域应用一种风格,我认为你想要设计个别部分。这对你来说更简单,根本不会给你带来任何麻烦:)
var textFormat: TextFormat = new TextFormat("Arial", 12, 0xFF0000);
myText.setTextFormat(textFormat);
请注意,这会将样式设置为TextField中的文本,而不一定是您放入的未来文本。因此,在调用setTextFormat之前,请在字段中显示文本,并在每次更改它时再次设置它确保它保持不变。
最好使用普通的TextField而不是组件。如果您仍然需要组件,则可能需要调用textArea.validateNow()以使用新样式进行更新(尽管不是100%确定)但Adobe组件非常糟糕,应该避免使用。 :(
要查看TextFormat对象上的所有可用选项,请参阅here
结束编辑---------
这很容易在普通的旧TextField中使用CSS。
var myCSS: String = "Have some CSS here, probably from a loaded file";
var myHTML: String = "Have your HTML text here, and have it use the CSS styles";
// assuming your textfield's name is myText
var styleSheet: StyleSheet = new StyleSheet();
styleSheet.parseCSS(myCSS);
myText.autoSize = TextFieldAutoSize.LEFT;
myText.styleSheet = styleSheet;
myText.htmlText = myHTML;
答案 2 :(得分:1)
将Textfield添加到容器时遇到问题的原因是它没有实现IUIComponent接口。如果要添加UITextField,则需要使用它。然而,这给我带来了自己的造型问题,这让我想到了这个问题。
我知道的一些事情:
TextField使用TextFormat定义设置样式,并将其应用于文本字段。正如布莱恩所说,订单很重要。
setStyle对IUITextField没有任何作用,TextFormat方法似乎与普通TextFields中的方法不同。 (编辑#2:Ahah。您需要覆盖UITextFields上的“validateNow”函数以使用setTextFormat函数)
要自动调整TextArea,您需要执行以下操作(从TextArea继承):
import mx.core.mx_internal;
use namespace mx_internal;
...
super.mx_internal::getTextField().autoSize = TextFieldAutoSize.LEFT;
this.height = super.mx_internal::getTextField().height;
我想,在StackOverflow上发现了这段代码。向原作者道歉。但这个想法是你需要访问“mx_internal”原始文本字段。
(编辑:那是#4,但是stackoverflow将其解析为1 ...)