目前,我正在使用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/

10-09 08:28