ios – 在滚动视图内缩放旋转图像以适合(填充)叠加矩形的帧

ios – 在滚动视图内缩放旋转图像以适合(填充)叠加矩形的帧,第1张

概述通过 this question and answer,我现在有了一种工作方法,可以检测任意旋转图像何时不完全在裁剪矩形之外. 下一步是弄清楚如何正确调整它包含滚动视图缩放,以确保裁剪矩形内没有空格.为了澄清,我想放大(放大)图像;作物直肠应保持未转化. 布局层次结构如下所示: containing UIScrollView UIImageView (this gets arbitrar 通过 this question and answer,我现在有了一种工作方法,可以检测任意旋转的图像何时不完全在裁剪矩形之外.

下一步是弄清楚如何正确调整它包含滚动视图缩放,以确保裁剪矩形内没有空格.为了澄清,我想放大(放大)图像;作物直肠应保持未转化.

布局层次结构如下所示:

containing UIScrollVIEw    UIImageVIEw (this gets arbitrarily rotated)        crop rect overlay vIEw

… UIImageVIEw也可以在scrollVIEw中进行缩放和平移.

有4个手势事件需要考虑:

>平移手势(完成):通过检测它是否被错误地平移并重置contentOffset来完成.
>旋转CGAffinetransform
>滚动视图缩放
>调整裁剪矩形覆盖框架

据我所知,我应该能够使用相同的逻辑2,3和4来调整滚动视图的zoomScale,以使图像正确匹配.

如何正确计算使旋转的图像完全适合裁剪矩形所需的缩放比例?

为了更好地说明我想要完成的任务,这里是一个不正确大小的示例:

我需要计算必要的缩放比例,使它看起来像这样:

这是我到目前为止使用的oluseyi解决方案的代码.当旋转角度很小(例如小于1弧度)时,它可以工作,但除此之外的任何东西都会变得非常糟糕.

CGRect visibleRect = [_scrollVIEw convertRect:_scrollVIEw.bounds toVIEw:_imageVIEw];CGRect cropRect = _cropRectVIEw.frame;CGfloat rotationAngle = fabs(self.rotationAngle);CGfloat a = visibleRect.size.height * sinf(rotationAngle);CGfloat b = visibleRect.size.wIDth * cosf(rotationAngle);CGfloat c = visibleRect.size.height * cosf(rotationAngle);CGfloat d = visibleRect.size.wIDth * sinf(rotationAngle);CGfloat zoomDiff = MAX(cropRect.size.wIDth / (a + b),cropRect.size.height / (c + d));CGfloat newZoomScale = (zoomDiff > 1) ? zoomDiff : 1.0 / zoomDiff;[UIVIEw animateWithDuration:0.2                      delay:0.05                    options:NO                 animations:^{                         [self centerToCropRect:[self convertRect:cropRect toVIEw:self.zoomingVIEw]];                         _scrollVIEw.zoomScale = _scrollVIEw.zoomScale * newZoomScale;                 } completion:^(BOol finished) {                     if (![self rotatedVIEw:_imageVIEw containsVIEwCompletely:_cropRectVIEw])                      {                         // damn,it's still broken - this happens a lot                     }                     else                     {                         // Woo! Fixed                     }                     _dIDDetectBadRotation = NO;                 }];

注意我正在使用autoLayout,这使得框架和边界变得愚蠢.

解决方法 假设您的图像矩形(图中的蓝色)和裁剪矩形(红色)具有相同的纵横比和中心.旋转时,图像矩形现在有一个边界矩形(绿色),这是您希望裁剪缩放到的(有效地,通过缩小图像).

要有效扩展,您需要知道新边界矩形的尺寸,并使用适合裁剪矩形的比例因子.边界矩形的尺寸相当明显

(a + b) x (c + d)

请注意,每个段a,b,c,d是由边界矩形和旋转图像rect形成的直角三角形的相邻或相对侧.

a = image_rect_height * sin(rotation_angle)b = image_rect_wIDth * cos(rotation_angle)c = image_rect_wIDth * sin(rotation_angle)d = image_rect_height * cos(rotation_angle)

您的比例因子很简单

MAX(crop_rect_wIDth / (a + b),crop_rect_height / (c + d))

这是一个参考图:

总结

以上是内存溢出为你收集整理的ios – 在滚动视图内缩放旋转图像以适合(填充)叠加矩形的帧全部内容,希望文章能够帮你解决ios – 在滚动视图内缩放旋转图像以适合(填充)叠加矩形的帧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1107521.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存