lineBreakMode:设置ParagraphStyle时MonoTouch中无法识别的选择器异常

时间:2013-10-15 11:53:40

标签: c# xamarin.ios mono xamarin

主题说明了一切,所以我会在显示代码后发表评论:

        var attr = new CTStringAttributes ();
        attr.Font = new CTFont("Parangon110C", 11);

        var paragraph = new CTParagraphStyleSettings ();
        paragraph.Alignment = CTTextAlignment.Justified;
        attr.ParagraphStyle = new CTParagraphStyle(paragraph);

        DescLabel.AttributedText = new NSAttributedString(billboard.Desc, attr);

所以运行此代码后我得到一个异常

Objective-C exception thrown.  Name: NSInvalidArgumentException Reason: -[__NSCFType lineBreakMode]: unrecognized selector sent to instance 0xe5a4db0

我发现它只在我设置attr.ParagraphStyle时出现。但是当它为null时,一切都很好(除了我不能用我的方式格式化文本大声笑)。 执行字符串后

DescLabel.AttributedText = new NSAttributedString(billboard.Desc, attr);

debugger在DescLabel.AttributedText的Size属性中显示异常文本。

我怀疑,这是CTStringAttributes或CTParagraphStyle中的错误。 我找到了那里CoreText repository但是直到现在还不能说出错了

此外,不久之后,我发现了一个bugreport,有人抱怨他的东西不起作用。但在纠正了代码中的明显错误(幸运的家伙)之后,他不再评论了,所以结论是:他有这个工作。 但他的代码与我的相似......

请帮我解决此问题或找到解决方法。 (UIParagraphStyle也没有工作,它说没有实现UIParagraphStyleSettings.LineBreakMode setter)

1 个答案:

答案 0 :(得分:3)

显然,从IOS 6及以上版本开始,您必须使用UIKits NSParagraphStyle而不是CoreText CTParagraphStyle

var parstyle = new MonoTouch.UIKit.NSMutableParagraphStyle ();
parstyle.Alignment = MonoTouch.UIKit.UITextAlignment.Justified;
var att = new NSMutableAttributedString (billboard.Desc);
att.AddAttribute (
    MonoTouch.UIKit.UIStringAttributeKey.ParagraphStyle,
    parstyle,
    new NSRange (0, att.Length)
);
att.AddAttribute (
    MonoTouch.UIKit.UIStringAttributeKey.Font,
    MonoTouch.UIKit.UIFont.FromName ("Parangon110C", 11),
    new NSRange (0, att.Length)
    );
DescLabel.AttributedText = att;

NSAttributedString还有一个方便的构造函数来执行此操作:

var parstyle = new MonoTouch.UIKit.NSMutableParagraphStyle ();
parstyle.Alignment = MonoTouch.UIKit.UITextAlignment.Justified;

DescLabel.AttributedText = new NSAttributedString (
                str: billboard.Desc,
                font: MonoTouch.UIKit.UIFont.FromName ("Parangon110C", 11),
                paragraphStyle: parstyle);