iOS程序员的业余沙龙iOS进阶指南关于iOS 那点事

iOS --使用优雅的锚点

2016-03-30  本文已影响4028人  小兵快跑

做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

上一篇下一篇

猜你喜欢

热点阅读