做ios开发时,有很多东西都用不惯,比如没有单独设置view的位置和大小的方法,而要把位置和大小一起初始化,感觉有点麻烦。
在cocos2d里就非常方便,因为cocos2d的锚点可以很方便地设置子视图的位置,而ios里没有锚点这个概念。
所以把cocos2d的锚点移植到了ios里,并做了一些修改,使其成为了有着ios特色的锚点。
1.简单介绍
CALayer有2个非常重要的属性:position和anchorPoint
@property CGPoint position;
用来设置CALayer在父层中的位置
以父层的左上角为原点(0, 0)
@property CGPoint anchorPoint;
称为“定位点”、“锚点”
决定着CALayer身上的哪个点会在position属性所指的位置
以自己的左上角为原点(0, 0)
它的x、y取值范围都是0~1,默认值为(0.5, 0.5)
2.图示 anchorPoint
position和anchorPoint
添加一个红色图层到绿色图层上,红色图层显示到什么位置,由position属性决定;假设红色图层的position是(100,100),到底把红色图层的哪个点移动到(100,100)的坐标位置,锚点。
3.代码示例
- (void)test3
{
UIView *aView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
/** 默认锚点就是CGPointMake(0.5, 0.5)*/
// aView.layer.anchorPoint = CGPointMake(0.5, 0.5)
aView.backgroundColor = [UIColor cyanColor];
[self.view addSubview:aView];
UIView *bView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
bView.layer.anchorPoint = CGPointMake(0, 0);
bView.backgroundColor = [UIColor redColor];
[self.view addSubview:bView];
UIView *cView = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 150, 100)];
cView.layer.anchorPoint = CGPointMake(1, 1);
cView.backgroundColor = [UIColor greenColor];
[self.view addSubview:cView];
}
4.例子说明
比如要创建以下两个视图,蓝色视图左上角在坐标(5,4)处,而橙色视图右边和蓝色视图对齐,有一半的高度处于蓝色视图外面。
按照ios标准的创建视图的写法可以这样写代码:
UIView * blueView = [[ UIView alloc ] initWithFrame : CGRectMake ( 5 , 4 , W , H )];
blueView . backgroundColor = [ UIColor blueColor ];
[ self . view addSubview : blueView ];
UIView * orangeView = [[ UIView alloc ] initWithFrame : CGRectMake ( W - w , H - h / 2 , w , h )];
orangeView . backgroundColor = [ UIColor orangeColor ];
[ blueView addSubview : orangeView ];
可以看到创建视图时就要计算视图左上角的坐标,非常麻烦。而使用了锚点的代码可以这样写:
UIView * blueView = [[ UIView alloc ] initWithSize : CGSizeMake ( W , H )];
[ blueView setPosition : CGPointMake ( 5 , 4 ) atAnchorPoint : CGPointMake ( 0 , 0 )];
blueView . backgroundColor = [ UIColor blueColor ];
[ self . view addSubview : blueView ];
UIView * orangeView = [[ UIView alloc ] initWithSize : CGSizeMake ( w , h )];
[ orangeView setPosition : CGPointMake ( W , H ) atAnchorPoint : CGPointMake ( 1 , 0.5 )];
orangeView . backgroundColor = [ UIColor orangeColor ];
[ blueView addSubview : orangeView ];
可见,使用锚点省去了苦逼的计算过程。当然了,锚点也是针对子视图去设计的,锚点掌握好了,我们就不用再去计算x,y坐标了。
就拿上面这个例子分析一下吧:
把俯视图蓝色view的左边点(W,H)作为自身的锚点(1,0.5)【注意:锚点是在自身上找,这个点一一映射的有一个父view的坐标,可以通过这两个值来计算子视图的view.frame.origin】.
好好理解上句话,锚点的坐标范围如下:
下面看一下代码中把父视图的点作为自身锚点的方法。
- (void)setPosition:(CGPoint)point atAnchorPoint:(CGPoint)anchorPoint
{
CGFloat x = point.x - anchorPoint.x * self.width;
CGFloat y = point.y - anchorPoint.y * self.height;
[self setOrigin:CGPointMake(x, y)];
}
代码
通过category为UIView添加设置锚点的方法,所有view的子类就可以使用该方法。
下载UIView+Frame文件,添加到工程里即可,这个类里面自定义了一些获取和设置view的大小和位置的方法。