我有一个基于xamarin.forms的应用程序,运行在Android和iOS上。现在,我正在实现从相机卷中选择图像并将其上载到服务器的功能。因此,我正在为iOS编写平台特定的代码,这就是发生错误的地方。
我从iOS平台特定的渲染器调用uiImagePickerController。它正常打开。但是,在uiImagePickerController中点击图像时,除了在调试控制台中显示消息的Visual Studio外,不会发生任何事情:
“警告:尝试在xamarin_forms_platforms_ios_platformrenderer:0x153EAD6A0上显示xamarin_forms_platform_ios_modalwrapper:0x155A7ED00,其视图不在窗口层次结构中!”
我在谷歌上搜索,发现有人在写一个名为“getvisibleviewcontroller”的函数,我把它改编成了我的项目(你可以在下面看到)。在该函数返回的viewController上,我调用presentModalView Controller()方法。不幸的是,它也不起作用。无法选择照片。
private void ChoosePhoto()
{
_imagePicker = new UIImagePickerController()
{
SourceType = UIImagePickerControllerSourceType.PhotoLibrary,
MediaTypes = new string[] { UTType.Image }
};
_imagePicker.FinishedPickingMedia += delegate (object sender, UIImagePickerMediaPickedEventArgs e)
{
var fileName = eopAppLibrary.Tools.GetTimestampJpegFileName("ScanToEop_iOS");
var jpegImageData = e.OriginalImage.AsJPEG();
var jpegBytes = jpegImageData.ToArray();
Events.RaiseFilePreviewNeeded(this, jpegBytes, fileName);
};
_imagePicker.Canceled += delegate (object sender, EventArgs e)
{
_imagePicker.DismissModalViewController(true);
};
var viewController = GetVisibleViewController();
viewController.PresentModalViewController(_imagePicker, true);
}
UIViewController GetVisibleViewController(UIViewController controller = null)
{
controller = controller ?? UIApplication.SharedApplication.KeyWindow.RootViewController;
if (controller.PresentedViewController == null)
{
return controller;
}
if (controller.PresentedViewController is UINavigationController)
{
return ((UINavigationController)controller.PresentedViewController).VisibleViewController;
}
if (controller.PresentedViewController is UITabBarController)
{
return ((UITabBarController)controller.PresentedViewController).SelectedViewController;
}
return GetVisibleViewController(controller.PresentedViewController);
}
最佳答案
我们也遇到了类似的问题,我们得出了以下结论:
var topViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
var controllerToPresentWith = topViewController.VisibleViewController();
controllerToPresentWith.PresentModalViewController(_imagePicker, true);
然后
...
public static UIViewController VisibleViewController(this UIViewController controller)
{
if (controller == null)
return null;
if (controller is UINavigationController navController)
{
return navController.VisibleViewController();
}
else if (controller is UITabBarController tabController)
{
tabController.SelectedViewController?.VisibleViewController();
}
else
{
var vc = controller.PresentedViewController?.VisibleViewController();
if (vc != null)
return vc;
}
return controller;
}