2012-01-08 4 views
0

J'essaie de créer une "étiquette" avec des styles différents sur des mots différents, un peu comme décrit here. Le problème est - pour autant que je puisse le voir - l'implémentation de UATextLayer dans MonoTouch n'accepte pas l'affectation d'une chaîne NSAttributedString à la propriété String car la propriété String a la chaîne de type.CATextlayer avec AttributedString dans MonoTouch

Est-ce une erreur dans l'implémentation ou existe-t-il une autre façon de procéder?

(Oui, je sais que je peux ajouter des étiquettes séparées - mais je préférerais qu'il n'y ait pas de meilleure solution).

EDIT (en réponse à la réponse de Miguel):

Après avoir changé de GetHandler et de corriger à « void_objc_msgSend_IntPtr » au lieu de « void_objc_msgSend_IntPrt » le code dans la réponse compile et fonctionne, mais il ne fonctionne pas tout à fait de toute façon (j'étais un peu rapide en le marquant comme la réponse). Aucune erreur n'est levée, mais le texte ne s'affiche pas.

code:

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); 

Si je décommenter le _textLayer.String=_text je vois le texte (mais sans attributs bien sûr), de sorte que le problème est pas avec la couche.

Répondre

1

Pour l'instant, vous pouvez essayer:

using MonoTouch.ObjCRuntime; 

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

Sinon, pouvez-vous télécharger cet aperçu de la prochaine version:

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

Il met en oeuvre une AttributedString de propriété CATextLayer que vous pouvez définir.

+0

Il semble que sel_registerName est privé et ne peut pas être appelé d'une autre classe, ai-je oublié quelque chose ..? – Johan

+0

... Je me suis découvert: Selector.GetHandle ("string") – Johan

+0

Edité ma question pour plus d'aide puisque je ne suis pas tout à fait le faire fonctionner ... – Johan