将数组中的 CGRect 合并起来

coo*_*ink -2 ios swift

我试图将从该函数收到的数组中的元素中的 CGRect 信息结合起来。我应该如何只从它返回的CGRect对象中取出对象[UITextSelectionRect] struct。然后循环它们并将它们结合起来。做这个的最好方式是什么?

let test = myTextView.selectionRects(for: paragraph.first!.range)
Run Code Online (Sandbox Code Playgroud)

rob*_*off 5

这取决于你将它们组合起来的意思。

\n\n

CGRect有一个union方法:

\n\n
let union = rect1.union(rect2)\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将返回CGRect紧紧包围 和rect1rect2

\n\n

两个 CGRect 的并集

\n\n

并集(绿色阴影矩形)包围两个输入矩形,但包括任一输入矩形之外的区域。

\n\n

因此,您可以将此联合运算应用于CGRect如下数组:

\n\n
let test = myTextView.selectionRects(for: paragraph.first!.range)\n    .reduce(CGRect.null) { $0.union($1.rect) }\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将为您提供一个CGRect紧密包围所有选定文本的文本,但通常也会包围未选定的区域。

\n\n

如果您想要一个完全包围输入矩形并且不包围输入矩形之外的任何区域的形状,那么您需要所谓的 \xe2\x80\x9ccontour\xe2\x80\x9d 的(几何)并集输入矩形。一般来说,该轮廓不是矩形,因此您必须使用 aCGPath而不是使用 a 来表示它CGRect

\n\n

计算一组矩形的轮廓是一个更难的问题。幸运的是,我已经在这个答案中解决了。

\n