Подкласс UIFont

Можно ли подкласс UIFont и инициализировать его другим (или дескриптором шрифта)? Проблема в том, что я не могу позвонить super.init(descriptor:size:) для инициализации, потому что это удобный инициализатор. Цель этого состоит в том, чтобы изменить атрибуты для ascender а также descender (переопределить свойства только для чтения) из-за того, что я отображаю только цифры и слишком много пробелов выше и ниже букв (которые я рисую непосредственно в графическом контексте). Когда есть другое элегантное решение, это было бы очень кстати.

Я ценю вашу помощь, заранее спасибо.

1 ответ

То, что вы просите для инкапсуляции разрывов, и, возможно, также не имеет смысла.

Вместо использования наследования и с некоторыми допущениями, более аккуратным способом достижения этой цели будет добавление категории к UIFont и предоставьте свой собственный метод фабрики удобства (например, класс).

@interface UIFont (MyUIFont)

@property (assign) CGFloat ascender;
@property (assign) CGFloat descender;

+(instancetype) UIFontWithLessSpacing;

@end

@implementation UIFont (MyUIFont)

+(instancetype) UIFontWithLessSpacing
{
    UIFont *font = [UIFontWIthName:@"MyFont" size:12.0f];
    font.ascender = 0.0;
    font.descender = 0.0;
    return font;
}

Есть предостережения:

  • Тот UIFont на самом деле реагирует на селекторы setAscender а также setDescender - они скрыты в общедоступном интерфейсе
  • Настройка этих свойств влияет на макет и, наоборот, не имеет нежелательных побочных эффектов.
  • Вы ковыряетесь в черном ящике без каких-либо гарантий того, что то, что вы делаете, будет работать или продолжит работать.
Другие вопросы по тегам