CGRectApplyAffineTransform和实际视图的框架

时间:2016-02-18 07:38:26

标签: ios core-graphics core-animation

这就是代码:

-(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}}

同一个矩形应用相同的变换,但得到一个不同的矩形,这是为什么?

2 个答案:

答案 0 :(得分:0)

UIView的文档说明了这个框架属性

  

警告:如果transform属性不是标识转换,   此属性的值未定义,因此应该是   忽略。

答案 1 :(得分:0)

CGRectUIView对象应用仿射变换之间存在差异:

让我们从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 documentationUIView属性的说明:

  

变换的原点是中心属性的值,如果更改了图层的anchorPoint属性。 (使用layer属性获取基础Core Animation层对象。)默认值为CGAffineTransformIdentity。

由于您没有更改图层的锚点,因此将从视图的中心应用变换。

原来的中心是(60,60)。变换后的中心为(60,140),因为缩放问题不会影响原点(即中心)。 您现在有一个(80,80)矩形居中于(60,140)点:您可以 找到你的{{20, 100}, {80, 80}}矩形。