IOS 以随意点为圆心 旋转UIView
环绕底边中点旋转
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;
IOS 以随意点为圆心 旋转UIView的更多相关文章
- iOS系列 基础篇 05 视图鼻祖 - UIView
iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...
- iOS如何随意的穿插跳跃,push来pop去
iOS如何随意的穿插跳跃,push来pop去? 主题思想:如A.B.C.D 四个视图控制器. 想要在 A push B 后, B 在push 到 D ,然后从 D pop 到 C ,在从 C pop ...
- iOS Programming Recipe 6: Creating a custom UIView using a Nib
iOS Programming Recipe 6: Creating a custom UIView using a Nib JANUARY 7, 2013 BY MIKETT 12 COMMENTS ...
- poj 1106(半圆围绕圆心旋转能够覆盖平面内最多的点)
Transmitters Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4955 Accepted: 2624 Desc ...
- iOS 设置随意屏幕旋转
方法一,通过控制器继承或分类实现: 在UITabBarController 的子类或分类中实现 - (BOOL)shouldAutorotate { return [self.selectedView ...
- ios新手开发——toast提示和旋转图片加载框
不知不觉自学ios已经四个月了,从OC语法到app开发,过程虽然枯燥无味,但是结果还是挺有成就感的,在此分享我的ios开发之路中的小小心得~废话不多说,先上我们今天要实现的效果图: 有过一点做APP经 ...
- ios View之间的切换 屏幕旋转
6.3 View之间的切换 在上面的练习中我们通过移动组件的位置和调整组件的大小来处理横向与纵向的界面布局.但是在界面中有很多组件的时候,对每个组件都进行这样的操作确实是一个麻烦的事情.下面我们看看 ...
- iOS围绕某点缩放或旋转的AnchorPoint的设定
经常会遇到需求,要求手势的缩放或者旋转操作,要求动作变化围绕某一个特定点,或者是两指的中心点,或者是某一个点. 这个问题首先要清晰的知道,iOS各个view的层次关系.特别是,要清除的知道,当前vie ...
- iOS阶段学习第28天笔记(UIView的介绍)
iOS学习(UI)知识点整理 一.关于UIVIew 的介绍 1)概念:UIView 是用于装载并展示各类控件的大容器,是iOS中所有UI控件的基类 2)UIView 初始化实例代码 UIView * ...
随机推荐
- 提高FPGA速度的quartus编译选项
Turning on some optimizations in Quartus II may help increase it. Here are some you may want to try: ...
- thinkphp5项目--个人博客(八)
thinkphp5项目--个人博客(八) 项目地址 fry404006308/personalBlog: personalBloghttps://github.com/fry404006308/per ...
- 【转】webshell检测——使用auditd进行system调用审计
本文档将介绍:如何通过Linux审计系统auditd监测WebShell执行系统命令的行为. 测试环境:CentOS7.0_x64 auditd简介 Linux审计系统提供了一种跟踪系统上与安全相关的 ...
- 模拟select样式,自定义下拉列表为树结构
效果图如下: 首先,需要用到的库jQuery,zTree(官网API:http://www.treejs.cn/v3/api.php) 注意:因为zTree是基于jQuery的,所以应该先引入jQue ...
- Bootstrap-FileInput组件的简单Demo
官网: https://github.com/kartik-v/bootstrap-fileinput/ http://plugins.krajee.com/file-input HTML页面: ...
- T_SQL 字符串函数
字符串函数用于处理列中的数据值,通常属于字符型的数据类型. 1.ASCLL(character),将具体字符转换为相应的整数(ASCII)代码,结果为正数. 例:select ASCII('A'), ...
- 5、Go if else 条件判断
package main import "fmt" func main(){ //注:在Go里面没有三元表达式”?:”,所以你只能使用条件判断语句. //示例一 if 7%2==0 ...
- WinDBG help
WinDBG is a great, free tool. It is more powerful than Visual Studio's built-in debugger, but is har ...
- vue中的分页操作
首先,先看分页的代码: 这里还需要进行操作: 1.分页操作主要传递俩个数据,total和pagenum,一个显示当前页面共有多少条数据,一个是翻页后的操作,看列表的数据能不能跟着改变,在进页面发送请求 ...
- linu基础入门(一)
原创作品,允许转载,转载时请务必声明作者信息和本声明. https://www.cnblogs.com/zhu520/p/10730550.html 本人小白,有错指出.谢谢! 一:根据上一步安装与新 ...