美文网首页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 --使用优雅的锚点

    做ios开发时,有很多东西都用不惯,比如没有单独设置view的位置和大小的方法,而要把位置和大小一起初始化,感觉有...

  • iOS --使用优雅的锚点

    做ios开发时,有很多东西都用不惯,比如没有单独设置view的位置和大小的方法,而要把位置和大小一起初始化,感觉有...

  • google 云锚工具介绍

    使用云锚点创建 Android 和 iOS 用户可以共享的多人或协作型 AR 体验。 云锚点工作原理 借助云锚点,...

  • iOS-系统原生的地图和定位简单使用

    iOS工程中简单使用原生的地图框架目录:一、使用MKMap控件二、根据地址定位三、在地图上添加锚点四、导航 iOS...

  • 锚点的使用

  • CALayer常用属性整理(二)

    接着捋~ 锚点(anchorPoint) 锚点也需要使用单位坐标,默认是(0.5,0.5),也就是中心点。当把锚点...

  • 前端实现滚动到顶部的三种方式

    css, html, dom 创建测试页面 锚点方式 使用页面的锚点链接进行滚动: 直接滚动 使用 window ...

  • iOS UIKit动力学(四)吸附(UIAttachmentBe

    iOS UIKit力学(一)基本介绍(目录) 导语 吸附主要发生在:元素与锚点、元素与元素之间。当元素与锚点连接,...

  • ios地图锚点

    1.话不多说,效果 2.注意点 3.代码展示 4.上面代码详细讲述的锚点的设置等,不懂可以问我。欠妥之处还请指教。

  • iOS--锚点

    https://www.poboke.com/use-the-anchor-point-in-ios-develo...

网友评论

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

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