iOS Monotouch UIImagePickerController várias fotos / vídeos da câmera

Estamos enfrentando um problema estranho com um UIImagePickerController. Em nosso aplicativo, os usuários podem preencher uma série de formulários e anexar imagens e vídeos nesses formulários.

Permitimos que os usuários adicionem várias fotos / vídeos do rolo da câmera ou sejam capturados no momento do preenchimento do formulário.

Estamos usando o UIImagePickerController para fazer isso. O problema ocorre quando 1 ou 2 imagens / vídeos são tirados com a câmera.

Depois que 1 ou 2 imagens / vídeos são capturados quando a tela da câmera é inserida novamente pela terceira vez, a imagem fica estática e não é atualizada. A visão está presa no último quadro do que foi capturado por último.

Se o botão de captura for pressionado, a imagem / vídeo será atualizada de repente e capturou o que a câmera estava apontando. A partir de então, o selecionador é bom para outro comportamento normal. Além disso, selecionar uma foto / vídeo do rolo da câmera parece fazer com que tudo se comporte novamente para outra foto / vídeo. Finalmente, quando a tela não está respondendo e o usuário selecionou para tirar uma foto, a visão irá encolher para um pequeno retângulo dentro da visão. O controlador está sendo configurado da seguinte maneira:

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

Um exemplo de um captureEvent é o seguinte:

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

No momento, como você pode ver, não estamos mantendo uma referência ao selecionador, mas tentamos variações desse código, em que armazenamos uma referência ao selecionador e o descartar depois do método CopyData, adicionamos picker.Release () ; após copydata e antes do descarte (resulta em coletores subseqüentes quebrando o aplicativo quando exibido) e praticamente todas as outras variações sobre o tema.

Alguém tem alguma idéia por que isso pode estar ocorrendo e como corrigi-lo? Foi minha suposição de que talvez estivéssemos com pouca memória, mas nem descartá-la toda vez / apenas criando uma instância e mudando seu modo de imagens para vídeos tem algum efeito e sempre vemos o mesmo comportamento.

EDITAR

Graças a Kento e a resposta abaixo, o que precisávamos para que tudo funcionasse como planejado era algo 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);
    }
}

Então, para obter uma imagem

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

Ou para obter um vídeo

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

questionAnswers(2)

yourAnswerToTheQuestion