【发布时间】:2013-12-26 05:32:11
【问题描述】:
我有兴趣为 UIImagePickerController 使用自定义叠加层来控制占据整个屏幕的相机控件,这与默认相机应用在切换到视频功能时所做的非常相似。
我在这里参考了几个关于这个主题的问题,特别是这个one,以及关于如何为 UIImagePickerController 使用自定义叠加层的Apple example,但没有一个能够产生成功, iOS 7 的全屏结果。
到目前为止,这是带有自定义叠加层(没有任何按钮)的相机 UI:
请注意,屏幕底部有一个黑条。我注意到如果我将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];
}
}
【问题讨论】:
-
嘿.. 你能告诉我你是如何实现“拍摄下一张照片”功能的吗?我希望我的相机在点击照片后仍处于拍摄模式。
-
@daspianist 您是否找到了解决方案,因为我也面临类似的问题。底部出现一个黑条
标签: ios iphone ios7 uiimagepickercontroller