这就是代码:
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
UIView* view=[[UIView alloc] init];
CGRect frame=CGRectMake(10, 10, 100, 100);
view.frame=frame;
[self.view addSubview:view];
CGAffineTransform t1 = CGAffineTransformMakeTranslation(0, 100);
CGAffineTransform t2 = CGAffineTransformMakeScale(.8, .8);
CGAffineTransform t3 = CGAffineTransformConcat(t1, t2);
view.transform=t3;
CGRect rect = CGRectApplyAffineTransform(frame, t3);
NSLog(@"transform rect:%@", NSStringFromCGRect(rect));
NSLog(@"transform view rect:%@", NSStringFromCGRect(view.frame));
}
//output:
transform rect:{{8, 88}, {80, 80}}
transform view rect:{{20, 100}, {80, 80}}
同一个矩形应用相同的变换,但得到一个不同的矩形,这是为什么?
答案 0 :(得分:0)
UIView的文档说明了这个框架属性
警告:如果
transform
属性不是标识转换, 此属性的值未定义,因此应该是 忽略。
答案 1 :(得分:0)
对CGRect
或UIView
对象应用仿射变换之间存在差异:
让我们从CGRectApplyAffineTransform
开始,然后查看Apple docs中的说明:
因为仿射变换一般不保留矩形,所以 function CGRectApplyAffineTransform返回最小的矩形 包含rect参数的变换角点。如果 仿射变换t仅由缩放和平移组成 操作,然后返回的矩形与矩形重合 从四个转变的角落构建。
在这种情况下,youth函数应用每个点的变换,并返回包含所有这些点的CGRect
对象。
t(10,10) ->(8,88)
t(10,110)->(8, 168)
t(110,10)->(88, 88)
t(110,110)->(88, 168)
包含所有这些转换点的矩形正确{{8, 88}, {80, 80}}
现在让我们来看看transform
documentation中UIView
属性的说明:
变换的原点是中心属性的值,如果更改了图层的anchorPoint属性。 (使用layer属性获取基础Core Animation层对象。)默认值为CGAffineTransformIdentity。
由于您没有更改图层的锚点,因此将从视图的中心应用变换。
原来的中心是(60,60)
。变换后的中心为(60,140)
,因为缩放问题不会影响原点(即中心)。
您现在有一个(80,80)
矩形居中于(60,140)
点:您可以
找到你的{{20, 100}, {80, 80}}
矩形。