如何在 scrollViewDidZoom 中动态调整 contentInset?我最初在 UIScrollview 中设置 UIImageView 的 contentInset

Posted

技术标签:

【中文标题】如何在 scrollViewDidZoom 中动态调整 contentInset?我最初在 UIScrollview 中设置 UIImageView 的 contentInset【英文标题】:How can I dynamically adjust contentInset in scrollViewDidZoom? I initially set contentInset of UIImageView in UIScrollview 【发布时间】:2013-04-10 14:59:30 【问题描述】:

我正在进行一个自定义 'Move and Scale' ControllerUIImagePickerController 的项目。 (imagePickerController.allowsEditing=YES时出现的控制器)

我想在裁剪矩形中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。我怎样才能做到这一点?请给我一些帮助:)

【问题讨论】:

不是您问题的真正答案,但您的方法与苹果的不同,这就是问题所在。当图像完全缩小时,它们不允许向下滚动,使用捏合手势时不能只放大图像的上部。您要么需要将方法更改为 Apple 使用的方法并限制缩放区域,要么使用一些 UI 元素以编程方式执行缩放,这样您就可以完全控制正在缩放的​​区域。 @Eugene 谢谢你的评论。我认为我的方法与 Apple 的方法完全相同。我模仿默认的 UIImagePickerController。我只想实现默认的 UIImagePickerController 'Move and Scale' 控制器。您能解释一下为什么这与 Apple 的复杂程度不同吗? 【参考方案1】:

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

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

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

然后砰。这是屏幕截图。

【讨论】:

以上是关于如何在 scrollViewDidZoom 中动态调整 contentInset?我最初在 UIScrollview 中设置 UIImageView 的 contentInset的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIScrollView 中找到 UIImageView 的缩放因子

如何缩放填充屏幕的 UIImageView

当用户放大 UIScrollView 时如何隐藏某些内容,然后在缩小时显示它?

在 UIScrollView 上禁用手动缩放

缩放时调整 UIScrollView 的内容大小

如何使用javascript在动态表中添加动态下拉选择