2012-03-21 24 views
2

所以,我似乎提出了很多问题,但在这里我再次去。Retina显示器上的核心图形与3D变换

我有什么似乎是一个奇怪的问题。在我的一些观点中,我通过将它们在x轴上旋转90度,隐藏顶部的工具栏。然后,我允许它们被用户“拉下”,将视图旋转到0度,从而显示工具栏。除了在一个视图中我有两个工具栏可以拉下来以外,这一切都很好。这是通过向下旋转第一个工具栏然后第二个,第一个工具栏向下移动第二个工具栏的高度。所有这些在非视网膜显示器上都能正常工作。但是,在视网膜显示器上,第一个工具栏的位移只有它的一半。此外,视图的框架正是它应该是。换句话说,当我检查(NSLog)时,我得到一帧{0, 30, 320, 30},但实际图像显示在帧:{0, 15, 320, 30}。只是背景发生了变化。如果我点击视图的空间,触摸事件就会通过。

这是什么在视网膜屏幕:

enter image description here

这是在非Retina屏幕会发生什么(完全相同的代码):

enter image description here

这是我的代码用于旋转视图(非常简单):

- (void) rotateView:(UIView *)view downBy:(CGFloat)rad{ 
    CALayer *rLayer = view.layer; 
    CGFloat zDist = self.view.window.bounds.size.height * 1.5f; 
    CATransform3D rT = CATransform3DIdentity; 
    rT.m34 = 1.0f/-zDist; 
    rT = CATransform3DRotate(rT, rad, 1.0f, 0.0f, 0.0f); 
    rLayer.transform = rT; 
} 

同样,这只发生在视网膜显示器上。

现在,工具栏正在Core Graphics中呈现。所以我通过从drawRect中完全删除我的CG代码作为问题的根源,因此根本没有绘制代码​​的代码;问题仍然存在。我还注意到,如果我不使用drawRect(注释掉整个方法),旋转会正确发生,但所有子视图(也使用核心图形)都会以1/2分辨率呈现,以便看起来很模糊:

enter image description here

我认为它与转换有关,但我不知道如何或为什么。如果在旋转设置回0弧度(因此它完全处于视图中)之后将层转换设置为标识,视图将捕捉到其正确的位置。我还注意到,在0弧度时,转换不完全是身份:m34(透视图)仍然设置。将其设回零可解决问题。但是,在视图处于0弧度以外的任何其他旋转中时,将其设置为零并不能解决问题。并且从原点{0,0}不旋转的视图仍然被移位。看起来问题出现在ANY 3D变换期间,尽管我已经检查了所有变换以确认。

UPDATE

由于@Joshua温伯格的答案,我开始与层的rasterizationScale乱搞。我发现底层图像的偏移量被1/rasterizationScale关闭。因此,如果我将rasterizationScale设置为6并将视图向下移动30,则背景图像只能向下移动30/6(5.0f)。

UPDATE 2

我尝试了劈由此我翻译的图像向下。它的工作原理是图像向下移动适量,但也会使图像消失。所以这段代码在我的旋转法:

rT = CATransform3DTranslate(rT, view.frame.origin.x - (view.frame.origin.x/rLayer.rasterizationScale), view.frame.origin.y - (view.frame.origin.y/rLayer.rasterizationScale), 0); 

此息率: enter image description here

回答

1

我想通了。我一直在努力的视图控制器是在我构建为自定义分割视图控制器的自定义容器控制器中。当在视图窗格之间切换时,该控制器也利用3D变换。在转换结束时,我仅仅离开了.m34(透视变换)。显然这是我遇到的所有问题。我确保在容器控制器中切换视图时将层的变换设置为标识,现在一切正常。

所以我想这个故事的寓意是,在变换任何子图层之前,总是要确保你的超级图层在标识转换之前,否则你可能会产生意想不到的结果。

0

设置图层的rasterizationScale[[UIScreen mainScreen] scale],它应该工作。当应用3D变换时,图层会被栅格化,默认栅格化为1.0f;

+0

不,没有效果,在Retina屏幕上,r​​asterizationScale默认设置为2。但这看起来似乎是问题的一部分。如果我强制将rasterizationScale设置为1.0f,那么drawRect/Core Graphics就可以正常工作,除非它很模糊。如果我不使用drawRect(只是一个常规视图),那么rasterizationScale默认设置为1。如果我手动将其设置为2,则会出现上述问题。 – 2012-03-21 19:05:06