ios 结构体及坐标系统

这篇博客深入探讨了iOS中结构体 CGRect 的使用,包括相关工具函数的介绍,CGPoint和CGSize的理解,以及iOS特有的坐标系统概念的详细解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

与CGRect有关的工具函数

CGRectMake()函数可以根据四个参数来新建矩形,这四个参数分别是原点的横坐标、纵坐标、矩形的宽度和高度,它是创建框架时所需的关键函数。除了CGRectMake()之外,还有一些比较方便的函数,也就是用来操作CGRect及frame:
1、NSStringFromCGRect(rect)可以把CGRect结构转换为具有固定格式的字符串。在调试的时候,开发者可以通过这个函数把视图的框架打印到控制台。
2、CGRectFromString(string)函数可以根据字符串中的信息重建矩形。如果把视图的框架以字符串的形式放在NSUserDefaults里面,那么该方法可以将其转换回CGRect。
3、虽说[NSValue valueWithCGRect:rect]不算函数,但它可以根据传进来的矩形创建新的oc对象,并把矩形的信息存储到那个NSValue里面。然后,开发者可以根据需要,把对象添加到字典或数组中。CGRectValue方法可以从NSValue对象里面取出CGRect结构体。对于CoreGraphics中大多数类型来说,也都有相似的函数和方法,例如CGPoint、CGSize及CGAffimeTransform等。
4、CGRectInset(rect,xinset,yinset)函数可以创建出与源矩形中心点相同但尺寸较小或较大的矩形来。如果inset是正值,那么新矩形就比原来小,若为负值,则比原来大,在宽和高上的变化分别是2*xinset和2*yinset。
5、CGRectOffset(rect,xoffset,yoffset)可以创建出与源矩形大小相同但位置不同的矩形,xoffset及yoffset分别表示横向和纵向偏移量。。该函数很适合在移动框架时候使用,也可以用来创建简单的阴影效果。
6、CGRectGetMidX(rect)及CGRectGetMidY(rect)函数分别获取矩形中心点的横坐标和纵坐标。这两个函数很适合用来查询bounds及frame的中心点。
7、CGRectIntersectsRect(rect1,rect2)可以判断出两个CGRect结构体是否相交。此函数可用于检测两个长方形对象有没有重叠。调用CGRectIntersection(rect1,rect2),即可得知发生重叠的具体部位。若没有重叠,则返回空矩形。还有一个相关的函数叫做CGRectContaimsPoint(rect,point),如果给定的点位于矩形之内,那函数就会返回true。
8、CGRectEqualToRect(rect1,rect2)用来比较两个矩形是否相同。该函数会判断两个矩形的尺寸和位置是否完全一样,相似的函数还有CGSizeEqualToSize(size1,size2)及CGPointEqualToPoint(point1,point2).
9、还有几个便捷的工具函数:CGRectDivide()能够把源矩形分成两部分,CGRectApplyAffimeTransform(rect,transform)则可以对矩形执行仿射变换,并把能够包含变换结果的最小矩形返回给调用者。

CGPoint与CGSize

由于CGRect、CGPoint及CGSize都是结构体,所以可以使用很多种灵活的写法来初始化它们:
CGPoint origin = {0,0};
    CGSize size = {100,200};
    CGRect rect1 = CGRectMake(0, 0, 100, 200);
    CGRect rect2 = {{0,0},{100,200}};
    CGRect rect3 = {origin,size};
    CGRect rect4 = {origin,{100,200}};
    CGRect rect5 = {.size.width = 100,.size.height = 200,.origin = {0,0}};
与CGRect一样,可以与字符串进行转换。NSStringFromCGPoint()、NSStringFromCGSize()、CGPointFromString()和CGSizeFromString()函数可以执行相关的操作,另外,也可以把CGPoint及CGSize转换成字典,反之亦然。

坐标系统

convertPoint:fromView:方法可把某点在另一坐标系中的坐标转换成它在坐标系里的坐标,例如:
point = [view convertPoint:somePoint fromView:otherView];
假如这个点表示某对象的位置,那么转换之后的点坐标依然能够表示位置,只不过这次是在view的角度来描述位置的,与这个方法相反,convertPoint:toView:方法则能够用另一个视图的坐标系来描述本坐标中的点。convertRect:toView:及convertRect:fromView:方法功能与上述两个方法相似,他们适用于CGRect结构体,而非CGPoint结构体。
iOS设备的坐标系统与显示该系统的像素系统未必相符,比方说,iPhone4s采用640*960像素的Retina显示屏,其像素是离散的,而SDK却使用320*480的连续坐标系统来表示那些像素,此系统的计量单位是点。对于配有Retina显示屏的设备来说,尽管开发者可以用高质量的图片来填充那些像素,但代码中以点为单位所指定的坐标其坐标系依然参照的是像素密度较低的设备。无论显示屏的像素密度如何,对于显示屏为3.5英寸的iPhone及iPod touch来说,屏幕中心点坐标大概都是(160,240).而在配有4英寸Retina显示屏的iPhone及iPod touch上面,中心点的坐标则是(160,284)。
UIScreen类提供了名为scale的属性,用来表示显示屏的像素密度与点坐标系统之间的关系。通过该属性,我们可以把视图中逻辑坐标系统里的点转换成设备的物理像素坐标,在配有Retina显示屏的设备中,scale值是2,在非Retina显示屏上是1.

取自iOS核心开发手册
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值