【黑科技】让RichText支持结点的默认颜色

在Creator 2.0以前,RichText是支持结点颜色的,如果没有特别指定,默认颜色会用node.color的。

其实这个特性还挺方便的,我们项目中很多地方用了这个机制,但是升级以后,这个特性没有了,导致我们很多界面的颜色不对,要一个个调整又比较麻烦。

不知道有没有其他人也有用过这个特性的,如果也赚修改麻烦,不妨用下面的黑科技兼容之:

let _oldupdateRichText = cc.RichText.prototype._updateRichText;
let _isSetNewString = false;
cc.RichText.prototype._updateRichText = function() {
	// 这个变量是防止重复调用
	if (_isSetNewString) return;
	if (!this.enabled) return;
	if (this.node) {
		let color = this.node.color;
		let strColor = '#' + color.toHEX("#rrggbb")
		if (strColor != '#ffffff') {
			let strText = this.string;
			if (!strText.startsWith("<color")) {
				_isSetNewString = true;
				strText = cc.js.formatStr("<color=%s>%s</c>", strColor, strText);
				this.string = strText;
				_isSetNewString = false;
			}
		}
	}

	_oldupdateRichText.call(this);
}

总体思路就是:黑掉_updateRichText,如果结点的默认颜色不是白色,且RichText.string最外层没有指定标签,即强制在最外层给加上一个color。

上面方法亲测有效
不过还是希望引擎同学能把这个特性恢复回来。

2赞

:+1: 这是翻了源码并理解了才修改的吧

嗯,都是在我们项目中试过有效的,可以放心使用。不过上面的还是有点小问题。。。

原来是这个原因,还是恢复到以前那样跟节点颜色比较方便,否则好麻烦哦

cc.RichText.prototype.setStringEx = function(context) {
  let color = this.node.color;
  this.string = cc.js.formatStr("<color=#%s>%s<color>", color.toHEX("#rrggbb"), context);
};

加个函数就行了,哪天官方还原支持了,换个api就行了

收藏了 感觉creator有必要优化一下字体的体验 不好的没修复 好的反而干掉了 1.9.3当用字体库的时候label的位置甚至有偏移 做ui非常蛋疼 目前升级2.0打包ios字体都进不来 还没排查什么原因 2.0问题真是不少

嗯。2.0.5我们用TTF字体还会出现问题,Prefab直接加载不过来。。我还没有反馈。

建个帖子说下吧

嗯,我直接建个贴子,发个Demo吧。

在引擎内置对像上做勾子,这个黑科技我也有用到,比如:

/**
 * 删除组件上的节点
 */
cc.Component.prototype.destroyNode = function() {
    if (!this.node) {
        return;
    }
    this.node.destroy();
};

看下面的使用,按钮的Click事件可以调用任意组件上的这个destroyNode方法,把这个组件所在的节点给销毁了

不用挂任何组件,就可以把指定节点给删除了,非常适合用来做窗口界面的关闭操作

1赞