iOS中frame、bound、center以及transform属性

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)      */














  

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值