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をバインドする方法もわかりません:)