【问题标题】:String length with given font to fit UITextView 2 - The Return给定字体的字符串长度以适合 UITextView 2 - 返回
【发布时间】:2010-11-08 21:28:07
【问题描述】:

this question 中,我要求提供一种截断字符串以适应给定 UITextView 的好方法。由于SDK没有直接提供方法,所以我最终编写了下面的递归方法(仅由以下公共方法调用)。但是,除非我在计算字符串的高度时从字段宽度中减去 15 的软糖因子(kFudgeFactor),否则这不起作用。如果我不这样做,则返回的字符串实际上对于该字段来说太长了,并显示在它下面的额外行中。任何人知道为什么,以及我应该真正使用什么来代替这个软糖因素?

#pragma mark Size string to fit the new view

#define kFudgeFactor 15.0
#define kMaxFieldHeight 9999.0

// recursive method called by the main API
-(NSString*) sizeStringToFit:(NSString*)aString min:(int)aMin max:(int)aMax
{
if ((aMax-aMin) <= 1)
    {
    NSString* subString = [aString substringToIndex:aMin];
    return subString;
    }

int mean = (aMin + aMax)/2; 
NSString* subString = [aString substringToIndex:mean];

CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [subString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

if (stringSize.height <= self.frame.size.height)
        return [self sizeStringToFit:aString min:mean max:aMax]; // too small
else    
        return [self sizeStringToFit:aString min:aMin max:mean];// too big
}

-(NSString*)sizeStringToFit:(NSString*)aString
{

CGSize tallerSize = CGSizeMake(self.frame.size.width-kFudgeFactor,kMaxFieldHeight);
CGSize stringSize = [aString sizeWithFont:self.font constrainedToSize:tallerSize lineBreakMode:UILineBreakModeWordWrap];

// if it fits, just return
if (stringSize.height < self.frame.size.height)
    return aString; 

// too big - call the recursive method to size it       
NSString* smallerString = [self sizeStringToFit:aString min:0 max:[aString length]];
return smallerString;   
}

【问题讨论】:

  • 这是一个很好的答案,但似乎并不正确。我已经检查了滚动视图的 contentInset,它是 0。我刚刚检查了框架的宽度和滚动视图的 contentSize 宽度之间的差异——这也是零。所以看起来 UITextView 是滚动视图的整个宽度。
  • 我现在可以添加 cmets :-) 那么它必须是换行代码的假设。如果您在没有该模式的情况下执行此操作,并且只是尝试适合单个字符串,它会做正确的事情吗?

标签: iphone cocoa-touch


【解决方案1】:

UIScrollView 似乎在两边都使用了固定的 8 像素插图。这与对齐方式或字体大小无关(基于测试和观察,而不是任何明确的内部知识)。

所以看起来你使用你的 fudge 因子是正确的,但它可能应该是16.0,而不是15.0

【讨论】:

  • 弗兰克,我无法证明你说的是对的,但毕竟我试图找到它的根源,所以我给你正确的答案似乎很合理.为什么哦,为什么苹果不记录这样的东西?或者给我们返回文本视图框架的真实宽度?
  • 我通过在 IB 中放置一个文本字段并重叠另一个视图直到它刚好覆盖文本,然后检查定位(测量左边距时使用左对齐文本和右对齐文本右边距)。然后我更改了字体和字体大小并验证了边距没有改变。
  • @FrankSzczerba,只是好奇,你怎么知道“fudgeFactor = 16.0”?我相信当文本大小更小时这个值应该更小
  • @Jacky - 这是很久以前的事了,我已经有一段时间没有做过 iOS 开发了。回顾我的旧 cmets,我认为 16.0 是在边距添加的固定填充,与字体大小无关。那可能是在 iOS 3 下。从那以后情况可能发生了变化。
【解决方案2】:

这可能是因为 UIView 的框架与内容视图的大小不同。 UIScrollView 的 UITextView 子类。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    相关资源
    最近更新 更多