6

我正在进行一个自定义'Move and Scale' Controller. UIImagePickerController(控制器何时出现 if imagePickerController.allowsEditing=YES

我想crop an UIImage在裁剪矩形中,如下图所示。

截图 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

这是结果。

截图 2

黑色区域是 contentInset 区域。

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

截图 3

我想我必须做点什么

    - (void)scrollViewDidZoom:(UIScrollView *)scrollView

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

4

1 回答 1

3

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

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

    - (void)scrollViewDidZoom:(UIScrollView *)scrollView

使用 zoomScale 动态调整 contentInset。我只是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);
}

和砰。这是屏幕截图。

截图 4

于 2013-04-11T06:26:34.073 回答