iOS --使用优雅的锚点

做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

它的取值为0~1.png

红色图层的anchorPoint为(0,0).png

红色图层的anchorPoint为(0.5,0.5).png

红色图层的anchorPoint为(1,1).png

position和anchorPoint

添加一个红色图层到绿色图层上,红色图层显示到什么位置,由position属性决定;假设红色图层的position是(100,100),到底把红色图层的哪个点移动到(100,100)的坐标位置,锚点。

红色图层的锚点是(0,0).png

红色图层的锚点是(0.5,0.5).png

红色图层的锚点是(1,1).png

红色图层的锚点是(0.5,0).png

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];

}

显示效果.png

4.例子说明

比如要创建以下两个视图,蓝色视图左上角在坐标(5,4)处,而橙色视图右边和蓝色视图对齐,有一半的高度处于蓝色视图外面。

例子.png

按照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】.

好好理解上句话,锚点的坐标范围如下:

锚点的坐标范围.png

下面看一下代码中把父视图的点作为自身锚点的方法。

- (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的大小和位置的方法。

随手点个喜欢吧~

关注我

QQ--iOS 交流群:107548668

作者:小兵快跑

链接:http://www.jianshu.com/p/94ba4de209ed

來源:简书

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

推荐阅读更多精彩内容