gpt4 book ai didi

ios - CTRunGetImageBounds 在 iOS 10 及以下版本返回不正确的 x 坐标

转载 作者:行者123 更新时间:2023-11-29 11:32:33 24 4
gpt4 key购买 nike

我正在使用 CoreText 并尝试为 iOS 11/12 上的自定义标签添加链接支持,但我也需要支持旧软件版本。为此,我检查用户的触摸是否与链接文本边界相交。

要获得边界,我只需调用 CTRunGetImageBounds(run, context, CFRangeMake(0, 0))。这在 iOS 11 和 12 上完美运行,但在 9 和 10 上被破坏了。我在 iOS 11 上沿着 (250,8.1,100,30) 行返回了一个矩形,但是在 iOS 9 上,相同的函数调用返回( 0.1,8.1,100,30)。 x 坐标似乎是相对于运行而不是实际帧。由于坐标无效,因此无法在 iOS 9/10 上正确点击链接,这是一个显而易见的问题。

我附上了一张比较两者的图片。预期的行为是链接应该用绿色矩形突出显示。请注意,iOS 12 模拟器正确地执行了此操作,而 9.3 由于 x 坐标接近零,所有矩形都向左猛烈撞击。

iOS 12 simulator iOS 9.3 simulator

最佳答案

Fixed iOS 9.3

这似乎是 CoreText 错误或 Apple 在没有记录的情况下更改的某些行为。在 iOS 9 上,CTRunGetImageBounds 返回相对于自身的 x 值,而不是更大的框架。这意味着虽然高度和宽度正确,但返回的 x 坐标根本没用。由于这是一个早已失效的固件,它不会得到修复,但我还是找到了解决方法!

swift 4

/// Get the CoreText relative frame for a given CTRun. This method works around an iOS <=10 CoreText bug in CTRunGetImageBounds
///
/// - Parameters:
/// - run: The run
/// - context: Context, used by CTRunGetImageBounds
/// - Returns: A tight fitting, CT rect that fits around the run
func getCTRectFor(run:CTRun,context:CGContext) -> CGRect {
let imageBounds = CTRunGetImageBounds(run, context, CFRangeMake(0, 0))
if #available(iOS 11.0, *) {
//Non-bugged iOS, can assume the bounds are correct
return imageBounds
} else {
//<=iOS 10 has a bug with getting the frame of a run where it gives invalid x positions
//The CTRunGetPositionsPtr however works as expected and returns the correct position. We can take that value and substitute it
let runPositionsPointer = CTRunGetPositionsPtr(run)
if let runPosition = runPositionsPointer?.pointee {
return CGRect.init(x: runPosition.x, y: imageBounds.origin.y, width: imageBounds.width, height: imageBounds.height)
}else {
//FAILED TO OBTAIN RUN ORIGIN? FALL BACK.
return imageBounds
}
}
}

CTRunGetImageBounds 返回无效的 x 坐标时,我们可以使用 CTRunGetPositionsPtr 来修复它,因为它返回运行的正确原点。要获得范围的完整、正确的框架,我们只需将 CTRunGetImageBounds 中的 x 值替换为我们的新值。

这可能会慢一点,但只会慢几分之一毫秒。

关于ios - CTRunGetImageBounds 在 iOS 10 及以下版本返回不正确的 x 坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030633/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com