Valores predeterminados para cgfloat, csize, minfontsize, etc. en una función de envoltura
-
24-12-2019 - |
Pregunta
Tengo un código que tiene un montón de llamadas de toneladas de sizeWithFont
que necesito deshacerse desesperadamente, ya que el tamaño, se ha desaprobado. Ahora, tengo una especie de averiguado cómo usar boundingRectWithSize
en su lugar, sin embargo, en lugar de volver a hacer un millón de llamadas, pensé en hacer una función de envoltura para hacer el tamaño,
Por lo tanto, aquí está el método que acumulé:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(CGFloat)width
constrainedToSize:(CGSize)size
lineBreakMode:(NSLineBreakMode)lineBreakMode
minFontSize:(CGFloat)minFontSize
actualFontSize:(CGFloat *)actualFontSize
{
// functionality
}
Por lo que voy a hacer es que solo los valores que se establecen se llamarán mientras el resto sea el valor predeterminado para ellos. Por lo tanto, si una llamada solo tiene fuentes y anchos, solo que se configurarán. Entiendo que la fuentes ya no es compatible, pero apreciaría las sugerencias sobre eso.
Mi pregunta es: ¿Cuáles son los valores predeterminados que debo establecer fuente, ancho, tamaño, línea de línea, minfontsize y realfontsize para que no obtenga resultados extraños? Esencialmente, quiero el mismo resultado para:
[s sizeWithFont:font
constrainedToSize:size];
como con:
[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#]
Dígame si se requiere una mayor aclaración. Si puede sugerir una forma agradable de hacer un límite de fijación, entonces eso también sería genial.
Solución
¿Podrías envolver los primitivos en objetos?Así que tendrías:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(NSNumber*)width
constrainedToSize:(NSValue*)size
lineBreakMode:(NSNumber*)lineBreakMode
minFontSize:(NSNumber*)minFontSize
actualFontSize:(NSNumber*)actualFontSize
{
// functionality
}
Los valores 'predeterminados' se establecerían en NIL.Para CGFloat
, los crearía usando:
CGFloat value = 10.0f;
NSNumber* valueObj = @(value);
Para NSValue
, puede usar:
CGSize size = CGSizeMake(10.0f, 10.0f);
NSValue* sizeObj = [NSValue valueWithCGSize:size];
El problema clave aquí, es cómo diferenciar entre un valor válido y un identificador de ausencia.Normalmente, usted hace esto utilizando una constante definida (como NSNotFound
), pero para los tipos que ha enumerado tal cosa no existe.Aquí es donde los objetos pueden ayudar, ya que la falta de un objeto indica inherentemente la ausencia de un valor.
Otros consejos
Puede crear un 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 es la forma más sencilla de crear "valores predeterminados".
Actualizar SWIFT 4.2
let size = CGSize(width: 0, height: 0)