4

(这个问题与我之前问的相反,从 RectangleF[] 到 NSArray 时。请参阅此处:如何将 RectangleF[] 转换为 CGRects 的 NSArray?

我有一个 3rd 方库和它的绑定。其中一个绑定是返回一个 NSArray(注意:它不是一个“ NSArray*”,而是一个普通的“ ”),因此MonoTouch 不工作/不支持NSArray返回RectangleF[]而不是。NSArray我现在遇到的问题:如何将返回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没有暴露,也CGRect没有RectangleF继承自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;
    }
}
4

1 回答 1

7

此处已对此进行了回答,但仅作记录:

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

试试这个:

for(uint i = 0; i < oHighlightAnnot.Rects.Count; ++i)
{
    IntPtr ptrRect = oHighlightAnnot.Rects.ValueAt(i);
    var val = new NSValue(ptrRect);
    var rect = val.RectangleFValue;
}
于 2012-12-10T14:08:31.023 回答