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

时间:2015-06-19 08:03:09

标签: ios objective-c cocoa-touch uifont

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

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

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

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

NSArray* buttonsArray = currentView.subviews;

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

4 个答案:

答案 0 :(得分:2)

在询问对象是否响应fontsetFont:技术上工作时,我们现在拥有UIAppearance系统,旨在为应用程序提供一致的设计。你可以做像#34这样的事情;我的所有导航栏都应该是绿色"或者"所有按钮都应该是蓝色的,除了那些包含在......中的应该是黄色的#34;。许多属性都是可配置的,设置它就像在applicationDidLoad:中列出所需的外观模式一样简单。

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

使用它而不是在遍历视图树时一起攻击某些东西是件好事,它可以适用于所有视图,甚至是那些你目前还没有创建的视图。如果手动设置,则必须在每次创建视图后执行此操作,这样做既繁琐,浪费又容易出错。此外,你不太可能像第三方类那样打破你并不意味着的事情。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

您可以指定字体的设置者是否响应:

注意:代码没有经过测试

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

答案 3 :(得分:0)

[obj respondsToSelector:@selector(font)];

如果方法返回YES,则表示obj具有字体方法。