CGFloat、CGSize、minFontSize 等的默认值。在包装函数中
-
24-12-2019 - |
题
我的代码有很多 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,那么那也很酷。
解决方案
您可以将原语包装成对象吗?所以你会有:
- (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
),但对于您列出的类型,这样的东西不存在。这就是对象可以提供帮助的地方,因为缺少对象本身就表明缺少值。
其他提示
你可以创建一个方法:
- (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#]
}
这是创建“默认值”的最简单方法。
更新斯威夫特 4.2
let size = CGSize(width: 0, height: 0)
不隶属于 StackOverflow