两个UIView具有相同的锚点

时间:2012-07-18 14:38:01

标签: iphone ios uiview calayer

我一直在尝试以下代码,将两个UIView与anchorPoint(1,0)相交。

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(50,50, 100, 100)];
v.backgroundColor=[UIColor redColor];
v.layer.anchorPoint=CGPointMake(1,0);

UIView *v2=[[UIView alloc] initWithFrame:CGRectMake(50,50,200,300)];
v2.backgroundColor=[UIColor greenColor];
v2.layer.anchorPoint=CGPointMake(1, 0);

[self.view addSubview:v2];
[self.view addSubview:v];

我对此代码的输出如下所示。

Intersect Two Views with Anchor Point

我看起来像红色视图的输出重叠绿色视图,并且它们都具有相同的锚点,如下所示。

enter image description here

3 个答案:

答案 0 :(得分:2)

请查看有关anchorPoint和坐标系here

的原始文档

图2 三个anchorPoint值:Three anchorPoint values

更新#1:

(此图显示了OSX的坐标系!)

答案 1 :(得分:1)

您的意思是,您希望红色视图是绿色视图和原始红色视图之间重叠区域的大小吗?

如果是的话,

v.frame = CGRectIntersection(v.frame, v2.frame);

答案 2 :(得分:1)

可能有助于描述您的示例中发生的事情:

您在屏幕上放置一个精确尺寸的两个矩形,位于(50, 50)的确切位置(相对于它们左上角的原点) 他们都有锚点,默认情况下都在他们的中心。 想象一下,将针放在这些中心点。 现在你说你实际上想要右上角的引脚不是中心。

将会发生以下两件事之一

1)矩形将保持静止,并且针脚会自动移动到右上角red:(150, 50) green:(250, 50),这不是您想要的。

2)引脚将保持静止,矩形将自行移动,直到它们的右上角位于引脚为red pin:(100, 100) green pin:(150, 200)的位置,这也不是您想要的!

第二种选择是实际发生的事情。

根据文档layer.position相对于layer.anchorPoint,因此您应尝试将anchorPoint设置为右上角,然后设置position矩形图层到您想要的确切位置。例如

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(50,50, 100, 100)];
v.backgroundColor=[UIColor redColor];
v.layer.anchorPoint=CGPointMake(1,0);
v.layer.position = CGPointMake(200, 50);

UIView *v2=[[UIView alloc] initWithFrame:CGRectMake(50,50,200,300)];
v2.backgroundColor=[UIColor greenColor];
v2.layer.anchorPoint=CGPointMake(1, 0);
v2.layer.position = CGPointMake(200, 50);

[self.view addSubview:v2];
[self.view addSubview:v];

只是为了好玩:这是一个动画,展示矩形如何从initWithFrame的初始位置到相对于其中心的锚点的最终位置。

UIView *v=[[UIView alloc] initWithFrame:CGRectMake(50,50, 100, 100)];
v.backgroundColor=[UIColor redColor];

UIView *v2=[[UIView alloc] initWithFrame:CGRectMake(50,50,200,300)];
v2.backgroundColor=[UIColor greenColor];

[self.view addSubview:v2];
[self.view addSubview:v];   

UIView *ap=[[UIView alloc] initWithFrame:CGRectMake(0,0, 10, 10)];
ap.backgroundColor=[UIColor blackColor];
ap.center = v.layer.position;

UIView *ap2=[[UIView alloc] initWithFrame:CGRectMake(0,0, 10, 10)];
ap2.backgroundColor=[UIColor blackColor];
ap2.center = v2.layer.position;

[self.view addSubview:ap]; 
[self.view addSubview:ap2];   

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"anchorPoint"];
animation.duration = 2.0;
animation.toValue = [NSValue valueWithCGPoint:CGPointMake(1,0)];
animation.autoreverses = YES;
animation.repeatCount = 10;
[v.layer addAnimation:animation forKey:@"anchorPoint"];
[v2.layer addAnimation:animation forKey:@"anchorPoint"];