美文网首页iOS开发
iOS --使用优雅的锚点

iOS --使用优雅的锚点

作者: 时间不会倒着走 | 来源:发表于2017-12-11 19:20 被阅读44次

    做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

    來源:简书

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

    相关文章

      网友评论

        本文标题:iOS --使用优雅的锚点

        本文链接:https://www.haomeiwen.com/subject/scrwixtx.html