3

在为应用了旋转变换的 UIView 执行以下代码时,我遇到了一个奇怪的问题。我要做的是从超级视图中删除视图,然后将其插入特定视图下并恢复其框架:

  UIView* movedView=  [self.views objectAtIndex:newIndex];
    center = movedView.center;

   CGRect oldFrame  = movedView.frame;

    //find the layer on top and insert the moved view under that
    UIView* coveringView = [self.views objectAtIndex:newIndex-1];
    [movedView removeFromSuperview];
    [self.view insertSubview:movedView belowSubview:coveringView];
    movedView.frame = oldFrame;

我希望在操作后视图会出现在同一个地方,但它会根据通过 CGAffineTransformMakeRotation() 应用的旋转量来移动。

通过将分配框架的调用替换为分配中心属性的调用,我得到了所需的行为。这让我开始思考——我如何理解 UIView 的框架在旋转时发生了什么?有没有好的教程或可以帮助我从概念上理解变换如何影响 UIView 框架的东西?

4

3 回答 3

4

-[UIView frame]文档是这样说的

警告:如果该transform属性不是恒等变换,则该属性的值未定义,因此应被忽略。

和这个:

对此属性的更改可以设置动画。但是,如果该transform属性包含非恒等变换,则该frame属性的值未定义且不应修改。在这种情况下,您可以使用该属性重新定位视图并使用该center属性调整大小bounds

因此,您可能希望完全避免考虑该frame属性,因为您transform不是身份。

于 2013-04-19T19:38:40.247 回答
4

在 a 之后,不再定义aCGAffineTransform的属性。文档说“警告:如果转换属性不是身份转换,则此属性的值未定义,因此应被忽略。”frameUIView

于 2013-04-19T19:40:17.780 回答
0

在我看来,frame是由center, thetransform和 the计算的bounds

就像公式:frame = f(center,transform,bounds). 但是不知道内部情况f(x)

于 2013-04-20T10:49:15.130 回答