iOS,setTransform被setFrame覆盖?重新运行setFrame后转换不重新绘制

时间:2013-01-06 08:27:57

标签: ios uiview screen-orientation cgaffinetransform

使用setFrame重绘帧后,我的变换不会绘制。

当使用setFrame更改方向时,我正在缩放视图。但是这个视图还需要根据BOOL参数改变位置: On = up in view,off = down off screen 。我使用setTransform来调整视图的位置。

首先,我通过setFrame绘制视图。这会在底部的屏幕上绘制100点视图。然后我设置一个变换(在ty上为-100)将它带到视点中(只要BOOL设置为TRUE,否则变换为0并且视图在屏幕外)。

[view setFrame:CGRectMake(0, self.view.bounds.size.height, self.view.bounds.size.width, 100)];
[view setTransform:CGAffineTransformMake(1, 0, 0, 1, 0, -100)]

这正常,正如预期的那样,但是当更改方向,并且重新运行此代码(重新调整视图大小)时,变换不会绘制,即使它被记录为视图的变换。换句话说,视图就在屏幕外,就像transform.ty是0一样。

Log message before re-draw: view.transform.ty -10.000000
Log message after re-draw: view.transform.ty -10.000000

任何帮助?

1 个答案:

答案 0 :(得分:9)

视图的frame是来自三个基本值派生的值:boundscentertransformframe的setter尝试通过反转过程来做正确的事情,但是当设置了非身份transform时,它无法始终正常工作。

documentation在这一点上非常明确:

  

如果transform属性不是identity变换,则值为   此属性未定义,因此应忽略。

     

...

     

如果transform属性包含非标识变换,则为该值   框架属性未定义,不应修改。在那里面   例如,您可以使用center属性重新定位视图并进行调整   使用bounds属性的大小。

由于您的transform仅翻译了视图,因此我认为没有任何理由可以使用它。只需更改视图框架的原点:

[view setFrame:CGRectMake(0, self.view.bounds.size.height - 100, self.view.bounds.size.width, 100)];