【问题标题】:Subclassing UIFont子类化 UIFont
【发布时间】:2015-12-22 16:16:21
【问题描述】:
是否可以继承UIFont 并用另一个(或字体描述符)初始化它?问题是,我不能调用super.init(descriptor:size:) 进行初始化,因为它是一个方便的初始化程序。这样做的目的是更改ascender 和descender 的属性(覆盖只读属性),因为我只显示数字并且字母上方和下方有太多空格(我直接绘制在图形上下文中)。当有另一个优雅的解决方案时,它会非常受欢迎。
感谢您的帮助,在此先感谢。
【问题讨论】:
标签:
ios
swift
text
ios9
uifont
【解决方案1】:
你要求打破封装,也许也没有意义。
与其使用继承,而且有一些假设,实现这一点的更简洁的方法是将category 添加到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 - 它们隐藏在公共界面上
- 设置这些属性会对布局产生影响,相反不会产生不必要的副作用。
- 您在黑匣子中四处游荡,无法保证您所做的事情会奏效,或者会继续奏效。