【问题标题】:How to convert NSRect/CGRect back to RectangleF in MonoTouch?如何在 MonoTouch 中将 NSRect/CGRect 转换回 RectangleF?
【发布时间】:2012-11-27 17:14:58
【问题描述】:

(这个问题与我之前问的相反,从 RectangleF[] 到 NSArray 时。请参见此处:How to convert RectangleF[] into NSArray of CGRects?

我有一个第 3 方库和它的绑定。 其中一个绑定是返回一个 NSArray(注意:它不是一个“NSArray*”而是一个普通的“NSArray”),因此返回 RectangleF[] 而不是 NSArray 不起作用/由 MonoTouch 支持。 我现在遇到的问题:如何将返回的NSArray(我知道的NSRect)转换回RectangleF[]

如果我循环遍历 NSArray:

for(uint i = 0; i < oHighlightAnnot.Rects.Count; ++i)
{
  IntPtr ptrRect = oHighlightAnnot.Rects.ValueAt(i);
  var oObj = new NSObject(ptrRect);
}

然后检查 oObj,我可以在调试器中看到它是一个 NSRect:

{NSRect: {{121.3672, 265.76123}, {192.09813, 288}}}

然后呢? NSRect 没有公开,CGRectRectangleF 也没有从 NSObject 继承。如何投射/转换回来?

完成方法如下:

public virtual NSArray Rects
{
    [Export ("rects")]
    get
    {
        NSArray nSArray;
        if (this.IsDirectBinding)
        {
            nSArray = (NSArray)Runtime.GetNSObject (Messaging.IntPtr_objc_msgSend (base.get_Handle (), PSPDFHighlightAnnotation.selRects));
        }
        else
        {
            nSArray = (NSArray)Runtime.GetNSObject (Messaging.IntPtr_objc_msgSendSuper (base.get_SuperHandle (), PSPDFHighlightAnnotation.selRects));
        }
        base.MarkDirty ();
        this.__mt_Rects_var = nSArray;
        return nSArray;
    }
    [Export ("setRects:")]
    set
    {
        if (this.IsDirectBinding)
        {
            Messaging.void_objc_msgSend_IntPtr (base.get_Handle (), PSPDFHighlightAnnotation.selSetRects_, (value != null) ? value.get_Handle () : IntPtr.Zero);
        }
        else
        {
            Messaging.void_objc_msgSendSuper_IntPtr (base.get_SuperHandle (), PSPDFHighlightAnnotation.selSetRects_, (value != null) ? value.get_Handle () : IntPtr.Zero);
        }
        base.MarkDirty ();
        this.__mt_Rects_var = value;
    }
}

【问题讨论】:

    标签: c# xamarin.ios


    【解决方案1】:

    已回答here,但仅作记录:

    我的猜测是你看到的是一个包裹在一个 NSValue 中的 NSRect。

    试试这个:

    for(uint i = 0; i < oHighlightAnnot.Rects.Count; ++i)
    {
        IntPtr ptrRect = oHighlightAnnot.Rects.ValueAt(i);
        var val = new NSValue(ptrRect);
        var rect = val.RectangleFValue;
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-13
      • 1970-01-01
      相关资源
      最近更新 更多