UIImagePickerController в пользовательском представлении не показывает камеру
Я пытаюсь отобразить содержимое камеры в пользовательском представлении. Чего я просто хочу добиться, так это иметь пользовательские кнопки для съемки, чтобы делать более одной фотографии за один раз.
Теоретически он должен работать "из коробки", но на практике иногда случается так, что, если я отклоняю свой пользовательский контроллер представления, а затем вновь открываю его "быстро", UIImagePickerController просто показывает пустой (фактически черный) контент. Самое смешное, что если вы попытаетесь сделать снимок, камера на самом деле включена, затвор откроется, и вы сможете собрать изображение. Кажется, единственная проблема связана с отображением живого контента в конкретном UIView.
Вот код, который я использую для его отображения:
UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init];
[imagePickerController setSourceType:UIImagePickerControllerSourceTypeCamera];
[imagePickerController setShowsCameraControls:NO];
[imagePickerController setEditing:NO];
[imagePickerController setNavigationBarHidden:YES];
[imagePickerView addSubview:[imagePickerController view]];
[imagePickerController viewWillAppear:YES];
Мне это не нравится viewWillAppear
вызов метода, но это единственный способ, который я нашел, чтобы показать это.imagePickerView
Это, действительно, вид, который я ранее создал, чтобы поместить сборщика в.
Я сам немного покопался в проблеме и заметил, что если я подожду пару секунд, прежде чем снова открыть свой пользовательский контроллер представления, сборщик будет отображаться нормально.
Если взглянуть на консоль, кажется, что сборщик (или связанный с ним ресурс камеры) на самом деле освобождается через некоторое время, но это всего лишь предположение.
Любая подсказка? Спасибо
1 ответ
Вам определенно нужен этот вызов viewWillAppear и, вероятно, больше. Всякий раз, когда UIImagePickerController представляется одним из "косвенных" методов представления (например, модальное представление или помещается в стек навигации), он автоматически отправляет все соответствующие уведомления, связанные с отображением: viewWillAppear:, viewDidAppear:, viewWillDisappear: и viewDidDisappear:.
Внутренне UIImagePickerController использует эти уведомления для выполнения соответствующих действий инициализации, таких как эффект затвора. Вы не знаете, как он их использует, вы просто должны быть уверены, что он их получает.
Когда вы представляете UIImagePickerController напрямую, добавляя его представление в качестве подпредставления, вы лишаете его автоматического получения этих уведомлений. Из Руководства по программированию ViewController:
Если вы включаете представление контроллера представления в свою иерархию другими способами (возможно, добавляя его как подпредставление к другому представлению), система предполагает, что вы хотите управлять представлением самостоятельно, и не отправляет сообщения в связанный объект контроллера представления.
Это не обязательно плохо, это просто означает, что вам нужно взять на себя ответственность за эти сообщения самостоятельно. Я не видел именно этой проблемы, связанной с отображением средства выбора, но моя первая попытка исправить это состояла бы в том, чтобы каждое из этих 4 связанных с отображением уведомлений отправлялось контроллеру средства выбора в соответствующее время, особенно исчезающие, если вы этого еще не сделали.