1

ApplifierObj-CAPI用の最小限のMonoTouchバインディングを作成するために取り組んでいます。これには、init用の次のメソッドが含まれています。

+ (Applifier *)initWithApplifierID:(NSString *)applifierID withWindow:(UIWindow *)window 
supportedOrientations:(UIDeviceOrientation)orientationsToSupport, ...NS_REQUIRES_NIL_TERMINATION;

可変個引数パラメーターメソッドのバインディングドキュメントの指示に従って、このインターフェイスメソッドを思いつきました。

[Static]
[Export ("initWithApplifierId:withWindow:supportedOrientations:"), Internal]
void InitWithApplifierId (string applifierID, UIWindow withWindow,
    UIDeviceOrientation supportedOrientations, IntPtr orientationsPtr);

そして私の拡張機能のこのパブリックメソッド

public static Applifier InitWithApplifierId(string applifierId, UIWindow window,
    params UIDeviceOrientation[] supportedOrientations)
{
    if (supportedOrientations == null)
        throw new ArgumentNullException ("supportedOrientations");

    var pNativeArr = Marshal.AllocHGlobal(supportedOrientations.Length * IntPtr.Size);
    for (int i = 1; i < supportedOrientations.Length; ++i) {
        Marshal.WriteIntPtr (pNativeArr, (i - 1) * IntPtr.Size,
            supportedOrientations[i].Handle);
    }

    // Null termination
    Marshal.WriteIntPtr (pNativeArr, (supportedOrientations.Length - 1) * IntPtr.Size,
        IntPtr.Zero);

    Applifier.InitWithApplifierId(applifierId, window, supportedOrientations[0],
        pNativeArr);
    Marshal.FreeHGlobal(pNativeArr);
}

ただし、UIDeviceOrientationはオブジェクトではなく列挙型であるため、書き込むハンドルはありません。私はobjective-cに非常に慣れておらず、C#にもかなり慣れていません(私のプロジェクトは実際にはIKVMを介してMonoTouchとインターフェイスします。私の専門知識はJavaです)。私はsupportedOrientation[i]自体の素朴なMarshal.WriteInt32を実行することに挑戦しましたが、コンパイル時にも失敗しました。

もっと簡単な場合は、代わりにバインドできるこのメソッドのオーバーロードがあります。

+ (Applifier *)initWithApplifierID:(NSString *)applifierID withWindow:(UIWindow *)window 
supportedOrientationsArray:(NSMutableArray *)orientationsArray;

ただし、NSMutableArrayをバインドする方法もわかりません:)

4

1 に答える 1

1

1つの解決策は、強調表示した2番目のメソッドをバインドすることです

[Static]
[Export ("initWithApplifierID:withWindow:supportedOrientationsArray:")]
Applifier InitWithApplifierID (string applifierID, UIWindow withWindow, NSMutableArray orientationsArray);

そして今、あなたはこのようにそのctorを使うことができます

NSNumber faceDown = NSNumber.FromInt32( (int) UIDeviceOrientation.FaceDown);
NSNumber faceUp = NSNumber.FromInt32( (int) UIDeviceOrientation.FaceUp);
NSNumber landscapeLeft = NSNumber.FromInt32( (int) UIDeviceOrientation.LandscapeLeft);
NSNumber landscapeRight = NSNumber.FromInt32( (int) UIDeviceOrientation.LandscapeRight);
NSNumber portrait = NSNumber.FromInt32( (int) UIDeviceOrientation.Portrait);
NSNumber portraitUpsideDown = NSNumber.FromInt32( (int) UIDeviceOrientation.PortraitUpsideDown);
NSNumber unknown = NSNumber.FromInt32( (int) UIDeviceOrientation.Unknown);

NSMutableArray orientationsArray = new NSMutableArray(7); // Set here the number of orientations wanted

orientationsArray.AddObjects( new NSObject[7] { faceDown, faceUp, landscapeLeft, landscapeRight, portrait, portraitUpsideDown, unknown } ); // add here the orientations wanted


var applifier = Applifier.InitWithApplifierID(applifierID, withWindow, orientationsArray);

ちょっと醜いですが、うまくいくはずです、これが役立つことを願っています

アレックス

于 2012-10-25T03:15:01.323 に答える