所以,我似乎提出了很多问题,但在这里我再次去。Retina显示器上的核心图形与3D变换
我有什么似乎是一个奇怪的问题。在我的一些观点中,我通过将它们在x轴上旋转90度,隐藏顶部的工具栏。然后,我允许它们被用户“拉下”,将视图旋转到0度,从而显示工具栏。除了在一个视图中我有两个工具栏可以拉下来以外,这一切都很好。这是通过向下旋转第一个工具栏然后第二个,第一个工具栏向下移动第二个工具栏的高度。所有这些在非视网膜显示器上都能正常工作。但是,在视网膜显示器上,第一个工具栏的位移只有它的一半。此外,视图的框架正是它应该是。换句话说,当我检查(NSLog)时,我得到一帧{0, 30, 320, 30}
,但实际图像显示在帧:{0, 15, 320, 30}
。只是背景发生了变化。如果我点击视图的空间,触摸事件就会通过。
这是什么在视网膜屏幕:
这是在非Retina屏幕会发生什么(完全相同的代码):
这是我的代码用于旋转视图(非常简单):
- (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分辨率呈现,以便看起来很模糊:
我认为它与转换有关,但我不知道如何或为什么。如果在旋转设置回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);
此息率:
不,没有效果,在Retina屏幕上,rasterizationScale默认设置为2。但这看起来似乎是问题的一部分。如果我强制将rasterizationScale设置为1.0f,那么drawRect/Core Graphics就可以正常工作,除非它很模糊。如果我不使用drawRect(只是一个常规视图),那么rasterizationScale默认设置为1。如果我手动将其设置为2,则会出现上述问题。 – 2012-03-21 19:05:06