使用变换旋转,然后更改框架原点,视图会扩展吗?

6
这是一个相当棘手的iPhone问题。我正在开发一个库,但已将问题缩小到非常简单的代码。这段代码创建一个50x50的视图,应用几度旋转变换,然后多次向下移动框架。结果是50x50的视图看起来更大了。
以下是代码:
// a simple 50x50 view
UIView *redThing = [[UIView alloc] initWithFrame:CGRectMake(50, 50, 50, 50)];
redThing.backgroundColor = [UIColor redColor];

[self.view addSubview:redThing];

// rotate a small amount (as long as it's not 90 or 180, etc.)
redThing.transform = CGAffineTransformRotate(redThing.transform, 0.1234);

// move the view down 2 pixels
CGRect newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height);
redThing.frame = newFrame;

// move the view down another 2 pixels
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height);
redThing.frame = newFrame;

// move the view down another 2 pixels
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height);
redThing.frame = newFrame;

// move the view down another 2 pixels
newFrame = CGRectMake(redThing.frame.origin.x, redThing.frame.origin.y + 2, redThing.frame.size.width, redThing.frame.size.height);
redThing.frame = newFrame;

那么,到底发生了什么事情呢?如果我通过应用平移变换来移动视图,它可以正常工作。但这不是我想要做的,而且这个问题应该能够解决。

有任何想法吗?


也许变换是在移位之后应用的吗? - Artelius
1个回答

15

从UIView文档中:

如果设置了transform属性,请改用bounds和center属性;否则,动画更改frame属性无法正确反映视图的实际位置。

警告:如果transform属性不是identity transform,则该属性的值未定义,因此应将其忽略。

换句话说,在设置transform时,要谨慎使用frame属性。


@ZaBlanc,如果这是正确的答案,您应该将其标记为正确答案。 - Samuel Neff
刚刚学会了五分钟前的勾选标记。现在正在为我所有的旧帖子补救。;-) - ZaBlanc
谢谢您!您有没有可能添加一些解释,说明为什么会这样呢? :) - pixelfreak
1
想象一下,您已将视图旋转了45度。现在很容易看出,框架属性必须是未定义的,因为旋转矩形的框架无法在其父视图的坐标系中表示。 - Ole Begemann

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