2014-10-22 3 views
2

На всех устройствах iOS 8 у меня возникает новый вопрос, когда я использую UIImagePickerController (на iOS 7 он работает нормально). Первый снимок работает так, как ожидалось. Когда я пытаюсь сделать еще одну фотографию, появляется UIImagePickerController, но отображается черный экран.UIImagePickerController показывает черный экран для каждого второго снимка

Все элементы управления, такие как камера переключения, отмена и снятие кнопки с фотографией, доступны и работают. Если я попытаюсь сделать вторую фотографию и прикоснуться к кнопке, я получу правильный предварительный просмотр взятой фотографии. Если я сохраню эту фотографию и попытаюсь сделать другую, все будет вести себя так, как ожидалось. Только четвертая фотография снова повторяет ту же тему. И так далее ...

Это мой код:

public void ButtonCameraClicked(object sender, EventArgs eventArgs) 
{ 
    _imagePickerDelegate = new ImagePickerControllerDelegate(this); 
    _imagePicker = new UIImagePickerController(); 
    _imagePicker.ImagePickerControllerDelegate = _imagePickerDelegate; 

    if (UIImagePickerController.IsSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) 
     _imagePicker.SourceType = UIImagePickerControllerSourceType.Camera; 
    else 
     _imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary; 

    PresentViewController(_imagePicker, true, null); 
} 

public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info) 
{ 
    BTProgressHUD.Show("Bild wird gespeichert..."); 
    var image = (UIImage)info.ObjectForKey(new NSString("UIImagePickerControllerOriginalImage")); 
    image.SaveToCustomPhotosAlbum(info[UIImagePickerController.MediaMetadata] as NSDictionary, _controller.AlbumName, _controller.MediaSaved); 
    picker.DismissViewController(true, null); 
} 

Я уже гугле намного пытавшихся следующие вещи без какого-либо успеха

Инициализация только один раз

if (_imagePicker == null) 
{ 
    _imagePickerDelegate = new ImagePickerControllerDelegate(this); 
    _imagePicker = new UIImagePickerController(); 
    _imagePicker.ImagePickerControllerDelegate = _imagePickerDelegate; 
} 

Или с использованием блока завершения

PresentViewController(_imagePicker, true,() => { }); 

PresentViewController(_imagePicker, true,() => { Thread.Sleep(300); }); 

Или синхронизации с основным потоком

InvokeOnMainThread(() => { ... });` 
`NSOperationQueue.MainQueue.AddOperation(() => { ... }); 

Весь код файл доступен по адресу: https://gist.github.com/anonymous/83a855d44d697235849b

+1

У меня была такая же проблема. Изменение размера и сохранение изображения в другой очереди с помощью dispatch_async помогло. Предварительный просмотр камеры требует основного потока. –

ответ

0

Я попробовал все, что вы пробовали, а затем решил пойти другим путем. Компонент Xamarin.Mobile в хранилище компонентов не только обеспечивает кросс-платформенную реализацию камеры, но и в моем тестировании не подлежит той же самой проблеме предварительного просмотра iOS 7+.

Пример использования сhttps://components.xamarin.com/gettingstarted/xamarin.mobile

using Xamarin.Media; 
using System.Threading; 
using System.Threading.Tasks; 
//... 


var picker = new MediaPicker(); 
MediaPickerController controller = picker.GetTakePhotoUI (new StoreCameraMediaOptions { 
    Name = "test.jpg", 
    Directory = "MediaPickerSample" 
}); 

// On iPad, you'll use UIPopoverController to present the controller 
PresentViewController (controller, true, null); 

controller.GetResultAsync().ContinueWith (t => { 
// Dismiss the UI yourself 
    controller.DismissViewController (true,() => { 
    //might want to add if(t.Result.Status = task.enumstatus.rantocompletion) 
    //or camera cancels will throw exceptions 
    MediaFile file = t.Result; 
    }); 

}, TaskScheduler.FromCurrentSynchronizationContext()); 
Смежные вопросы