0%

对比 CGRectInset 与 CGRectOffset

CGRectInsetCGRectOffset 都是通过参数改变CGRect并返回一个CGRect类型的数据。总结出两者的区别在于:CGRectInset会进行平移和缩放两个操作。CGRectOffset做的只是平移。

先把苹果的官方文档做简要解释:

CGRect CGRectInset(CGRect rect, CGFloat dx, CGFloat dy):

通过第二个参数 dx 和第三个参数 dy 重置第一个参数 rect 作为结果返回。重置的方式为,首先将 rect 的坐标(origin)按照(dx,dy) 进行平移,然后将 rect 的大小(size) 宽度缩小2倍的 dx,高度缩小2倍的 dy。

CGRect CGRectOffset(CGRect rect, CGFloat dx, CGFloat dy):

rect 按照(dx,dy)进行平移。

两者的具体效果如何呢?下面通过代码和程序运行结果做形象解释。

1
2
3
4
5
6
7
8
9
10
11
12
- (void)testCGRectInset
{
UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
[view1 setBackgroundColor:[UIColor yellowColor]];//view1 设置为黄色
[self.view addSubview:view1];

//根据view1的大小变换后创建view2;
CGRect view2Rect=CGRectInset(view1.frame, 20, 20);
UIView *view2=[[UIView alloc]initWithFrame:view2Rect];
[view2 setBackgroundColor:[UIColor redColor]];//view2 设置为红色
[self.view addSubview:view2];
}

如下图左边第一个所示,红色视图首先按照我们给的参数做了平移 然后对大小做了缩放。这里我给的参数是正数,如果换成负数,则向反方向平移并做放大,如下图第二张所示,视图层级关系如图第三张。

同样的思路,对于 CGRectOffset ,有:

1
2
3
4
5
6
7
8
9
10
11
12
-(void)testCGRectOffset
{
UIView *view1=[[UIView alloc]initWithFrame:CGRectMake(100, 100, 200, 200)];
[view1 setBackgroundColor:[UIColor yellowColor]];//view1 设置为黄色
[self.view addSubview:view1];

//根据view1的大小变换后创建view2;
CGRect view2Rect=CGRectOffset(view1.frame, 20, 20);
UIView *view2=[[UIView alloc]initWithFrame:view2Rect];
[view2 setBackgroundColor:[UIColor redColor]];//view2 设置为红色
[self.view addSubview:view2];
}

运行结果如下所示(包括参数是正数和负数两种情况):

由上图可以形象地看出,该方法只是做了平移操作,没有缩放。

叶世昌 wechat
欢迎您扫一扫上面的微信公众号,订阅我的博客!
坚持原创技术分享,您的支持将鼓励我继续创作!