我在一个项目中,该项目将自定义'Move and Scale' Controller设置为UIImagePickerController。 (如果出现imagePickerController.allowsEditing=YES,则为 Controller )

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



我做了一些代码来设置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

这就是结果。

黑色区域是contentInset区域。

但是,如果我捏住该scrollView进行放大,则会发生某些情况。

我想我必须做点什么
    - (void)scrollViewDidZoom:(UIScrollView *)scrollView

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

最佳答案

我希望有人回答了这个问题,我很伤心,因为事实并非如此。

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


    - (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);
}

和ba。这是屏幕截图。

关于iphone - 如何在scrollViewDidZoom中动态调整contentInset?我最初在UIScrollview中设置UIImageView的contentInset,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15929468/

10-10 14:21