Valores padrão para CGFloat, CGSize, minFontSize etc.em uma função wrapper
-
24-12-2019 - |
Pergunta
Eu tenho um código que tem uma tonelada de sizeWithFont
chamadas das quais preciso me livrar desesperadamente, já que sizeWithFont foi descontinuado.Agora, eu meio que descobri como usar boundingRectWithSize
em vez disso, porém, em vez de refazer um milhão de chamadas, pensei em criar uma função wrapper para executar sizeWithFonts.
Então, aqui está o método que eu criei:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(CGFloat)width
constrainedToSize:(CGSize)size
lineBreakMode:(NSLineBreakMode)lineBreakMode
minFontSize:(CGFloat)minFontSize
actualFontSize:(CGFloat *)actualFontSize
{
// functionality
}
O que pretendo é que apenas os valores definidos serão chamados, enquanto o restante será qualquer que seja o valor padrão para eles.Portanto, se uma chamada tiver apenas fonte e largura, somente isso será definido.Entendo que fontSize não é mais compatível, mas agradeceria sugestões sobre isso.
Minha pergunta é :quais são os valores padrão que devo definir font,width,size,lineBreakMode,minFontSize e actualFontSize para não obter resultados estranhos.Essencialmente, quero o mesmo resultado para:
[s sizeWithFont:font
constrainedToSize:size];
como com :
[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#]
Diga-me se for necessário algum esclarecimento adicional.Se você puder sugerir uma boa maneira de fazerboundingRectWithSize, isso também seria legal.
Solução
Você poderia agrupar primitivos em objetos?Então você teria:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(NSNumber*)width
constrainedToSize:(NSValue*)size
lineBreakMode:(NSNumber*)lineBreakMode
minFontSize:(NSNumber*)minFontSize
actualFontSize:(NSNumber*)actualFontSize
{
// functionality
}
Quaisquer valores 'padrão' seriam definidos como nulos.Para CGFloat
, você os criaria usando:
CGFloat value = 10.0f;
NSNumber* valueObj = @(value);
Para NSValue
, você pode usar:
CGSize size = CGSizeMake(10.0f, 10.0f);
NSValue* sizeObj = [NSValue valueWithCGSize:size];
A questão principal aqui é como diferenciar entre um valor válido e um identificador de ausência.Normalmente você faz isso usando uma constante definida (como NSNotFound
), mas para os tipos que você listou isso não existe.É aqui que os objetos podem ajudar, pois a falta de um objeto indica inerentemente a ausência de um valor.
Outras dicas
você pode criar um método:
- (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#]
}
Esta é a maneira mais simples de criar "valores padrão".
Atualizar Swift 4.2
let size = CGSize(width: 0, height: 0)