iOS旋转 — 关于Transform的一点小事
2016-06-11 19:12
441 查看
最近在项目开发的时候,用到了transform这个属性,挺简单的一个功能,但却出现了一点困扰。归根到底还是对这个知识的熟悉程度不够。在此记录一下。
基于transform的方法有三个方法
CGAffineTransformMakeTranslation 平移
CGAffineTransformMakeScale 缩放
CGAffineTransformMakeRotation 旋转
当时我用到的方法是CGAffineTransformMakeRotation。重现一下当时的场景。
这是我自定义的一个view
这是使用这个view
运行后是这样的一个效果
但是,我在后面加上
这句代码后,效果变成了这样
很明显,我在旋转了view之后,上面的label的frame也发生了变化,这显然不是我想要的。
推测是transform执行后,label发生了新的布局。后断点调试的时候发现:transform会触发view的layoutSubviews方法。
通过打印view的frame,你会发现执行transform前后是不一样的。所以当父视图旋转之后,frame发生了变化。在layoutSubviews方法里,子视图也是根据父视图布局的,所以也会就会发生刚才的一幕。
因此,我修改了这个label的布局方法
运行看效果:
这才是我们想要的结果。
总结:调用 transform 会触发 layoutSubviews 方法,会对子视图重新布局。如果子视图的frame依赖父视图,那么父视图 frame 的改变 会 让子视图的frame也发生变化。使用bounds 和 center 会除去子视图frame对父视图的依赖,因此解决了旋转后,frame发生变化的问题。
基于transform的方法有三个方法
CGAffineTransformMakeTranslation 平移
CGAffineTransformMakeScale 缩放
CGAffineTransformMakeRotation 旋转
当时我用到的方法是CGAffineTransformMakeRotation。重现一下当时的场景。
这是我自定义的一个view
#import "DemoVeiw.h" @implementation DemoVeiw - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.label = [[UILabel alloc]init]; self.label.backgroundColor = [UIColor redColor]; self.label.text = @"我是一个label"; [self addSubview:self.label]; } return self; } - (void)layoutSubviews{ [super layoutSubviews]; self.label.frame = CGRectMake(20, self.frame.size.height/2 - 30, self.frame.size.width - 40, 60); }
这是使用这个view
DemoVeiw *view = [[DemoVeiw alloc]initWithFrame:CGRectMake(50, 100, ScreenWidth - 100, 200)]; view.backgroundColor = [UIColor cyanColor]; [self.view addSubview:view];
运行后是这样的一个效果
但是,我在后面加上
view.transform = CGAffineTransformMakeRotation(M_PI/8);
这句代码后,效果变成了这样
很明显,我在旋转了view之后,上面的label的frame也发生了变化,这显然不是我想要的。
推测是transform执行后,label发生了新的布局。后断点调试的时候发现:transform会触发view的layoutSubviews方法。
通过打印view的frame,你会发现执行transform前后是不一样的。所以当父视图旋转之后,frame发生了变化。在layoutSubviews方法里,子视图也是根据父视图布局的,所以也会就会发生刚才的一幕。
因此,我修改了这个label的布局方法
#import "DemoVeiw.h" @interface DemoVeiw () @property (nonatomic, assign) CGPoint tempCenter;//保存旋转前的中心点 @end @implementation DemoVeiw - (instancetype)initWithFrame:(CGRect)frame{ self = [super initWithFrame:frame]; if (self) { self.tempCenter = CGPointMake(frame.size.width/2, frame.size.height/2); self.label = [[UILabel alloc]init]; self.label.backgroundColor = [UIColor redColor]; self.label.text = @"我是一个label"; self.label.transform = CGAffineTransformMakeRotation(M_PI/8); [self addSubview:self.label]; } return self; } - (void)layoutSubviews{ [super layoutSubviews]; self.label.bounds = CGRectMake(0, 0, ScreenWidth-100, 60); self.label.center = self.tempCenter; //旋转后,中心的和bounds是不变的 }
运行看效果:
这才是我们想要的结果。
总结:调用 transform 会触发 layoutSubviews 方法,会对子视图重新布局。如果子视图的frame依赖父视图,那么父视图 frame 的改变 会 让子视图的frame也发生变化。使用bounds 和 center 会除去子视图frame对父视图的依赖,因此解决了旋转后,frame发生变化的问题。
相关文章推荐
- C#实现字体旋转的方法
- 基于jQuery实现的旋转彩圈实例
- C++实现一维向量旋转算法
- C#的WebBrowser操作frame实例解析
- 使用JavaScript实现旋转的彩圈特效
- js函数在frame中的相互调用详解
- 对frameset、frame、iframe的js操作示例代码
- jQuery平滑旋转幻灯片特效代码分享
- jquery实现可旋转可拖拽的文字效果代码
- jQuery+CSS3实现3D立方体旋转效果
- C#中图片旋转和翻转(RotateFlipType)用法分析
- 用JS操作FRAME中的IFRAME及其内容的实现代码
- css transform 3D幻灯片特效实现步骤解读
- Android Tween动画之RotateAnimation实现图片不停旋转效果实例介绍
- Swift中实现点击、双击、捏、旋转、拖动、划动、长按手势的类和方法介绍
- 防止登录页面出现在frame中js代码
- 如何用js控制frame的隐藏或显示的解决办法
- Javascript实现可旋转的圆圈实例代码
- 详解iframe与frame的区别
- JavaScript实现防止网页被嵌入Frame框架的代码分享