iOS Monotouch UIImagePickerController несколько фотографий / видео с камеры

Мы'испытывает странную проблему с UIImagePickerController. В нашем приложении пользователи могут заполнять ряд форм, а также прикреплять изображения и видео в этих формах.

Мы разрешаем пользователям добавлять несколько фотографий / видео либо с рулона камеры, либо для захвата во время заполнения формы.

Мы'Для этого используется UIImagePickerController. Проблема возникает, когда 1 или 2 изображения / видео снимаются на камеру.

После того, как 1 или 2 изображения / видео будут сняты при повторном вводе экрана камеры в третий раз, изображение статично и нет обновление. Вид застрял в последнем кадре того, что было снято последним.

Если кнопка захвата нажата, то изображение / видео неожиданно обновляются и фиксируют то, на что указывает камера. С тех пор сборщик хорош для другого иди, ведя себя нормально. Кроме того, при выборе изображения / видео с рулона камеры все снова начинает работать для другого изображения / видео. Наконец, когда экран неt отвечает, и пользователь выбрал сделать снимок, вид будет уменьшен до небольшого прямоугольника в представлении. Контроллер настраивается следующим образом:

    private void SourceChosen(EventHandler captureEvent, int buttonIndex, string[] mediaTypes)
    {
        var picker = ConfigurePicker(mediaTypes, captureEvent);

        if (CameraAvailable && buttonIndex == 0)
        {
            picker.SourceType = UIImagePickerControllerSourceType.Camera;
            picker.CameraDevice = UIImagePickerControllerCameraDevice.Rear;
            this.NavigationController.PresentViewController(picker, true, () => { });
        }

        if ((!CameraAvailable && buttonIndex == 0) || (CameraAvailable && buttonIndex == 1))
        {
            picker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            this.NavigationController.PresentViewController(picker, false, () => { });
        }
    }

    private UIImagePickerController ConfigurePicker(string[] mediaTypes, EventHandler captureEvent)
    {
        var mediaPicker = new UIImagePickerController();
        mediaPicker.FinishedPickingMedia += captureEvent;
        mediaPicker.Canceled += (sender, args) => mediaPicker.DismissViewController(true, () => { });
        mediaPicker.SetBarDefaults();
        mediaPicker.MediaTypes = mediaTypes;
        return mediaPicker;
    }

Пример captureEvent выглядит следующим образом:

    void PhotoChosen(object sender, UIImagePickerMediaPickedEventArgs e)
    {
        UIImage item = e.OriginalImage;
        string fileName = string.Format("{0}.{1}", Guid.NewGuid(), "png");
        string path = Path.Combine(IosConstants.UserPersonalFolder, fileName);
        NSData imageData = item.AsPNG();
        CopyData(imageData, path, fileName, ViewModel.Images, ((UIImagePickerController)sender));
    }

    private void CopyData(NSData imageData, string path, string fileName, List collectionToAddTo, UIImagePickerController picker)
    {
        byte[] imageBytes = new byte[imageData.Length];
        System.Runtime.InteropServices.Marshal.Copy(imageData.Bytes, imageBytes, 0, Convert.ToInt32(imageData.Length));
        File.WriteAllBytes(path, imageBytes);

        AssociatedItem item = new AssociatedItem
        {
            StorageKey = fileName
        };

        collectionToAddTo.Add(item);
        picker.DismissViewController(true, ReloadTables);
    }

На данный момент, как вы можете видеть, мыу нас нет ссылки на средство выбора, но мы попробовали варианты этого кода, в которых мы сохраняем ссылку на средство выбора и располагаем ее после метода CopyData.добавили сборщик. Release (); после copydata и перед утилизацией (приводит к последующим сбоям выбора приложений при отображении) и практически во всех других вариациях темы.

У кого-нибудь есть идеи, почему это может происходить и как это исправить? Я предполагал, что у нас может быть недостаточно памяти, но ни один из них не используется каждый раз / только когда мы создаем один экземпляр и меняем его режим с изображений на видео, это никак не влияет, и мы всегда видим одинаковое поведение.

РЕДАКТИРОВАТЬ

Спасибо Кенто и ответу ниже, что нам нужно, чтобы все работало как задумано, что-то вроде:

public class PickerDelegate : UIImagePickerControllerDelegate
{
    private readonly Action _captureEvent;

    public PickerDelegate(Action captureEvent)
    {
        _captureEvent = captureEvent;
    }

    public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info)
    {
        _captureEvent(picker, info);
    }
}

Затем, чтобы получить изображение

    void PhotoChosen(UIImagePickerController picker, NSDictionary info)
    {
        UIImage item = (UIImage)info.ObjectForKey(UIImagePickerController.OriginalImage);
        string fileName = string.Format("{0}.{1}", Guid.NewGuid(), "png");
        string path = Path.Combine(IosConstants.UserPersonalFolder, fileName);
        NSData imageData = item.AsPNG();
        CopyData(imageData, path, fileName, ViewModel.Images, picker);
    }

Или получить видео

    void VideoChosen(UIImagePickerController picker, NSDictionary info)
    {
        var videoURL = (NSUrl)info.ObjectForKey(UIImagePickerController.MediaURL);
        NSData videoData = NSData.FromUrl(videoURL);
        string fileName = string.Format("{0}.{1}", Guid.NewGuid(), "mov");
        string path = Path.Combine(IosConstants.UserPersonalFolder, fileName);
        CopyData(videoData, path, fileName, ViewModel.Videos, picker);
    }

Ответы на вопрос(2)

Ваш ответ на вопрос