编辑:有人认为这篇文章是一个https://stackoverflow.com/questions/2674375/uiimagepickercontroller-doesnt-fill-screen,但事实并非如此,因为黑条最初没有出现仿射变换,不能解决这个问题。
我在iPad Air 2上运行它,目标是iOS 8。我有一个UIImagePickerController,它的showsCameraControls属性设置为NO。当启动应用程序的景观,然后放大,这是什么情况(所有的图像是非裁剪):

一个黑条出现,并可以通过改变设备的方向为纵向(这也将显示黑条),然后改变它回来。
改为肖像后:

回到景观(+放大):

奇怪的是,在返回景观后,缩放滑块在缩放过程中不再可见。当开始从肖像开始,缩放第一工作,直到一个改变为景观,在那里出现一个黑色的酒吧,这是停留当回到肖像。
当将showsCameraControls设置为YES时,所有这些都不会发生。我怎样才能摆脱这个问题?
UPDATE:苹果声称已经在iOS 9中修复了这个问题。
发布于 2015-05-18 10:28:42
由于缺乏更好的理解,我找到了一种解决问题的方法,那就是给bug贴上标签(就像苹果提供的样本一样)。
我的解决方案是手动缩放,向覆盖视图中添加一个UIPinchGestureRecognizer。控制器随后必须实现缩放回调,这将消除上述现象。
@implementation CameraViewController
{
CGFloat _lastScale; //< the current zoom scale before update
}
- (void)viewDidLoad
{
[super viewDidLoad];
self.imagePicker = [[UIImagePickerController alloc] init];
self.imagePicker.delegate = self;
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
self.imagePicker.allowsEditing = NO;
self.imagePicker.showsCameraControls = NO;
[[NSBundle mainBundle] loadNibNamed:@"CameraOverlay" owner:self options:nil];
UIPinchGestureRecognizer *pinchRec = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(zoom:)];
[self.overlayView addGestureRecognizer:pinchRec];
self.imagePicker.cameraOverlayView = self.overlayView;
_lastScale = 1.;
}
- (void)zoom:(UIPinchGestureRecognizer *) sender
{
// reset scale when pinch has ended so that future scalings are applied cumulatively and the zoom does not jump back (not sure I understand this)
if([sender state] == UIGestureRecognizerStateEnded)
{
_lastScale = 1.0;
return;
}
CGFloat scale = 1.0 - (_lastScale - sender.scale); // sender.scale gives current distance of fingers compared to initial distance. We want a value to scale the current transform with, so diff between previous scale and new scale is what must be used to stretch the current transform
CGAffineTransform currentTransform = self.imagePicker.cameraViewTransform;
CGAffineTransform newTransform = CGAffineTransformScale (currentTransform, scale, scale); // stretch current transform by amount given by sender
newTransform.a = MAX(newTransform.a, 1.); // it should be impossible to make preview smaller than screen (or initial size)
newTransform.d = MAX(newTransform.d, 1.);
self.imagePicker.cameraViewTransform = newTransform;
_lastScale = sender.scale;
}
@endhttps://stackoverflow.com/questions/30288950
复制相似问题