一、结构体不能直接赋值
// 1. 改变头像的frame
// 1.1 获得当前头像的中心点, 并且临时保存起来
CGPoint tempCenter = self.headBtn.center;
// 1.2 修改临时结构体变量的值
tempCenter.y -= 10;
// 1.3 把修改完的结构体变量赋值给头像
self.headBtn.center = tempCenter;
// 1.1 获得当前头像的frame, 并且临时保存起来
CGRect tempFrame = self.headBtn.bounds;
// 1.2 修改临时结构体变量的值
tempFrame.size.width += 10;
tempFrame.size.height += 10;
// 1.3 把修改完的结构体变量赋值给头像
self.headBtn.bounds = tempFrame;
NSLog(@"%@", NSStringFromCGSize(self.headBtn.bounds.size));
⭐️frame:位置/尺寸
⭐️bounds:尺寸 CGRect
⭐️center:位置 CGPoint
⭐️transform:位置/大小/旋转
二、控件的transform属性
>>1. 平移
// 修改head的形变属性,在head "初始位置" 的基础上,y方向-100
head.transform = CGAffineTransformMakeTranslation(0, -100);
// 修改head的形变属性,在head "当前位置" 的基础上,y方向-100
head.transform = CGAffineTransformTranslate(head.transform, 0, -100);
>>2. 旋转
// 修改head的形变属性,在head "初始角度" 的基础上,逆时针旋转45°
head.transform = CGAffineTransformMakeRotation(-M_PI_4);
// 修改head的形变属性,在head "当前角度" 的基础上,逆时针旋转45°
head.transform = CGAffineTransformRotate(head.transform, M_PI_4);
>>3. 缩放
// 修改head的形变属性,在head "初始大小" 的基础上,x/y方向都拉伸1.5倍
head.transform = CGAffineTransformMakeScale(1.5, 1.5);
// 修改head的形变属性,在head "当前大小" 的基础上,x/y方向都拉伸1.5倍
head.transform = CGAffineTransformScale(head.transform, 1.5, 1.5);
三、instancetype和id的区别
/**
instancetype与id的区别
1. instancetype可以动态监测当前对象的真实类型, id只有在程序运行的时候才会知道当前对象的真实类型
2. instancetype只能作为返回值, 不能声明变量的.
*/
四、纯代码封装view的细节
1> 建议在:
- (id)initWithFrame:(CGRect)frame
方法里面初始化所有的子控件,并且添加到父控件上。但是不要在这里设置frame
2> 在 - (void)layoutSubviews方法里面设置子控件的frame
使用这个方法的时候注意:一定要调用
[super layoutSubviews];
3> 包含进来一个数据模型,重写模型的setter方法,给子控件设置数据