0

我一直在尝试下面的代码,将两个 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];

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

将两个视图与锚点相交

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

在此处输入图像描述

4

3 回答 3

2

在此处anchorPoint查看有关坐标系和坐标系的原始文档

图 2 三个 anchorPoint 值:三个锚点值

更新#1:

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

于 2012-07-18T15:18:54.877 回答
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"];
于 2012-07-18T15:43:31.633 回答
1

你的意思是,你想让红色视图成为绿色视图和原始红色视图之间重叠区域的大小?

如果是这样,

v.frame = CGRectIntersection(v.frame, v2.frame);
于 2012-07-18T14:45:48.533 回答