iOS Monotouch UIImagePickerController múltiples fotos / videos desde la cámara

Estamos experimentando un problema extraño con un UIImagePickerController. En nuestra aplicación, los usuarios pueden completar una serie de formularios y también adjuntar imágenes y videos dentro de estos formularios.

Permitimos que los usuarios agreguen varias fotos / videos desde el rollo de la cámara o que sean capturados al momento de completar el formulario.

Estamos usando el UIImagePickerController para hacer esto. El problema ocurre cuando se toman 1 o 2 imágenes / videos con la cámara.

Una vez que se capturan 1 o 2 imágenes / videos cuando se vuelve a ingresar a la pantalla de la cámara por tercera vez, la imagen es estática y no se actualiza. La vista está bloqueada en el último cuadro de lo que se capturó en último lugar.

Si se presiona el botón de captura, la imagen / video se actualiza repentinamente y ha capturado lo que la cámara estaba apuntando. A partir de entonces, el selector es bueno para otro ir comportándose normalmente. Además, al seleccionar una imagen / video del rollo de la cámara aparece para hacer que todo se comporte nuevamente para otra imagen / video. Finalmente, cuando la pantalla no responde y el usuario ha seleccionado tomar una foto, la vista se reducirá a un pequeño rectángulo dentro de la vista. El controlador se está configurando de la siguiente manera:

    private void SourceChosen(EventHandler<UIImagePickerMediaPickedEventArgs> 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<UIImagePickerMediaPickedEventArgs> captureEvent)
    {
        var mediaPicker = new UIImagePickerController();
        mediaPicker.FinishedPickingMedia += captureEvent;
        mediaPicker.Canceled += (sender, args) => mediaPicker.DismissViewController(true, () => { });
        mediaPicker.SetBarDefaults();
        mediaPicker.MediaTypes = mediaTypes;
        return mediaPicker;
    }

Un ejemplo de un captureEvent es el siguiente:

    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<AssociatedItem> 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);
    }

En este momento, como puede ver, no estamos manteniendo una referencia al selector, pero hemos intentado variaciones de este código donde almacenamos una referencia al selector y la desechamos después del método CopyData, hemos agregado el selector. ; después de los datos de copia y antes de desecharlos (los recolectores posteriores fallan en la aplicación cuando se muestran) y casi todas las demás variaciones del tema.

¿Alguien tiene alguna idea de por qué esto puede estar ocurriendo y cómo solucionarlo? Supongo que podríamos estar quedando sin memoria, pero no disponer de ella cada vez / solo creando una instancia y cambiando su modo de imagen a video tiene algún efecto y siempre vemos el mismo comportamiento.

EDITAR

Gracias a Kento y la siguiente respuesta, lo que necesitábamos para que todo funcionara como estaba previsto era algo así como:

public class PickerDelegate : UIImagePickerControllerDelegate
{
    private readonly Action<UIImagePickerController, NSDictionary> _captureEvent;

    public PickerDelegate(Action<UIImagePickerController, NSDictionary> captureEvent)
    {
        _captureEvent = captureEvent;
    }

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

Entonces para obtener una imagen.

    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);
    }

O para obtener un video

    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);
    }

Respuestas a la pregunta(2)

Su respuesta a la pregunta