ios - 在 iOS 上更改主题

标签 ios uiappearance

目前我正在使用 UISS 更改我的应用程序的某些样式,但我认为它不可能设置特定控件的样式。例如。如果我想更改标签为 1 或 ID 为“xpto”的按钮的图像。 有什么方法可以用 UIAppearance 或 UISS 来做到这一点吗?

我有一个像这样的按钮:

UIButton *xpto = [[UIButton alloc] init];

我想在调用方法时为其设置主题,目前我正在使用 UISS 为我的对象设置主题

-(void) changeTheme:(NSString*)themeName{
    NSString *filePath = [[NSBundle mainBundle] pathForResource:themeName ofType:@"json"];
    AppDelegate *dlg =[[UIApplication sharedApplication] delegate];
    dlg.uiss.style.url = [NSURL fileURLWithPath:filePath];
    [dlg.uiss reloadStyleAsynchronously];
}

json文件:

{
    "UIButton": {
        "titleColor:normal": "red"
     }
}

我唯一的问题是这会更改所有 UIButton,而我只想更改 xpto。有什么方法可以定义像下面这样的东西来只改变这个按钮。

    "UIButton#xpto": {
        "titleColor:normal": "red"
     }

最佳答案

您可以通过在运行时创建类来做到这一点。

首先,在代码中可以看到的地方定义这个函数:

Class SGBCreateClassWithId(Class baseClass, NSString *classId)
{
    NSString *className = NSStringFromClass(baseClass);

    if (classId.length > 0)
    {
        className = [NSString stringWithFormat:@"%@#%@", className, classId];
    }

    Class subClass = NSClassFromString(className);

    if (!subClass)
    {
        subClass = (Class)objc_allocateClassPair(baseClass, [className UTF8String], 0);
        if (subClass)
        {
            objc_registerClassPair(subClass);
        }
    }

    return subClass;
}

现在,改变这一行:

UIButton *xpto = [[UIButton alloc] init];

对此:

Class classWithId = SGBCreateClassWithId([UIButton class], @"xpto")
UIButton *xpto = [[classWithId alloc] init];

现在您的按钮属于 UIButton 的子类,称为 UIButton#xpto,因此您的 UISS 应该按您希望的方式工作。

一个警告:UISS 仅识别在您加载 UISS JSON 文件时存在的类。因此,如果您确实以这种方式创建新类,则需要重新加载 UISS JSON。

关于ios - 在 iOS 上更改主题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17550638/

相关文章:

ios - 使用 UIAppearance 更改后更新导航栏

ios - 自 iOS6 以来,UINavigationBar 中的标题未对齐

ios - 大小类不支持 IOS 中常规宽度和常规高度的 UI 元素

ios - 使用NSDate和NSDateFormatter存储星期几的最佳方法

ios - 在多个 TextField 中填充数据(数字)之前,如何禁用 UIButton?

ios - 如何将包目录保存到 NSTemporaryDirectory()

ios - 使用 UIAppearance 代理代替普通的默认值有什么好处?