2

我正在尝试绘制 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);

结果如图所示 在此处输入图像描述

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

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

4

3 回答 3

4

你可能想看看这个

于 2013-08-06T05:16:06.270 回答
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

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

于 2013-08-06T05:58:00.800 回答
1

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

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

希望这可以帮助。

于 2013-08-06T05:21:33.733 回答