核心文本FrameSetter与monotouch

时间:2011-07-26 10:36:38

标签: text xamarin.ios core paragraph

使用monotouch,我尝试在多行上显示核心文本元素。我尝试使用的示例来自CoreText_Programming p17。我遇到的一个问题是无法找到CFMutableAttributedStringRef的等价物,所以我试图将其替换为NSAttributedString,但以下代码不显示任何内容。有没有人知道这种类型的单一信息的例子或知道以下不起作用的原因。感谢。

    public override void Draw (RectangleF rect)
    {
        base.Draw (rect);   

        CGContext context = UIGraphics.GetCurrentContext ();
        context.TextMatrix = new CGAffineTransform();           
        CGPath path = new CGPath();
        path.AddRect ( this.Bounds );
        // created dictionary so this line does not crash 
        NSAttributedString stringToDraw = new NSAttributedString( "Hello", new NSDictionary() );
        CTFramesetter framesetter = new CTFramesetter(stringToDraw);
        CTFrame frame = framesetter.GetFrame( new NSRange(0,0), path, null );
        frame.Draw( context );
    }

2 个答案:

答案 0 :(得分:2)

实际上,当我编写/测试MonoTouch.CoreText框架时,我将大部分样本移植到MonoTouch。然后显然完全忘记了将它们合并到上游。 : - /

那就是说,看一下CoreTextDemo.cs,你链接到的PDF中的大多数样本的端口(几乎是逐行)。

根据我的CoreTextDemo.cs,你错过了:

  • 正确CGAffineTransform.MakeScale()来电:context.TextMatrix = CGAffineTransform.MakeScale(1f, -1f);
  • 您没有使用NSMutableAttributedString。 (CFMutableAttributedStringRef映射到NSMutableAttributedString。)
  • 您不会处置framesetter,也不会处理frame

可能还有其他人,但当时CoreTextDemo.cs代码与Objective-C代码等效。

答案 1 :(得分:0)

不确定这是否正确但是这里......

来自Apple的CFMutableAttributedStringRef参考文档:

  

重要提示:必须为属性字符串设置属性词典   总是用kCFCopyStringDictionaryKeyCallbacks为他们创建   他们的字典键回调和kCFTypeDictionaryValueCallBacks   价值回调;否则这是一个错误。

所以我认为使用new NSDictionary()参数创建它是不够的。