iOS-CGRect、CGSize、CGPoint__UIEdgeInsets 介绍

来源:互联网 发布:mysql 连接远程数据库 编辑:程序博客网 时间:2024/04/30 07:42

一.CGRect

     每个视图都使用一个边框定义其界限。这个边框指定了视图的轮廓:其位置、宽度和高度。

     我们使用Core Graphics结构定义边框矩形。

     对于边框,这通常表示由原点(CGPointxy)和大小(CGsize,宽度和高度)组成的CGRect矩形。


CGRect结构在屏幕上定义了一个矩形。它包含原点(rect.origin)和大小(rect.size)

     1>.CGPoint     struct CGPoint {     CGFloat x;     CGFloat y;     };     typedef struct CGPoint CGPoint;          2>.CGSize     struct CGSize {     CGFloat width;     CGFloat height;     };     typedef struct CGSize CGSize;          3>.CGRect     struct CGRect {     CGPoint origin;//偏移是相对父窗口的     CGSize size;     };     typedef struct CGRect CGRect;

这三个结构体均在一个头文件里:CGGeometry.h

    

1.CGRectMake方法

    /*     CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height)     {     CGRect rect;     rect.origin.x = x; rect.origin.y = y;     rect.size.width = width; rect.size.height = height;     return rect;     }     */    //定义一个矩形大小    CGRect rect = CGRectMake(10, 100, 100, 100);    _lbl1.frame = rect;        //把CGRect结构转变为格式化字符串。    NSLog(@"格式化字符串%@",NSStringFromCGRect(rect));        //由字符串表示恢复出矩形    NSString *str = @"{{150, 100}, {100, 100}}";    CGRect rect1 = CGRectFromString(str);    _lbl2.frame = rect1;        //CGRectZero是一个高度和宽度为零、位于(0,0)的矩形常量。    //需要创建边框但还不确定边框大小或位置时,可以使用此常量。    _lbl4.frame = CGRectZero;        //CGSizeZero 0大小   CGPointZero  0位置

2.CGPointCGSize

     

     CGPoint通过xy坐标定义,CGSize包括宽度和高度。

     使用CGPointMake(xy)创建点。CGSize- Make(widthheight)创建大小。

     虽然这两个结构看上去相同(两个浮点值),但iPhoneSDK对二者有所区别。点表示位置值,大小表示程度值。不能将Frame.origin设置为大小。

     

     与矩形相同,可以将它们与字符串进行相互转换,可用如下函数:

     NSStringFromCGPoint()

     NSStringPromCGgize()

     CGSizeFromString()

     CGPointFromString()

    //CGPoint    CGPoint point = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2);    _lbl2.center = point;        //CGSize    CGSize size = CGSizeMake(10, 10);            /*     当希望移动视图或重新调整视图大小时,可以更新其边框的原点、中心点或大小。不需要担心显示或隐藏的矩形部分。iPhone将负责完成重新绘图。这允许将视图作为切实的对象对待,并将呈现问题委托给CocoaTouch          标准CoreGraphics调用会实时转换视图。举例来说,可以应用剪辑、旋转或其他平面几何效果。CocoaTouch支持一整套仿射转换(转换、旋转、缩放和倾斜等)。     任何UIView子类的drawRect:方法都提供通过低级Core Graphics调用进行绘图的入口点。     */

3.判断两个点,大小,矩形是否相等

     bool CGPointEqualToPoint (CGPoint point1, CGPoint point2);

     bool CGSizeEqualToSize (CGSize size1, CGSize size2);

     bool CGRectEqualToRect (CGRect rect1, CGRect rect2);

     

     注:CGPoint,CGSize,CGRect的内部数据都是CGPoint,对于浮点数,由于可能存在舍入误差,不能直接判断两者是否相等,而应该判断两个值的差是否足够小。使用上述方法可以避免手工做这些判断,简化代码。


4. 获取矩形边界,中点坐标值,长宽

     

     获取边界坐标值,即x,y的最大值与最小值。

     CGFloat CGRectGetMinX(CGRect rect);

     CGFloat CGRectGetMaxX(CGRect rect);

     CGFloat CGRectGetMinY(CGRect rect);

     CGFloat CGRectGetMaxY(CGRect rect);

     

     获取中点坐标值,x,y的中点

     CGFloat CGRectGetMidX(CGRect rect);

     CGFloat CGRectGetMidY(CGRect rect);

     

     获取矩形长,宽

     CGFloat CGRectGetWidth(CGRect rect);

     CGFloat CGRectGetHeight(CGRect rect);



5.对称缩进CGRect

    //CGRectlnset(Rect,float,float)用来创建较小或较大的矩形(中心点相同)。    //使用正的内嵌值表示较小的矩形,使用负的内嵌值表示较大的矩形。    _lbl3.frame =  CGRectInset(rect, 10, 10);

6. 非对称缩进CGRect

    CGRect rect2 = CGRectMake(0, 0, 100, 200);    UIEdgeInsets contentInsets2 = UIEdgeInsetsMake(10, 20, 30, 40);//top, left, bottom,right    CGRect result2 = UIEdgeInsetsInsetRect(rect2, contentInsets2);    _lbl4.frame = result2;    //result origin(20,10) and size(40,160)

7. 调整小数像素CGRect到整数像素

    //将origin值向下调整到最近整数,size向上调整到最近整数,使生成的CGRect可以完全包含原来的CGRect.    CGRect rect3 = CGRectMake(5, 7.5, 50, 29);    CGRect result3 = CGRectIntegral(rect3);    //result origin(5,7) and size(50,30)


8. 检查矩形内是否包含某点

    CGRect enemyRect = CGRectMake(0, 0, 100, 200);    CGPoint hitPoint = CGPointMake(50, 50);    if(CGRectContainsPoint(enemyRect, hitPoint))    {        // YES!    }


9.检查两矩形是否相交

    CGRect playerRect = CGRectMake(200, 300, 10, 10);    CGRect mineRect = CGRectMake(10, 10, 20, 20);    if(CGRectIntersectsRect(playerRect, mineRect))    {        // OUCH!    }

10.CGRectNSDictionary转换

    //CGRect转换NSDictionary    CGRect rect4 = CGRectMake(0, 0, 100, 200);    CFDictionaryRef frameDictRef = CGRectCreateDictionaryRepresentation(rect4);    NSDictionary *dic = [NSDictionary dictionaryWithDictionary:(__bridge NSDictionary * _Nonnull)(frameDictRef)];    NSLog(@"%@", dic);        //NSDictionary转换 CGRect    CGRect Rect5;    NSDictionary *dic5 = [NSDictionary dictionaryWithObjectsAndKeys:@0,@"X",@0,@"Y",@100,@"Width",@200,@"Height",nil];    CGRectMakeWithDictionaryRepresentation((CFDictionaryRef)dic5, &Rect5);    _lbl2.frame  = Rect5;


11. CGRectNSValue转换

    //NSArray,NSDictionary容器中只能存储Objetive-C对象,不能直接存储C结构体,所有需要存储矩形时,需要将其转换为NSValue值。

    CGRect rect6 =CGRectMake(0, 0, 100, 200);

    NSValue *value = [NSValuevalueWithCGRect:rect6];

    NSLog(@"%@",value);

    /*

     空矩形 CGRectNull:取两个不相交矩形的相交区域会返回CGRectNull,一个矩形与CGRectNull的并集为原矩形。使用CGRectIsNull判断一个矩形是否为CGRectNullCGRectIsEmptyCGRectZeroCGRectNull都返回true;

     无限矩形 CGRectInfinite具有无限区域的矩形,可使用CGRectIsInfinite进行判断。

     */




二.UIEdgeInset

     UIEdgeInsets UIEdgeInsetsMake (

     CGFloat top,

     CGFloat left,

     CGFloat bottom,

     CGFloat right

     );

     

     UIEdgeInsets,由函数 UIEdgeInsetsMake ( CGFloat top, CGFloat left, CGFloat bottom, CGFloat right );构造出

     分别表示其中的内容/标题/图片离各边的距离。


UIButton内有两个控件titleLabelimageView,可以用来显示一个文本和图片,这里的图片区别于背景图片。

UIButton设置了titleimage后,它们会图片在左边,文本在图片右边显示。它们两个做为一个整体依赖于buttoncontentHorizontalAlignment居左居右或居中显示。


//titleLabel        [_btn setTitle:@"独家" forState:UIControlStateNormal];    _btn.titleLabel.font = [UIFont boldSystemFontOfSize:20];    //只是让标签中的文本左对齐,但并没有改变标签在按钮中的对齐方式。    _btn.titleLabel.textAlignment = NSTextAlignmentLeft;    //把按钮的内容(控件)的对齐方式修改为水平左对齐,但是这们会紧紧靠着左边,不好看,    _btn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;    //但是这们会紧紧靠着左边,不好看,    //_btn.titleEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);        //image    UIImage *image = [UIImage imageNamed:@"purple_button"];    [_btn setImage:image forState:UIControlStateNormal];            //UIEdgeInsets    //若要title在图片的上方,则位置相对于图片来说,向上移动-80        [_btn setImageEdgeInsets:UIEdgeInsetsMake(0, 20, 0, 0)];    [_btn setTitleEdgeInsets:UIEdgeInsetsMake(-80, -50, 0, 0)];

单独设置一个title或者imagebutton中的位置,UIEdgeInsets是相对于buttonframe来计算的(上,左,下,右,)



本文dome:http://download.csdn.net/detail/jackjia2015/9413970



0 0
原创粉丝点击