我在iOS 9+应用中旋转带有子视图的图像时遇到问题。我有一个包含2个子视图的容器视图。子视图的大小与容器视图的大小相同。第一个子视图包含PDF页面中的图像。第二个子视图包含UIImageViews作为位于PDF图像顶部的子视图。我使用PDF的坐标系正确放置和调整图像视图的大小。 (也许我应该提一下,容器视图本身就是UIScrollview的子视图。)
无论PDF是纵向还是横向,图像视图均已正确放置和定向。但是,当PDF为横向时,我想旋转并缩放最终图像,以使其正常显示。我可以这样做的一种方法是分别旋转,变换和缩放PDF和每个图像视图,并将绘图代码放入每个视图的drawRect方法中。可以,但是真的很慢。
我从一篇SO帖子中学到,如果我将旋转应用于容器视图的CALayer,则iOS会将更改应用于整个视图层次结构。旋转风景图像时,运行速度更快。但是我无法使用容器视图的图层缩放最终图像。在iPad上,我最终得到了正确旋转的最终图像,该图像水平居中位于屏幕顶部,但在左侧和右侧都有剪切。图像的长轴仍等于屏幕的高度,大于屏幕的宽度。
容器视图中的代码非常简短:
- (void) setOrientation:(NSInteger)orientation
{
_orientation = orientation;
if (orientation == foPDFLandscape)
{
// [[self layer] setNeedsDisplayOnBoundsChange:YES];// no effect
// [[self layer] setBounds:CGRectMake(0.0, 0.0, 100.0, 100.0)];//does not change image size or scale
// [[self layer] setContentsScale:0.5];//does not change image size or scale
[[self layer] setAnchorPoint:CGPointMake(0.0, 0.9)];
CATransform3D transform = CATransform3DMakeRotation(90.0 * (M_PI / 180.0), 0.0, 0.0, 1.0);
[[self layer] setTransform:transform];
//putting the scaling code here instead of before the transform makes no difference
}
}
在变换之前或之后以及以各种组合设置边界,框架或contentsScale不会影响最终图像。更改Content Gravity值和autoResizeMask也不会。
有没有办法做到这一点?
谢谢
答案 0 :(得分:0)
我需要像这样连接转换:
- (void) setOrientation:(NSInteger)orientation
{
_orientation = orientation;
if (orientation == foPDFLandscape)
{
[[self layer] setAnchorPoint:CGPointMake(0.0, 1.0)];
CATransform3D rotate = CATransform3DMakeRotation(90.0 * (M_PI / 180.0), 0.0, 0.0, 1.0);
CATransform3D scale = CATransform3DMakeScale(0.77, 0.77, 1.0);
CATransform3D concat = CATransform3DConcat(rotate, scale);
[[self layer] setTransform:concat];
}
}
但这是部分解决方案。最终图像被裁剪为屏幕大小-在iPad上可以,但在iPhone上不能。而且,图像不再响应缩放手势。