gpt4 book ai didi

ios - UILabel 如何垂直居中其文本?

转载 作者:IT王子 更新时间:2023-10-29 08:03:58 26 4
gpt4 key购买 nike

对于我实际想要实现的目标,存在很多困惑。所以请让我重述我的问题。很简单:

How does Apple center text inside UILabel's -drawTextInRect:?


以下是我寻找 Apple 居中文本方法的一些背景信息:

  • 我对他们在此方法中将文本居中的方式不满意
  • 我有自己的算法,可以按照我想要的方式完成工作

但是,有些地方我无法将此算法注入(inject)到其中,即使使用方法调配也是如此。了解他们使用的确切算法(或等效算法)将解决我个人的问题。


这是一个 demo project你可以试验一下。如果您对我的 Apple 实现问题感兴趣,请查看左侧(基本 UILabel):当您使用 slider 增加字体大小时,文本会上下跳动,而不是逐渐向下移动。

同样,我正在寻找的是 -drawTextInRect: 的实现,它与基本 UILabel 完全相同——但没有调用 super.

- (void)drawTextInRect:(CGRect)rect
{
CGRect const centeredRect = ...;

[self.attributedText drawInRect:centeredRect];
}

最佳答案

我没有答案,但我做了一些研究并认为我会分享它。我用了Xtrace ,它允许您跟踪 Objective-C 方法调用,以尝试找出 UILabel 在做什么。我将 Xtrace git 存储库中的 Xtrace.hXtrace.mm 添加到 Christian 的 UILabel 演示项目中。在 RootViewController.m 中,我添加了 #import "Xtrace.h",然后试验了各种跟踪过滤器。将以下内容添加到 RootViewController 的 loadView:

[Xtrace includeMethods:@"drawWithRect|drawInRect|drawTextInRect"];
[Xtrace traceClassPattern:@"String|UILabel|AppleLabel" excluding:nil];

给我这个输出:

| [<AppleLabel 0x7fedf141b520> drawTextInRect:{{0, 0}, {187.5, 333.5}}]
| [<NSConcreteMutableAttributedString 0x7fedf160ec30>/NSAttributedString drawInRect:{{0, 156.5}, {187.5, 333.5}}]
| [<UILabel 0x7fedf1418dc0> drawTextInRect:{{0, 0}, {187.5, 333.5}}]
| [<UILabel 0x7fedf1418dc0> _drawTextInRect:{{0, 0}, {187.5, 333.5}} baselineCalculationOnly:0]
| [<__NSCFConstantString 0x1051d1db0>/NSString drawWithRect:{{0, 156.3134765625}, {187.5, 20.287109375}} options:1L attributes:<__NSDictionaryM 0x7fedf141ae00> context:<NSStringDrawingContext 0x7fedf15503c0>]

(我正在使用 Xcode 7.0 beta、iOS 9.0 模拟器运行它。)

我们可以看到 Apple 的实现没有将 drawInRect: 发送到 NSAttributedString,而是将 drawWithRect:options:attributes: 发送到 NSString。我猜这些最终会做同样的事情。

我们还可以准确地看到计算出的 Y 偏移量是多少。在 slider 的这个初始位置,它是 156.3134765625。有趣的是,它不是落在某个四舍五入的整数值或 0.25 的倍数或类似值上的东西,否则这将是对跳跃的解释。

我们还看到 UILabel 发送 20.287109375 作为高度,这与 self.attributedText.size.height 计算的值相同。所以它似乎正在使用它,尽管我无法追踪那个调用(也许它是直接使用 Core Text?)。

这就是我被困的地方。一直在尝试查看 UILabel 计算的内容与明显的公式“labelYOffset = (boundsHeight - labelHeight)/2.0”之间的区别,但我发现没有一致的模式。

更新 1.所以我们可以将这个难以捉摸的 Y 偏移建模为

labelYOffset = (boundsHeight - labelHeight) / 2.0 + error

error 是什么,正是我们要弄清楚的。让我们试着像科学家一样研究这个。 Here是我将幻灯片拖到末尾然后拖到开头时的 Xtrace 输出。我还在 slider 的每次更改处添加了一个 NSLog,这有助于分隔条目。我写了a Python script根据标签高度绘制误差。

Plot or UILabel error in vertical centering against label height

很有趣。我们看到误差有一些线性,但如果您理解我的意思,它们会在某些点奇怪地跳到线之间。这里发生了什么?在解决这个问题之前,我会失眠。 :)

关于ios - UILabel 如何垂直居中其文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30759598/

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