对比 CGRectInset 与 CGRectOffset
程序员文章站
2022-03-20 10:08:42
...
CGRectInset 与 CGRectOffset 都是通过参数改变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)进行平移。
两者的具体效果如何呢?下面通过代码和程序运行结果做形象解释。
-(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 ,有:
-(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];
}
运行结果如下所示(包括参数是正数和负数两种情况):
由上图可以形象地看出,该方法只是做了平移操作,没有缩放。