|
53 | 53 | func closestPosition(to point: CGPoint) -> TextPosition? { |
54 | 54 | guard !layouts.isEmpty else { return nil } |
55 | 55 |
|
56 | | - let layoutIndex = layoutIndex(closestToY: point.y) |
| 56 | + let layoutIndex = layoutIndex(closestTo: point) |
57 | 57 | let layout = layouts[layoutIndex] |
58 | 58 |
|
59 | 59 | guard !layout.lines.isEmpty else { return nil } |
|
93 | 93 | func characterRange(at point: CGPoint) -> TextRange? { |
94 | 94 | guard !layouts.isEmpty else { return nil } |
95 | 95 |
|
96 | | - let layoutIndex = layoutIndex(closestToY: point.y) |
| 96 | + let layoutIndex = layoutIndex(closestTo: point) |
97 | 97 | let layout = layouts[layoutIndex] |
98 | 98 |
|
99 | 99 | guard !layout.lines.isEmpty else { return nil } |
|
264 | 264 | return line.typographicBounds.offsetBy(dx: layout.origin.x, dy: layout.origin.y) |
265 | 265 | } |
266 | 266 |
|
267 | | - fileprivate func layoutIndex(closestToY y: CGFloat) -> Int { |
| 267 | + fileprivate func layoutIndex(closestTo point: CGPoint) -> Int { |
268 | 268 | var closestIndex = 0 |
269 | 269 | var closestDistance = CGFloat.greatestFiniteMagnitude |
270 | 270 | for (index, layout) in zip(layouts.indices, layouts) { |
271 | | - let distance = layout.frame.verticalDistance(to: y) |
| 271 | + let distance = layout.frame.distanceSquared(to: point) |
272 | 272 | if distance < closestDistance { |
273 | 273 | closestDistance = distance |
274 | 274 | closestIndex = index |
|
347 | 347 | if x > maxX { return x - maxX } |
348 | 348 | return 0 |
349 | 349 | } |
| 350 | + |
| 351 | + fileprivate func distanceSquared(to point: CGPoint) -> CGFloat { |
| 352 | + let dx = horizontalDistance(to: point.x) |
| 353 | + let dy = verticalDistance(to: point.y) |
| 354 | + return dx * dx + dy * dy |
| 355 | + } |
350 | 356 | } |
351 | 357 | #endif |
0 commit comments