Как получить пользовательский оверлей для камеры UIImagePicker для полноэкранного режима в iOS 7?
Я заинтересован в использовании пользовательского наложения для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's 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);
}
Обновить:
Еще одна проблема, которую я заметил, это то, что изображение, отображаемое в режиме предварительного просмотра камеры, всегдаменьше и имеет меньше деталей, чем изображение, которое сохраняется при методе[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's 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];
}
}