【问题标题】:How to make UITextView background lines aligned with the text?如何使 UITextView 背景线与文本对齐?
【发布时间】:2013-08-06 05:06:06
【问题描述】:

我正在尝试绘制 UITextView 的背景线, 这是我用来绘制这些线条的代码

    CGContextBeginPath(context);
    CGContextSetStrokeColorWithColor(context, self.horizontalLineColor.CGColor);
    CGContextSetLineWidth(context, kDashedBorderWidth);
    CGContextSetLineDash(context, 0, kDashedLinesLength, kDashedCount) ;

    CGFloat baseOffset = 9.0f + self.font.descender;
    CGFloat boundsX = self.bounds.origin.x;
    CGFloat boundsWidth = self.bounds.size.width;

    NSInteger firstVisibleLine = MAX(1, (self.contentOffset.y / self.font.lineHeight));
    NSInteger lastVisibleLine = ceilf((self.contentOffset.y + self.bounds.size.height) / self.font.lineHeight);
    for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line)
    {
        CGFloat linePointY = (baseOffset + (self.font.lineHeight * (float)line));            
        CGContextMoveToPoint(context, boundsX, linePointY);
        CGContextAddLineToPoint(context, boundsWidth, linePointY);
    }
    CGContextClosePath(context);
    CGContextStrokePath(context);

结果如图所示

它似乎正确地获取了第一行,但以下行与文本不对齐。

我可能在这里错过了什么?与本地化设置有什么关系吗?

【问题讨论】:

  • 看起来您的行高计算已关闭。它最初是对齐的,因为第一行对齐正确,但是由于文本的行高大于虚线的行高,它最终变得越来越不合规。我将首先查看您对线高的计算并进行调整。
  • 我同意,self.font.lineHeight 似乎没有提供精确的高度值。
  • 显然 UITextView 的内部渲染没有使用lineHeight 属性来布置线条。不知道内部是如何工作的,就不可能准确地画出线条。
  • 您好,请问您是如何从baseOffset 推导出9.0f 的?谢谢。

标签: ios uitextview


【解决方案1】:

您可能想签出this

【讨论】:

  • 我使用这个项目作为我的绘图代码的起点。它有同样的问题。
  • 这个项目很好,但问题是它每次都画线..当我只是将光标放在 textview 上并更改 textview 的框架时,它会再次绘制 uitextview 的线条和文本是否会和原来一样。
【解决方案2】:

经过几次实验,我发现lineHeight实际上比实际高度要小一点,大约1磅。

这是工作版本

CGFloat baseOffset = 7.0f + self.font.descender;

// ....

for (NSInteger line = firstVisibleLine; line <= lastVisibleLine; ++line)
{
    CGFloat linePointY = (baseOffset + ((self.font.lineHeight + 1.0f) * (float)line));            
    CGContextMoveToPoint(context, boundsX, linePointY);
    CGContextAddLineToPoint(context, boundsWidth, linePointY);
}

如果你实现自己的版本,我认为你需要找出两个神奇的数字:7.0f1.0f

这只是一种解决方法,我很想知道实现这一目标的更好方法。

【讨论】:

    【解决方案3】:

    这不是确切的解决方案,而是此 UI 的解决方法。此 UI 给人一种带下划线的文本的感觉。

    但我想使用它,我们可以实现您需要的相同功能。

    希望这会有所帮助。

    【讨论】:

    • 谢谢,这绝对有帮助,但在走这条路之前,我想尝试一个更简单的解决方案。
    • 一旦你得到任何合适的解决方案,也请在这里上传。这样对所有人都有帮助。
    • 查看我的答案,我不能接受我自己的答案,所以只允许在 2 天后这样做。
    猜你喜欢
    • 2015-03-30
    • 2023-04-10
    • 1970-01-01
    • 2012-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    相关资源
    最近更新 更多