如何在MonoTouch中将NSRect / CGRect转换回RectangleF?

时间:2012-12-10 09:47:54

标签: c# xamarin.ios

(这个问题与我之前提出的问题相反,当我从RectangleF []转到NSArray时。请看这里:How to convert RectangleF[] into NSArray of CGRects?

我有第三方库和绑定。 其中一个绑定是返回一个NSArray(注意:它是一个“NSArray*”,而是一个普通的“NSArray”,因此返回RectangleF[]而不是MonoTouch不支持NSArray NSArray。 我现在遇到的问题:如何将返回的NSRect(我知道的RectangleF[])转换回for(uint i = 0; i < oHighlightAnnot.Rects.Count; ++i) { IntPtr ptrRect = oHighlightAnnot.Rects.ValueAt(i); var oObj = new NSObject(ptrRect); }

如果我循环通过NSArray:

NSRect

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

  

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

但是呢? CGRect未显示RectangleFNSObjectpublic 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; } } 也未继承{{1}}。如何投射/转换回来?

以下是完成方法:

{{1}}

1 个答案:

答案 0 :(得分:7)

已回复here,但仅供记录:

我的猜测是你看到一个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;
}