IOS 以任意点为圆心 旋转UIView
来源:互联网 发布:家用手动工具套装 知乎 编辑:程序博客网 时间:2024/04/29 18:51
围绕底边中点旋转
UIView本身是支持旋转的,可以用UIView.transform属性实现旋转。
The origin of the transform is the value of the center property, or the layer’s anchorPoint property if it was changed.
这个旋转默认是围绕这UIView.center或者UIView.layer.anchorPoint旋转的。似乎UIView.layer.anchorPoint属性给了我们一个能实现围绕任意点旋转的可能,事实上也确实能够通过UIView.layer.anchorPoint实现围绕任意点旋转。
囿于UIView.layer.anchorPoint属性的复杂性、关联性太强(参考http://www.cnblogs.com/benbenzhu/p/3615516.html),我尝试从其他方向入手。
幸运的是,这问题在数学上早已解决(不应这么说,因果弄反了,数学上解决后,计算机才应用),就是用仿射矩阵变换。
围绕任意点旋转的仿射矩阵如下(摘自百度百科):
目标图形以(x, y)为轴心逆时针旋转theta弧度,变换矩阵为:[ cos(theta) -sin(theta) x-x*cos+y*sin][ sin(theta) cos(theta) y-x*sin-y*cos ][ 0 0 1 ]相当于两次平移变换与一次原点旋转变换的复合:[1 0 x] [cos(theta) -sin(theta) 0] [1 0- x][0 1 y] [sin(theta) cos(theta) 0] [0 1 -y][0 0 1] [ 0 0 1] [0 0 1]这里是以空间任一点为圆心旋转的情况。
可以直接使用上面第一个公式计算放射矩阵;
我根据上面第二个等效公式和ios的API,归纳出下面函数,用于计算仿射矩阵,实现围绕UIView的坐标系的任意点旋转。
CGAffineTransform GetCGAffineTransformRotateAroundPoint(float centerX, float centerY ,float x ,float y ,float angle){ x = x - centerX; //计算(x,y)从(0,0)为原点的坐标系变换到(CenterX ,CenterY)为原点的坐标系下的坐标 y = y - centerY; //(0,0)坐标系的右横轴、下竖轴是正轴,(CenterX,CenterY)坐标系的正轴也一样 CGAffineTransform trans = CGAffineTransformMakeTranslation(x, y); trans = CGAffineTransformRotate(trans,angle); trans = CGAffineTransformTranslate(trans,-x, -y); return trans;}其中(centerX,centerY)是UIView.center属性值.需要注意的是每次设置UIView.transform时,最好先设置为CGAffineTransformIdentity以恢复UIView为初始视图,否则会有意想不到的效果
示意代码
UIView *view = ......float centerX = view.bounds.size.width/2;float centerY = view.bounds.size.height/2;float x = view.bounds.size.width/2;float y = view.bounds.size.height;CGAffineTransform trans = GetCGAffineTransformRotateAroundPoint(centerX,centerY ,x ,y ,45.0/180.0*M_PI);view.transform = CGAffineTransformIdentity;view.transform = trans;
0 0
- IOS 以任意点为圆心 旋转UIView
- android 以本身为圆心的旋转动画
- 一点根据某点为圆心,旋转θ度
- UIView及其子类围绕任意点旋转的方法
- 趣题:以无理点为圆心的圆周上最多有多少个有理点?
- 以锚点为基础进行旋转
- 以试图某个点为起点旋转
- GPS以中心点为圆心,指定距离为半径获取随机坐标点
- 以任意点旋转对象 - iPointRegister类
- ios 以我的位置为圆心 搜索附近的人 有什么解决方案么
- ios UIVIew旋转
- iOS uiview 旋转
- iOS中UIView旋转
- ArcGIS for android以任意点为中心放大缩小
- IOS给任意UIView截屏
- 一个点的经度和纬度,以这个点为圆心,1000米为半径,最大的经度和纬度,最小的经度和纬度
- UIView的旋转iOS开发
- iOS 设置锚点,以锚点为中心缩放
- 十五分钟介绍 Redis数据结构
- 【LeetCode】Swap Nodes in Pairs
- 计算机书单(刘未鹏)
- Windows7上搭建cocos2d-x-3.2 Android开发环境
- 一道只能用乘法不能用除法的数组面试题
- IOS 以任意点为圆心 旋转UIView
- LeetCode 142 Regular Expression Matching
- Codeforces Round #265 (Div. 2) C - No to Palindromes!
- 三大WEB服务器对比分析(apache ,lighttpd,nginx)
- C语言指针转换为intptr_t类型
- Flume(NG)架构设计要点及配置实践
- 设计模式学习(创建型模式)—工厂方法模式(Factory Method)
- C#文件操作
- LeetCode | Remove Duplicates from Sorted Array