Developing another game on NGUI we're facing the same problem - we heavily use font effects (such as outline) and heavily use in-font icons. But when you use the outline, it applies to the icons too. Which looks pretty bad in most cases.

You see - all these black outlines on the circle icons.
Previously I had to duplicate the UILabel and make two of them - one with outline (for the text) and the other (overlapped) without the effect - for the icons.
But that feels pretty messy.
Now I'm sharing you the modification to NGUI we've made. It is not very elegant, but works. Maybe NGUI author would think about including it to NGUI.
So, here we go:
1. Add "SymbolStyle.NoEffect" to the "SymbolStyle" enum
2. In NGUIText.Print() search for the line
(symbolStyle == SymbolStyle.Colored)
and use the following code (it was around line #1507 for me):
if (cols != null)
{
if (symbolStyle == SymbolStyle.Colored)
{
for (int b = 0; b < 4; ++b) cols.Add(gc);
}
else
{
Color col = Color.white;
if (symbolStyle == SymbolStyle.NoEffect)
{
col
= new Color
(1,
0,
1,
0); }
else
{
col.a = gc.a;
}
for (int b = 0; b < 4; ++b) cols.Add(col);
}
}
That puts a color of #FF00FF00 (transparent cyan) in the colors array in places where images are.
Now that fully transparent cyan will be passed to the outline creator that will make the outline color transparent. But at this moment, the color of images itself will became transparent too. So, finally, we need to replace #FF00FF00 to white after applying all shadows/outlines:
3. At UILabel.OnFill(), at the very end of the method, before this:
if (onPostFill != null)
onPostFill(this, offset, verts, uvs, cols);
you should insert a replacing code (line #1948 for me):
if (NGUIText.symbolStyle == NGUIText.SymbolStyle.NoEffect)
{
for (int i = 0; i < cols.Count; i++)
{
Color c = cols[i];
if ((c.r == 1) && (c.g == 0) && (c.b == 1) && (c.a == 0))
{
cols[i] = Color.white;
}
}
}
And that's it.
The result will be: