【问题标题】:Get string-length for a given font and rect获取给定字体和矩形的字符串长度
【发布时间】:2012-05-10 18:57:32
【问题描述】:

我有一个自定义的UIView 类,我想在- (void)drawRect:(CGRect)rect 中绘制一些文本。但是,我希望在系统字体大小为 12 时将文本块的最大宽度限制为 84px。如果文本超过此宽度,我想将其剪切并使最后 3 个字符为“...”。

例子:

"This is some text"    // length okay
"Information co..."    // length truncated

我知道我可以通过NSString- (CGSize)sizeWithFont:(UIFont *)font计算给定字体的字符串的宽度,但是我怎样才能得到84px宽度的最大字符串长度呢?

【问题讨论】:

  • 问题是 iOS 上没有很多(如果有的话)等宽字体。所以你可能适合假设 10 个“i”字符与 6 个“X”字符的宽度相同
  • This blog 甚至说等宽字体在 iOS 中并不是真正的等宽字体:/ - 所以你真的会更好地使用 sizeWithFont: 来处理你想要使用的每个字符串
  • 一定有办法的。 UILabel 正在这样做。我可以对正确的长度进行某种形式的二进制搜索,循环重试直到长度合适,但这对我来说似乎很难看......
  • 是的,我说的是获取特定宽度的最大字符数 - 这只有使用真实(具体)字符串才有可能 - 例如。检查它是否适合。 drawAtPoint: forWidth: withFont: does exactly that。很高兴你解决了你的问题。 :)

标签: iphone objective-c ios ios5 core-graphics


【解决方案1】:

如果我正确理解您的情况,那么您应该使用方法
- (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode 并使用 UILineBreakModeTailTruncation 作为换行模式。

【讨论】:

  • 这非常简单。谢谢!
  • drawAtPoint:forWidth:withFont:lineBreakMode: 在 iOS 7.0 中已弃用。 “改用drawInRect:withAttributes:。” @iJordan 你知道怎么做吗?
【解决方案2】:

我想您想知道特定宽度和字体允许的最大字符数。不幸的是,这是不可能知道的,因为有许多不同的字符大小('m' 比 'l' 宽)。

你可以打电话:

[@"Your text here" sizeWithFont:yourFont minFontSize:smallestFontSizeYouWillAccept actualFontSize:&pointerToYourFontSizeFloatValue forWidth:yourWidthConstraint lineBreakMode:yourLineBreakMode];

这将改变您的 fontSize 浮点值(因为您将指针传递给它),现在它将是您可以使用的最大字体大小而无需换行。使用您给它的浮动,您可以创建一个新字体并将大小设置为您的浮动。

希望这会有所帮助!

【讨论】:

    【解决方案3】:

    此方法对您的情况很有帮助: - (CGSize)drawAtPoint:(CGPoint)point forWidth:(CGFloat)width withFont:(UIFont *)font lineBreakMode:(UILineBreakMode)lineBreakMode

    这是您案件的可靠线索

    【讨论】:

      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 2021-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多