iPhone中UIView旋转后的框架行为异常

18

在viewDidLoad方法中创建一个正方形的UIView对象testView_并添加如下代码:

- (void)viewDidLoad {
[super viewDidLoad];
CGRect initialRect = testView_.frame;
NSLog(@"before rotation: w %f h %f x %f y %f", initialRect.size.width, initialRect.size.height, initialRect.origin.x, initialRect.origin.y);
testView_.transform = CGAffineTransformMakeRotation(0.1);
NSLog(@"after rotation: w %f, h %f, x %f, y %f", testView_.frame.size.width, testView_.frame.size.height, testView_.frame.origin.x, testView_.frame.origin.y);
testView_.frame = initialRect;
NSLog(@"reassign: w %f, h %f, x %f, y %f", testView_.frame.size.width, testView_.frame.size.height, testView_.frame.origin.x, testView_.frame.origin.y);
}

我在控制台中收到了以下内容:

2011-04-27 12:30:32.492 Test[31890:207] before rotation: w 100.000000 h 100.000000 x 20.000000 y 20.000000
2011-04-27 12:30:32.494 Test[31890:207] after rotation: w 109.483757, h 109.483757, x 15.258121, y 15.258121
2011-04-27 12:30:32.495 Test[31890:207] reassign: w 117.873589, h 100.000000, x 11.063205, y 20.000000

我搞不清楚这个更改帧值的逻辑,尤其是最后一个。有谁能启发一下我吗?谢谢。


2
我对这个答案不是完全确定,所以我将其作为评论发布。当我们旋转一个视图B,它是A的子视图时,只有B的变换会改变。Frame是根据其在parentView中的位置来考虑的,即B在A中的位置。因此,当我们旋转B时,B在A中占用的总平方空间(在A的变换中计算)增加了。这就是第二个日志的原因。现在第三个日志你强制给B原始框架,但旋转后的B现在比原始大小更大,这迫使parentView A通过仅保持一个方向(y和高度/ x和宽度)恒定来自动调整B。 - Krishnabhadra
1
不错的问题..我也想知道.. - Krishnabhadra
你没有得到答案...太糟糕了.. - Krishnabhadra
1个回答

36
在UIView类参考文档中,您可以在这里看到,如果使用不同于CGAffineTransformIdentity的变换属性,则不应该设置视图的frame。
如果您想要改变变换视图的位置,应该使用center属性。如果想要调整大小,则应使用bounds属性。

5
如果有用的话,我通过首先设置view.transform = CGAffineTransformIdentity,然后设置框架,最后使用view.transform = CGAffineTransformMakeRotation(angle);来进行旋转来解决了这个问题。 - Liron
@Liron,这似乎不再起作用了。该框架存在问题。 - cvb
你想做什么?这篇文章很旧了,所以我不确定我是否真正记得这是关于什么的。在大多数情况下,现在使用自动布局比手动分配框架更容易 - 但当然这取决于应用程序。 - Liron
@Liron 我正在处理一些旧代码,其中自动布局没有任何意义。无论如何,在代码中,顺序是正确的并且曾经有效,但现在不再有效了。框架会随机更改。 - cvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接