Obj-C,如何迭代具有字体属性的视图的所有视图



我正在尝试初步调查(记录)我在应用程序中使用的所有字体和字体大小,字体/大小,可以通过编程方式或在 nib 文件中设置。之后,我希望也使用代码来设置字体。

(我知道字体类型动态,但是我有自动布局问题。

到目前为止,我已经有了(见下文),但理想情况下,我只想找到任何带有字体的东西,我的意思是它可以是一个导航栏,而不仅仅是按钮、标签或文本字段。

也许我可以以某种方式检查一下字体方法是否可用?

NSArray* buttonsArray = currentView.subviews;
for((UIButton*) button in buttonsArray)
{
     button.titleLabel.font = [UIFont fontWithName:@"myCustomFont" size:16];
}

在询问对象是否响应fontsetFont:技术上是否正常工作时,我们现在有了UIAppearance系统,旨在为应用程序提供一致的设计。您可以执行诸如"我的所有导航栏都应为绿色"或"所有按钮都应为蓝色,但包含在...中的按钮除外。应该是黄色的"。许多属性都是可配置的,设置它就像列出所需的外观模式一样简单,例如在 applicationDidLoad: 中。

http://nscookbook.com/2013/01/ios-programming-recipe-8-using-uiappearance-for-a-custom-look/是网上提供的简短介绍之一。

使用它而不是在遍历视图树时将某些内容一起破解的好处是,它将适用于所有视图,甚至是您到目前为止尚未创建的视图。如果手动设置,则必须在每次创建视图后执行此操作,这很乏味,浪费并且容易出现错误。此外,您不太可能破坏您不想破坏的东西,例如第三方课程。

您可以通过向对象发送 -respondsToSelector: 消息来检查对象是否响应 -font,如下所示:

if ( [ obj respondsToSelector:@selector( font ) ] )
{
    UIFont * font = [ (id)obj font ] ;
}

您可以分配字体的设置器是否响应:

注意:代码未测试

for(id obj in buttonsArray)
{
    if ( [obj respondsToSelector:@selector(setFont:)] )
    {
        // do something
    }
}
[obj respondsToSelector:@selector(font)];

如果方法是 retuen YES,则意味着 obj 具有字体方法。

最新更新