Как выбрать несколько изображений из галереи с помощью GMImagePicker в xamarin IOS? - PullRequest
0 голосов
/ 14 января 2019

Я просматриваю этот блог для выбора нескольких изображений из галереи. Для IOS я использую GMImagePicker для выбора нескольких изображений из галереи. (В блоге предлагается elcimagepicker, но сейчас он недоступен в Nuget Store)

Я просматриваю часть GMImagePicker Использование , но не нашел, как добавить выбранные изображения в List и передать это значение в MessagingCenter (как в реализации Android). В этой части использования только рассказать о настройках выбора. Кто-нибудь, пожалуйста, дайте мне пример кода для выполнения этой функции?

Привет Lucas Zhang - MSFT, я попробовал ваш код, но один вопрос. Здесь вы передаете только один путь к файлу через messagecenter, поэтому я должен использовать список для отправки нескольких путей к файлам?

Я передаю пути изображения как string List от Android. Пожалуйста, посмотрите на код Android, добавленный ниже. Должен ли я сделать это в IOS?

protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
    {
        base.OnActivityResult(requestCode, resultCode, data);

        if (resultCode == Result.Ok)
        {
            List<string> images = new List<string>();

            if (data != null)
            {
                ClipData clipData = data.ClipData;
                if (clipData != null)
                {
                    for (int i = 0; i < clipData.ItemCount; i++)
                    {
                        ClipData.Item item = clipData.GetItemAt(i);
                        Android.Net.Uri uri = item.Uri;
                        var path = GetRealPathFromURI(uri);

                        if (path != null)
                        {
                            //Rotate Image
                            var imageRotated = ImageHelpers.RotateImage(path);
                            var newPath = ImageHelpers.SaveFile("TmpPictures", imageRotated, System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
                            images.Add(newPath);
                        }
                    }
                }
                else
                {
                    Android.Net.Uri uri = data.Data;
                    var path = GetRealPathFromURI(uri);

                    if (path != null)
                    {
                        //Rotate Image
                        var imageRotated = ImageHelpers.RotateImage(path);
                        var newPath = ImageHelpers.SaveFile("TmpPictures", imageRotated, System.DateTime.Now.ToString("yyyyMMddHHmmssfff"));
                        images.Add(newPath);
                    }
                }

                MessagingCenter.Send<App, List<string>>((App)Xamarin.Forms.Application.Current, "ImagesSelected", images);
            }
        }
    }

Также я получаю сообщение об ошибке, добавлен скриншот ниже:

enter image description here

1 Ответ

0 голосов
/ 15 января 2019

GMImagePicker вернет список, содержащий PHAsset. Таким образом, вы можете сначала получить filePath изображений, а затем передать их в формы, используя MessagingCenter и DependencyService. См. Следующий код.

в Forms, создайте интерфейс

using System;

namespace app1
{
  public interface ISelectMultiImage
  {
    void SelectedImage();
  }
}

в проекте iOS

using System;
using Xamarin.Forms;
using UIKit;
using GMImagePicker;
using Photos;
using Foundation;

[assembly:Dependency(typeof(SelectMultiImageImplementation))]
namespace xxx.iOS
{
  public class SelectMultiImageImplementation:ISelectMultiImage
  {
    public SelectMultiImageImplementation()
    {
    }


    string Save(UIImage image, string name)
    {
        var documentsDirectory = Environment.GetFolderPath
                              (Environment.SpecialFolder.Personal);
        string jpgFilename = System.IO.Path.Combine(documentsDirectory, name); // hardcoded filename, overwritten each time
        NSData imgData = image.AsJPEG();
        if (imgData.Save(jpgFilename, false, out NSError err))
        {
            return jpgFilename;
        }
        else
        {
            Console.WriteLine("NOT saved as " + jpgFilename + " because" + err.LocalizedDescription);
            return null;
        }
    }

    public void SelectedImage()
    {

        var picker = new GMImagePickerController();
        picker.FinishedPickingAssets += (s, args) => {


            PHAsset[] assets = args.Assets;



            foreach (PHAsset asset in assets)
            {
                PHImageManager.DefaultManager.RequestImageData(asset, null, (NSData data, NSString dataUti, UIImageOrientation orientation, NSDictionary info) =>
                {
                    NSUrl url = NSUrl.FromString(info.ValueForKey(new NSString("PHImageFileURLKey")).ToString());

                    string[] strs = url.Split("/");


                    UIImage image = UIImage.LoadFromData(data);

                    string file = Save(UIImage.LoadFromData(data), strs[strs.Length - 1]);


                    MessagingCenter.Send<Object, string>(this, "ImagesSelected", file);

                }
                );

            }

        };
       UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(picker, true,null);

    }
  }
}

в вашем контентестраницы

...
List<string> selectedImages;
...

public MyPage()
{
   selectedImages = new List<string>();
   InitializeComponent();

   MessagingCenter.Subscribe<Object,string>(this, "ImagesSelected",(object arg1,string arg2) =>
        {
            string source = arg2;

            selectedImages.Add(source);

        });

 } 

Если вы хотите выбрать изображения, вызовите метод

 DependencyService.Get<ISelectMultiImage>().SelectedImage();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...