2013-04-10 87 views
6

我在一个项目,使自定义'Move and Scale' ControllerUIImagePickerController。 (控制器出现的时候如果是imagePickerController.allowsEditing=YES如何动态调整scrollViewDidZoom中的contentInset?我最初设置UIImageView的contentInset在UIScrollview

我想在crop an UIImage的作物长方形如下图。

screenshot 1

而且我做了一些代码来设置contentInset

self.selectedImageView.backgroundColor = [UIColor redColor]; 

    CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
    CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
    CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 
    self.contentInset = UIEdgeInsetsMake(difference/2, 0, difference/2 + 20, 0); // 20 is status bar height 

,这里是结果。

screenshot 2

黑色区域是contentInset区域。

但是,如果我捏这个scrollView放大,发生了一些事情。

screenshot 3

我想我必须做一些事情上

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

动态调整contentInset。我怎样才能做到这一点?请给我一些帮助:)

+1

不是一个真正的回答你的问题,但你的做法是从苹果公司的不同,这就是问题所在。当图像完全缩小时,它们不允许向下滚动,当使用捏手势时,不能放大图像的上半部分。您需要将您的方法改为某个苹果使用的方法,并限制缩放区域或使用一些UI元素以编程方式执行缩放,这样您就可以完全控制缩放区域。 – Eugene 2013-04-10 16:29:24

+0

@Eugene感谢您的评论。我认为我的方法与Apple的方法完全相同。我模仿默认的UIImagePickerController。我只想实现默认的UIImagePickerController'移动和缩放'控制器。你能解释为什么这与苹果更复杂吗? – 2013-04-10 17:13:21

回答

3

我希望有人回答这个问题,我很伤心,因为它不是。

但是,感谢上帝,我解决了这个问题。

- (void)scrollViewDidZoom:(UIScrollView *)scrollView 

调整contentInset动态使用zoomScale。我只是实现了Lanscape mode进行测试,但Portrait mode是完全相同的方式。

// adjust contentInset 
CGFloat increasingZoomScale = (scrollView.zoomScale == 1) ? 0 : (-1 * (1 - scrollView.zoomScale)); 

CGRect cropRect = [SKPhotoCropFrameView getCropRectFromOrientation:self.photoCropOrientation]; 
CGRect aspectFitRect = AVMakeRectWithAspectRatioInsideRect(self.selectedImageView.image.size, self.selectedImageView.frame); 
CGFloat difference = fabsf(cropRect.size.height - aspectFitRect.size.height); 

// implement at `Landscape` mode first 
if (self.photoCropOrientation == SKPhotoCropOrientationPortrait) { 

}else{ 
    // get scaledFrameHeight because it's `Landscape` crop mode 
    CGFloat increasingFrameHeight = scrollView.frame.size.height * increasingZoomScale; 
    self.contentInset = UIEdgeInsetsMake(difference/2 - increasingFrameHeight/2, 0, difference/2 - increasingFrameHeight/2, 0); 
} 

而巴姆。这里是截图。

screenshot 4

相关问题