Xamarin.iOS中AVCaptureMetadataOutput属性声明差异及使用疑问
Xamarin.iOS AVCaptureMetadataOutput属性绑定问题解答
声明正确性判断
苹果官方的Objective-C声明是原生的正确定义,你所看到的返回单个AVMetadataObjectType的C#声明是旧版本Xamarin.iOS的绑定bug,该问题在Xamarin.iOS 8.10及后续正式版中已经完成修复,修复后的正确绑定签名为:
public virtual AVMetadataObjectType[] AvailableMetadataObjectTypes { get; }
产生错误的原因是早期Xamarin绑定工具在处理带枚举泛型约束的NSArray返回值时,映射逻辑出错,误将数组类型绑定为了单枚举值。
Xamarin.iOS环境下的正确用法
首先确认本地开发环境的Xamarin.iOS版本≥8.10,避免触发旧版本的绑定问题,常规使用示例如下:
using AVFoundation; using Foundation; // 初始化捕获会话逻辑省略 var captureSession = new AVCaptureSession(); var metadataOutput = new AVCaptureMetadataOutput(); if (captureSession.CanAddOutput(metadataOutput)) { captureSession.AddOutput(metadataOutput); // 获取当前设备支持的所有可识别元数据类型 var supportedMetadataTypes = metadataOutput.AvailableMetadataObjectTypes; // 示例:仅开启二维码识别,先判断当前设备是否支持 if (supportedMetadataTypes.Contains(AVMetadataObjectType.QRCode)) { metadataOutput.MetadataObjectTypes = AVMetadataObjectType.QRCode; // 后续设置识别代理、启动会话等逻辑省略 } }
如果仍在使用未修复该问题的旧版本Xamarin.iOS,建议优先升级版本,也可以通过手动调用ObjC Runtime的方式直接获取原生返回值绕过绑定错误。
NSSet对应的C#等效类型
在Xamarin.iOS的绑定体系中对应两种情况:
- 调用原生iOS API时,
NSSet对应的绑定类型是Foundation.NSSet,泛型版本为Foundation.NSSet<T> - 做.NET层通用逻辑开发时,和
NSSet语义等效的基类库类型是System.Collections.Generic.HashSet<T>,Xamarin提供了二者的互转扩展方法。
内容的提问来源于stack exchange,提问作者canderse
相关产品推荐
相关产品推荐

