CodeV

2.5-矩形实用方法

您使用CGRectMake()函数来构建frames,bounds和其他的矩形参数。它接受四个浮点参数:xywidthheight。这是在Quartz绘图中使用的最重要的函数之一。

有时候你会想要从你通常使用的东西来构造一个矩形:points和size。虽然您可以使用组件字段来检索参数,但是您可能会发现,对这些结构特定的有一个更简单的函数。清单2-3从point和size结构体构建一个矩形。

清单 2-3 从Points和Sizes建立矩形

1
2
3
4
CGRect RectMakeRect(CGPoint origin, CGSize size)
{
return (CGRect){.origin = origin, .size = size};
}

令人惊讶的是,Quartz不提供一个内置的例程来检索矩形的中心。虽然你可以很容易地通过使用Core Graphics函数得出x和y中点,但是实现一个直接从rect返回一个点的函数相比较来说更加方便。清单2-4定义了该函数。这是一个我自己在绘图工作中广泛使用的函数。

清单 2-4 检索矩形中心

1
2
3
4
CGPoint RectGetCenter(CGRect rect)
{
return CGPointMake(CGRectGetMidX(rect),CGRectGetMidY(rect));
}

围绕一个中心建立一个矩形是另一个常见的任务。例如,您可能希望将文本居中或在点周围放置图形。 清单2-5实现了这个功能。提供一个中心点和一个大小。它返回一个您希望得到的矩形。

清单 2-5 围绕目标点创建矩形

1
2
3
4
5
6
CGRect RectAroundCenter(CGPoint center, CGSize size)
{
CGFloat halfWidth = size.width / 2.0f;
CGFloat halfHeight = size.height / 2.0f;
return CGRectMake(center.x - halfWidth,center.y - halfHeight, size.width, size.height);
}

清单2-6使用清单2-4和2-5中的函数来绘制一个以给定矩形为中心的字符串。它计算出字符串的大小(使用iOS 7 API)和矩形的中心,并围绕该中心构建目标。结果如图2-4所示。

清单 2-6 居中放置一个字符串

1
2
3
4
5
6
7
8
9
10
11
12
NSString *string = @"Hello World";
UIFont *font = [UIFont fontWithName:@"HelveticaNeue" size:48];

// Calculate string size
CGSize stringSize = [string sizeWithAttributes:{NSFontAttributeName:font}];

// Find the target rectangle
CGRect target = RectAroundCenter(RectGetCenter(grayRectangle), stringSize);

// Draw the string
[greenColor set];
[string drawInRect:target withFont:font];

图2-4

图 2-4 将字符串绘制到矩形的中心。虚线表示目标矩形的轮廓。

另一种处理同一中心问题的方法如清单2-7所示。它需要一个现有的矩形,并将其居中在另一个矩形中,而不是使用大小和目标点。您可以在使用其bounds属性返回边界矩形的贝塞尔路径时使用此函数。您可以通过调用RectCenteredInRect()将该路径置于矩形中心。

清单 2-7 居中放置矩形

1
2
3
4
5
6
CGRect RectCenteredInRect(CGRect rect, CGRect mainRect)
{
CGFloat dx = CGRectGetMidX(mainRect) - CGRectGetMidX(rect);
CGFloat dy = CGRectGetMidY(mainRect) - CGRectGetMidY(rect);
return CGRectOffset(rect, dx, dy);
}

本文翻译自《iOS Drawing Practical UIKit Solutions》作者:Erica Sadun,翻译:Cheng Dong。如果觉得本书不错请购买支持正版:亚马逊购买传送门,本书所有源代码可在GitHub上下载。译者虽然力求做到信,达,雅,但是由于时间仓促加之译者水平十分有限,文中难免会出现不正确,不准确,词不达意,难于理解的地方,还望各位批评指正,共同进步,谢谢。转载请注明出处。