Значения по умолчанию для 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 больше не поддерживается, но буду признателен за предложения по этому поводу.
Мой вопрос:каковы значения по умолчанию, которые мне следует установить для шрифта, ширины, размера, lineBreakMode, minFontSize и factFontSize, чтобы не получать странных результатов.По сути, я хочу тот же результат для:
[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)