1. frame属性
先看一下frame类型的数据结构
@property(nonatomic) CGRect frame;
struct CGRect {
CGPoint origin;
CGSize size;
};
struct CGPoint {
CGFloat x;
CGFloat y;
};
struct CGSize {
CGFloat width;
CGFloat height;
};
创建代码按钮,下面是一个创建一个frame类型的数据结构,其frame属性的起始点以及width和height。
UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(80,80,120,100)];
可以看出frame在确定(80,80)为button的起始点,然后width=120,height=100,这样就可以在view上确定这个button的位置以及大小。
如果你想要改变这个button在view中的位置或大小。那么可以修改其起始点、width和height。
如下图,将上图蓝色的button修改其frame属性来移动到起始点(80,240)的位置,并修改其width=140,height=90。
//定义一个iconBtn对象
@propertyUIButton *iconBtn;
//在oc中,不能直接修改frame数据结构的成员,需要重新定义一个frame来中转一下
/* 这种方式是错误的
* self.iconBtn.frame.origin.y +=160;
*/
/*下面这种方式是正确的*/
CGRect frame=self.iconBtn.frame;
frame.origin.y +=160;
self.iconBtn.frame = frame;
同样的方法修改frame的width和height值
CGRect frame = self.iconBtn.frame;
frame.size.height -= 10;
frame.size.width += 20;
self.iconBtn.frame = frame;
这种方式虽然可以修改button这个控件的位置以及大小,
但是oc中并不建议去修改已经创建的控件的frame属性。
2,bounds && center
一般而言,对于已经创建好的控件
通过bounds属性改变其长和宽,通过center属性来改变起位置。而frame通常是实例化一个控件时使用的。
中心点是(140,130),移动到下面图所示的点(140,250)
改变中心点的位置,通过button按钮的center属性
CGPoint center = self.iconBtn.center;
center.y +=120;
self.iconBtn.center = center;
NSLog(@"变化后%@",NSStringFromCGPoint(self.iconBtn.center));
改变长和宽,通过button按钮的bounds属性
CGRect bounds = self.iconBtn.bounds;
bounds.size.width +=20;
self.iconBtn.bounds = bounds;
3. transform属性
@property(nonatomic)CGAffineTransform transform;
struct CGAffineTransform {
CGFloat a, b, c, d;
CGFloat tx, ty;
};
其中a,d表示放大缩小有关
b,c和选择角度有关
tx,ty是和平移有关
通过下面这个function可以打印出当前button的transform的相关属性
NSLog(@"%@",NSStringFromCGAffineTransform(self.iconBtn.transform));
transform可以用作控件的角度旋转、比例缩放以及上下左右平移的操作。
CGAffineTransform CGAffineTransformMakeTranslation(CGFloat tx,CGFloat ty);
-->描述了在初始化控件的基础上进行的平移,tx表示x轴上的平移,ty表示y轴上的平移。
CGAffineTransform transform = CGAffineTransformMakeTranslation(0, 10);//当前控件沿着y轴向上平移10个单位
self.iconBtn.transform = transform;
NSLog(@"%@",NSStringFromCGAffineTransform(transform));
CGAffineTransform CGAffineTransformTranslate(CGAffineTransform t,CGFloat tx,CGFloat ty);
-->描述了在当前控件的基础上进行的平移,可以将参照物传进来作为参数 CGAffineTransform t下面这行代码就是以当前控件作为参照物,再向下平移10个单位
self.iconBtn.transform = CGAffineTransformTranslate(self.iconBtn.transform, 0, -10);
CGAffineTransform CGAffineTransformScale(CGAffineTransform t,CGFloat sx,CGFloat sy)
-->描述了对当前的控件进行比例缩放的功能下面这行代码描述了对当前控件的x轴和y轴都分别放大1.2倍
self.iconBtn.transform = CGAffineTransformScale(self.iconBtn.transform, 1.2, 1.2);
CGAffineTransform CGAffineTransformRotate(CGAffineTransform t,CGFloat angle)
-->描述了对当前控件进行角度旋转的一个操作,可以顺时针旋转,也可以逆时针旋转,取决于CGFloat angle这个参数
旋转以弧度来表示,M_PI->180度 M_PI_2->90度。
注意,负号表示逆时针旋转,正号表示顺时针旋转
下图描述了顺时针旋转90度
self.iconBtn.transform = CGAffineTransformRotate(self.iconBtn.transform,M_PI_2)
#define M_E 2.71828182845904523536028747135266250 /* e */
#define M_LOG2E 1.44269504088896340735992468100189214 /* log2(e) */
#define M_LOG10E 0.434294481903251827651128918916605082 /* log10(e) */
#define M_LN2 0.693147180559945309417232121458176568 /* loge(2) */
#define M_LN10 2.30258509299404568401799145468436421 /* loge(10) */
#define M_PI 3.14159265358979323846264338327950288 /* pi */
#define M_PI_2 1.57079632679489661923132169163975144 /* pi/2 */
#define M_PI_4 0.785398163397448309615660845819875721 /* pi/4 */
#define M_1_PI 0.318309886183790671537767526745028724 /* 1/pi */
#define M_2_PI 0.636619772367581343075535053490057448 /* 2/pi */
#define M_2_SQRTPI 1.12837916709551257389615890312154517 /* 2/sqrt(pi) */
#define M_SQRT2 1.41421356237309504880168872420969808 /* sqrt(2) */
#define M_SQRT1_2 0.707106781186547524400844362104849039 /* 1/sqrt(2) */