『IOS』使用优雅的锚点开发ios
2014-09-09 13:14
295 查看
原文地址:http://www.poboke.com/study/use-the-anchor-point-in-ios-development.html
做ios开发时,有很多东西都用不惯,比如没有单独设置view的位置和大小的方法,而要把位置和大小一起初始化,感觉有点麻烦。
在cocos2d里就非常方便,因为cocos2d的锚点可以很方便地设置子视图的位置,而ios里没有锚点这个概念。
所以我把cocos2d的锚点移植到了ios里,并做了一些修改,使其成为了有着ios特色的锚点。
cocos2d里采用OpenGL ES坐标系,坐标原点在屏幕左下角。而ios采用的是Quartz 2D坐标系,坐标原点在屏幕左上角。
在cocos2d和ios中分别把视图的坐标点设为(10,10),结果如下:
http://www.poboke.com/wp-content/uploads/2014/07/anchor_coordinate.png
因为cocos2d的视图是以视图的中心位置设置坐标点的,而ios的视图是以左上角设置坐标点的。
那么什么是锚点呢?下面以一个例子来说明:
比如要创建以下两个视图,蓝色视图左上角在坐标(5,4)处,而橙色视图右边和蓝色视图对齐,有一半的高度处于蓝色视图外面。
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];
按照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];
可见代码十分优雅,一开始先初始化视图大小,然后再设置视图的位置。
橙色视图的坐标点是(W, H),锚点是(1, 0.5),通过这两个点就可以设置视图的准确位置了,根本就不用去计算橙色视图的左上角的坐标(W – w, H – h/2)。
可以这样说:锚点是子视图用来设置位置的一个定位点,使用锚点就不会用子视图的宽高参与计算,省去了麻烦的计算,从而让代码更优雅。
从下图可知,锚点的取值范围是[0, 1]。
设置一个子视图的坐标时,锚点(0, 0)表示把子视图的左上角放到该坐标的位置,锚点(0.5, 0.5)表示把子视图的中点放到该坐标的位置。
通过category为UIView添加设置锚点的方法,所有view的子类就可以使用该方法。
代码见https://github.com/poboke/OCElegant
下载UIView+Frame文件,添加到工程里即可,这个类里面自定义了一些获取和设置view的大小和位置的方法,比如设置锚点的方法:
- (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)];
}
代码里通过self.width就能取到view的宽度了,而不用写self.frame.size.width。
通过代码也可以清楚地知道:实现锚点的方法其实很简单,就是在setPosition:atAnchorPoint:方法里面利用锚点和子视图的宽高进行计算,从而调整了子视图的位置。
做ios开发时,有很多东西都用不惯,比如没有单独设置view的位置和大小的方法,而要把位置和大小一起初始化,感觉有点麻烦。
在cocos2d里就非常方便,因为cocos2d的锚点可以很方便地设置子视图的位置,而ios里没有锚点这个概念。
所以我把cocos2d的锚点移植到了ios里,并做了一些修改,使其成为了有着ios特色的锚点。
cocos2d里采用OpenGL ES坐标系,坐标原点在屏幕左下角。而ios采用的是Quartz 2D坐标系,坐标原点在屏幕左上角。
在cocos2d和ios中分别把视图的坐标点设为(10,10),结果如下:
http://www.poboke.com/wp-content/uploads/2014/07/anchor_coordinate.png
因为cocos2d的视图是以视图的中心位置设置坐标点的,而ios的视图是以左上角设置坐标点的。
那么什么是锚点呢?下面以一个例子来说明:
比如要创建以下两个视图,蓝色视图左上角在坐标(5,4)处,而橙色视图右边和蓝色视图对齐,有一半的高度处于蓝色视图外面。
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];
按照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];
可见代码十分优雅,一开始先初始化视图大小,然后再设置视图的位置。
橙色视图的坐标点是(W, H),锚点是(1, 0.5),通过这两个点就可以设置视图的准确位置了,根本就不用去计算橙色视图的左上角的坐标(W – w, H – h/2)。
可以这样说:锚点是子视图用来设置位置的一个定位点,使用锚点就不会用子视图的宽高参与计算,省去了麻烦的计算,从而让代码更优雅。
从下图可知,锚点的取值范围是[0, 1]。
设置一个子视图的坐标时,锚点(0, 0)表示把子视图的左上角放到该坐标的位置,锚点(0.5, 0.5)表示把子视图的中点放到该坐标的位置。
通过category为UIView添加设置锚点的方法,所有view的子类就可以使用该方法。
代码见https://github.com/poboke/OCElegant
下载UIView+Frame文件,添加到工程里即可,这个类里面自定义了一些获取和设置view的大小和位置的方法,比如设置锚点的方法:
- (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)];
}
代码里通过self.width就能取到view的宽度了,而不用写self.frame.size.width。
通过代码也可以清楚地知道:实现锚点的方法其实很简单,就是在setPosition:atAnchorPoint:方法里面利用锚点和子视图的宽高进行计算,从而调整了子视图的位置。
相关文章推荐
- 使用优雅的锚点开发ios
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- iOS开发~优雅的使用Xcode帮助文档及帮助系统
- 【iOS-Cocos2d游戏开发之十七】灵活使用精灵可视区域(TextureRect)与锚点(anchorPoint),并结合可视区域与锚点制作进度条!
- iOS程序开发之使用PlaceholderImageView实现优雅的图片加载效果
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- Unity3d使用蓝牙(bluetooth)开发IOS点对点网络游戏
- IOS开发里面使用RGB颜色
- 使用MonoTouch进行iOS开发
- Flash开发iOS应用全攻略(三)——如何使用iOS开发者授权以及如何申请证书
- IOS 入门开发之分页栏TableBar的使用(四)
- 【iOS-Cocos2d游戏开发之十二】浅析使用C++/C/OC进行iOS游戏混编出现“failed with exit”问题与小结;
- IOS开发中委托代理(degegate)的理解和使用示例
- IOS 入门开发之分页栏TabBar的使用(四)
- IOS 入门开发之创建标题栏UINavigationBar的使用(二)
- IOS 入门开发之创建标题栏UINavigationBar的使用(二)
- iOS开发学习笔记:使用xcode里的单元测试,放在STAssert…里面的语句无法使用自动完成功能
- IOS开发之──传感器使用
- 在iOS开发中如何高效使用静态库
- 在Visual Studio中使用MonoTouch开发iOS应用程序(下):开发体验