在MonoTouch中使用AttributedString的CATextlayer

时间:2012-01-08 15:31:46

标签: xamarin.ios nsattributedstring catextlayer

我正在尝试在不同的单词上创建一个具有不同样式的“标签”,类似于描述here。 问题是 - 据我所知 - UATextLayer的MonoTouch实现不接受将NSAttributedString分配给String属性,因为String属性具有类型字符串。

这是实施中的错误还是有其他方法可以做到这一点?

(是的,我知道我可以添加单独的标签 - 但是当有更好的解决方案时我宁愿不这样做。)

编辑(回应米格尔的回答):

在更改为GetHandler并更正为“void_objc_msgSend_IntPtr”而不是“void_objc_msgSend_IntPrt”之后,答案中的代码会编译并运行,但它仍然无法正常工作(我将它标记为答案有点快)。 没有抛出任何错误,但文本没有显示。

代码:

string _text="Example string";
if(_textLayer==null) {
    _textLayer = new CATextLayer();
    _textLayer.Frame = new RectangleF(50,698,774,50);
    _textLayer.Wrapped=true;
    _textLayer.ForegroundColor=UIColor.White.CGColor;
    _textLayer.BackgroundColor=UIColor.Clear.CGColor;
    Layer.AddSublayer(_textLayer);
}

//_textLayer.String=_text;
CTFont _font=new CTFont("MarkerFelt-Thin",48);
CTStringAttributes _attrs=new CTStringAttributes();
_attrs.Font=_font;
_attrs.ForegroundColor = UIColor.White.CGColor;

var nsa = new NSAttributedString(_text);
Messaging.void_objc_msgSend_IntPtr(
        _textLayer.Handle,
        Selector.GetHandle("string"), 
        nsa.Handle);

如果我取消注释_textLayer.String=_text我看到文本(当然没有属性),那么问题不在于图层。

1 个答案:

答案 0 :(得分:1)

目前,您可以尝试:

using MonoTouch.ObjCRuntime;

var caTextLayer = new CATextLayer ();
var nsa = new NSAttributedString ();
[..]
Messaging.void_objc_msgSend_IntPrt (
    caTextLayer.Handle, 
    Selector.sel_registerName ("string"), 
    nsa.Handle);

或者,您可以下载即将发布的版本的预览:

http://tirania.org/tmp/monotouch.dll

它在CATextLayer中实现了一个可以设置的属性AttributedString。