Мне интересно использовать пользовательский оверлей для UIImagePickerController
для элементов управления камерой, которые занимают весь экран, очень похожий на то, что делает приложение камеры по умолчанию при переключении на функцию видео.
Я упомянул несколько вопросов здесь о SO по этой теме, особенно этот один, а также Пример Apple о том, как использовать пользовательский оверлей для UIImagePickerController, но ни один из них не смог создать успешный полноэкранный результат с iOS 7.
Пока что пользовательский интерфейс камеры выглядит с пользовательским наложением (без каких-либо кнопок):
Обратите внимание, что в нижней части экрана есть черная полоса. Я заметил, что я мог удалить черную полосу, если я изменил значение cameraAspectRatio
на 1, но это искажает масштабирование камеры, поскольку оно имеет очень увеличенное изображение. Есть ли способ иметь полный экран, не слишком искажая масштаб (я понимаю, что нужно немного), а также удалить черную полосу?
Вот мой код, который настраивает пользовательский оверлей:
{
self.imagePickerController.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self options:nil];
self.overlayView.frame = self.imagePickerController.cameraOverlayView.frame;
self.imagePickerController.cameraOverlayView = self.overlayView;
self.overlayView = nil;
// Device screen size (ignoring rotation intentionally):
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
float cameraAspectRatio = 4.0 / 3.0; //! Note: 4.0 and 4.0 works
float imageWidth = floorf(screenSize.width * cameraAspectRatio);
float scale = ceilf((screenSize.height / imageWidth) * 10.0) / 10.0;
self.imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
Update:
Еще одна проблема, которую я заметил, - изображение, которое отображается в предварительном просмотре камеры, всегда меньше и имеет меньше деталей, чем изображение, которое сохраняется при методе [self.imagePickerController takePicture]
. Чтобы проиллюстрировать:
Вот как выглядит клавиатура в предварительном просмотре камеры с черной полосой ниже (извините, что она немного шаткая):
Однако обратите внимание, что фактическое снятое изображение в панели предварительного просмотра имеет намного больше деталей, как показано здесь, особенно в верхней части, а также влево и вправо.
Мой вопрос: как можно настроить предварительный просмотр камеры так, чтобы то, что пользователь видит в предварительном просмотре, - это именно тот образ, который он будет захватывать и может быть показан им впоследствии? Спасибо!
Обновление 2
Вот весь код в viewDidLoad
, который устанавливает элементы управления камерой.
- (void)viewDidLoad
{
[super viewDidLoad];
//Appearance configuration
self.navigationItem.hidesBackButton = YES;
//UIImagePickerController initialization and setup
self.imagePickerController = [[UIImagePickerController alloc] init];
self.imagePickerController.delegate = self;
self.imagePickerController.allowsEditing = NO;
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypeCamera; //if there is a camera avaliable
} else {
self.imagePickerController.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;//otherwise go to the folder
}
self.imagePickerController.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
if (self.imagePickerController.sourceType == UIImagePickerControllerSourceTypeCamera)
{
self.imagePickerController.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"overlayView" owner:self options:nil];
self.overlayView.frame = self.imagePickerController.cameraOverlayView.frame;
self.imagePickerController.cameraOverlayView = self.overlayView;
self.overlayView = nil;
// Device screen size (ignoring rotation intentionally):
CGSize screenSize = [[UIScreen mainScreen] bounds].size;
int heightOffset = 0;
if(SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(@"7.0"))
{
heightOffset = 120; //whole screen :)
}
float cameraAspectRatio = 4.0 / 3.0; //! Note: 4.0 and 4.0 works
float imageWidth = floorf(screenSize.width * cameraAspectRatio);
float scale = ceilf(((screenSize.height + heightOffset) / imageWidth) * 10.0) / 10.0;
self.imagePickerController.cameraViewTransform = CGAffineTransformMakeScale(scale, scale);
}
}
И в viewWillAppear
я вызываю вид подборщика изображений:
BOOL modalPresent = (BOOL)(self.presentedViewController);
//Present the Camera UIImagePicker if no image is taken
if (!appDelegate.imageStorageDictionary[@"picture1"]){
if (modalPresent == NO){ //checks if the UIImagePickerController is modally active
[self presentViewController:self.imagePickerController animated:NO completion:nil];
}
}