0

由于 sizeWithFont 已被弃用,我的代码中有大量sizeWithFont调用,我需要拼命摆脱这些调用。现在,我已经想出了如何使用boundingRectWithSize它来代替它,但是,我没有重新进行一百万次调用,而是考虑制作一个包装函数来执行 sizeWithFonts。

所以,这是我想出的方法:

- (CGSize) getSizeForCurrentFont:(UIFont*)font
                    forWidth:(CGFloat)width
           constrainedToSize:(CGSize)size
               lineBreakMode:(NSLineBreakMode)lineBreakMode
                 minFontSize:(CGFloat)minFontSize
              actualFontSize:(CGFloat *)actualFontSize
{
    // functionality
}

我的目标是只调用设置的值,而其余的将是它们的默认值。因此,如果调用只有字体和宽度,则只会设置它。我确实了解不再支持 fontSize ,但我很感激对此提出建议。

我的问题是:我应该将 font、width、size、lineBreakMode、minFontSize 和 actualFontSize 设置为什么默认值,以免得到奇怪的结果。本质上,我想要相同的结果:

[s sizeWithFont:font
constrainedToSize:size];

与:

[s getSizeForCurrentFont:font 
forWidth:width #This is some Default Value# 
constrainedToSize:size 
lineBreakMode:lineBreakMode #This is some Default Value# 
minFontSize:minFontSize #This is some Default Value# 
actualFontSize: actualFontSize #This is some Default Value#]

请告诉我是否需要进一步澄清。如果你能提出一个很好的方法来做 boundingRectWithSize,那也很酷。

4

3 回答 3

0

你可以创建一个方法:

- (CGSize) sizeWithFont:(UIFont*)font constrainedToSize:(CGSize)size {
    [self getSizeForCurrentFont:font 
        forWidth:#some Default Value# 
        constrainedToSize:size 
        lineBreakMode:#some Default Value# 
        minFontSize:#some Default Value# 
        actualFontSize:#some Default Value#]
}

这是创建“默认值”的最简单方法。

于 2014-02-27T21:54:00.093 回答
0

您可以将基元包装到对象中吗?所以你会有:

- (CGSize) getSizeForCurrentFont:(UIFont*)font
                    forWidth:(NSNumber*)width
           constrainedToSize:(NSValue*)size
               lineBreakMode:(NSNumber*)lineBreakMode
                 minFontSize:(NSNumber*)minFontSize
              actualFontSize:(NSNumber*)actualFontSize
{
    // functionality
}

任何“默认”值都将设置为零。对于CGFloat,您可以使用以下方法创建它们:

CGFloat value = 10.0f;
NSNumber* valueObj = @(value);

对于NSValue,您可以使用:

CGSize size = CGSizeMake(10.0f, 10.0f);
NSValue* sizeObj = [NSValue valueWithCGSize:size];

这里的关键问题是如何区分有效值和缺席标识符。通常,您可以使用定义的常量(例如NSNotFound)来执行此操作,但是对于您列出的类型,这样的事情不存在。这是对象可以提供帮助的地方,因为缺少对象本身就表明缺少值。

于 2014-02-27T21:55:40.827 回答
0

更新 Swift 4.2

 let size = CGSize(width: 0, height: 0)
于 2019-02-07T02:37:14.327 回答