如何使UITextView背景线与文本alignment?

我想绘制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); 

结果如图所示 在这里输入图像说明

它看起来像是正确的第一行,但下面的行不与文本alignment。

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

你可能想检查一下。

经过几次实验,我发现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

这只是一个工作,我很想知道一个更好的方式来实现这一目标。

这不是确切的解决scheme,但这个UI的方法。 这个用户界面给人一种下划线文本的感觉。

  • 尝试使用带有下划线属性的NSAttributedString,您可以将虚线作为模式提供。

  • 使用CoreText,您可以使用kCTUnderlinePatternDash属性在视图上绘制文本。

  • 我可以在iOS的核心文本中使用NSAttributedString吗?

  • CoreText教程

但我想用这个,我们可以达到你需要的同样的function。

希望这可以帮助。