您的位置:首页 > 产品设计 > UI/UE

iOS-CGRect、CGSize、CGPoint__UIEdgeInsets 介绍

2016-01-22 11:03 1446 查看
一.CGRect
每个视图都使用一个边框定义其界限。这个边框指定了视图的轮廓:其位置、宽度和高度。
我们使用Core Graphics结构定义边框矩形。
对于边框,这通常表示由原点(CGPoint,x和y)和大小(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.CGPoint和CGSize

CGPoint通过x和y坐标定义,CGSize包括宽度和高度。
使用CGPointMake(x,y)创建点。CGSize- Make(width,height)创建大小。
虽然这两个结构看上去相同(两个浮点值),但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.CGRect与NSDictionary转换
//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. CGRect与NSValue转换
//在NSArray,NSDictionary容器中只能存储Objetive-C对象,不能直接存储C结构体,所有需要存储矩形时,需要将其转换为NSValue值。
CGRect rect6 =
CGRectMake(0, 0, 100, 200);
NSValue *value = [NSValue
valueWithCGRect:rect6];
NSLog(@"%@",value);
/*
空矩形 CGRectNull:取两个不相交矩形的相交区域会返回CGRectNull,一个矩形与CGRectNull的并集为原矩形。使用CGRectIsNull判断一个矩形是否为CGRectNull。CGRectIsEmpty对CGRectZero和CGRectNull都返回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内有两个控件titleLabel和imageView,可以用来显示一个文本和图片,这里的图片区别于背景图片。
给UIButton设置了title和image后,它们会图片在左边,文本在图片右边显示。它们两个做为一个整体依赖于button的contentHorizontalAlignment居左居右或居中显示。



//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或者image在button中的位置,UIEdgeInsets是相对于button的frame来计算的(上,左,下,右,)

本文dome:http://download.csdn.net/detail/jackjia2015/9413970
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: