Valori predefiniti per cvfloat, cgsize, minfontsize ecc. In una funzione wrapper
-
24-12-2019 - |
Domanda
Ho il codice che ha una tonnellata di sizeWithFont
chiama che ho bisogno di liberarmi disperatamente da quando SizewithFont è stata deprecata. Ora, ho capito come usare boundingRectWithSize
nel suo posto, tuttavia, invece di ri-fare un milione di chiamate, ho pensato di fare una funzione wrapper per fare i sizewithfonts.
Quindi, ecco il metodo con cui ho trovato:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(CGFloat)width
constrainedToSize:(CGSize)size
lineBreakMode:(NSLineBreakMode)lineBreakMode
minFontSize:(CGFloat)minFontSize
actualFontSize:(CGFloat *)actualFontSize
{
// functionality
}
.
Quello che sto andando è che solo i valori che sono impostati saranno chiamati mentre il resto sarà qualunque sia il valore predefinito per loro. Quindi, se una chiamata ha solo font e larghezza, solo questo sarà impostato. Capisco che il fontsize non è più supportato, ma apprezzerei i suggerimenti su questo.
La mia domanda è: quali sono i valori predefiniti che dovrei impostare il carattere, la larghezza, la dimensione, la formazione di lineetnia, minfontsize e attualità in modo da non ottenere risultati strani. Essenzialmente, voglio lo stesso risultato per:
[s sizeWithFont:font
constrainedToSize:size];
.
Come 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#]
.
Dimmi se è necessario ulteriori chiarimenti. Se riesci a suggerire un bel modo di fare il limite del limite, allora sarebbe anche bello.
Soluzione
Potresti avvolgere primitivi in oggetti?Quindi hai:
- (CGSize) getSizeForCurrentFont:(UIFont*)font
forWidth:(NSNumber*)width
constrainedToSize:(NSValue*)size
lineBreakMode:(NSNumber*)lineBreakMode
minFontSize:(NSNumber*)minFontSize
actualFontSize:(NSNumber*)actualFontSize
{
// functionality
}
.
Qualsiasi valore "predefinito" sarebbe impostato su NIL.Per CGFloat
, li creeresti usando:
CGFloat value = 10.0f;
NSNumber* valueObj = @(value);
.
Per NSValue
, è possibile utilizzare:
CGSize size = CGSizeMake(10.0f, 10.0f);
NSValue* sizeObj = [NSValue valueWithCGSize:size];
.
Il problema chiave qui, è come differenziare tra un valore valido e un identificatore di assenza.In genere lo fai utilizzando una costante definita (come NSNotFound
), ma per i tipi che hai elencato una cosa del genere non esiste.Qui è qui che gli oggetti possono aiutare, poiché la mancanza di un oggetto indica intrinsecamente l'assenza di un valore.
Altri suggerimenti
È possibile creare un metodo:
- (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#]
}
.
Questo è il modo più semplice per creare "valori predefiniti".
Aggiorna Swift 4.2
let size = CGSize(width: 0, height: 0)
.