/UISS

UIAppearance Stylesheets

Primary LanguageObjective-CMIT LicenseMIT

What is UISS?

UISS stands for UIKit Style Sheets.

UISS is an iOS library that provides you with a convenient way to define the style of your application. UISS is built on top of UIKit UIAppearance proxies.

What UISS can do for you?

UISS has the power to:

  • replace unreadable UIAppearance code with a simple JSON dictionary,
  • provide a way to change application style without the need to rebuild your code, without the need to restart your app, even without the need to reload your views - yep, this is the sexy feature of UISS.

Design goal

UISS do not enforce any dependencies on your app. You can generate Objective-C code for your UISS style so you do not even have to link with UISS library in your production build.

But how does it really look?

Assuming you're familiar with UIAppearance proxy you probably wrote a piece of code similar to this one:

[[UITabBar appearance] setTintColor:[UIColor darkGrayColor]]

in UISS it looks like this:

{
    "UITabBar": {
        "tintColor": "darkGray",
    }
}

no big difference here, so lets look at more complex example:

[[UIButton appearance] setTitleColor:[[UIColor whiteColor] colorWithAlphaComponent:0.800]
                            forState:UIControlStateNormal];
[[UIButton appearance] setTitleColor:[UIColor whiteColor]
                            forState:UIControlStateHighlighted];
[[UIButton appearance] setBackgroundImage:[[UIImage imageNamed:@"button-background-normal"]
              resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0)]
                                 forState:UIControlStateNormal];
[[UIButton appearance] setBackgroundImage:[[UIImage imageNamed:@"button-background-highlighted"]
              resizableImageWithCapInsets:UIEdgeInsetsMake(0.0, 10.0, 0.0, 10.0)]
                                 forState:UIControlStateHighlighted];
[[UILabel appearanceWhenContainedIn:[UIButton class], nil] setFont:[UIFont fontWithName:@"Copperplate-Bold" size:18.0]];
[[UIButton appearance] setTitleEdgeInsets:UIEdgeInsetsMake(1.0, 0.0, 0.0, 0.0)];
{
	"UIButton":{
	    "titleColor:normal":["white", 0.8],
	    "titleColor:highlighted":"white",
	    "backgroundImage:normal": ["button-background-normal", [0,10,0,10]],
	    "backgroundImage:highlighted": ["button-background-highlighted", [0,10,0,10]],
	    "titleEdgeInsets": [1,0,0,0],
	    "UILabel":{
	        "font":["Copperplate-Bold", 18]
	    }
	}
}

Install

  • get the code
  • add UISS.xcodeproj to your project
  • (optional) add UISSResource.bundle to your target

Configure UISS

Local

The simplest way to start with UISS is to create uiss.json file and add it to your project's resources. To activate this file add this line:

[UISS configureWithDefaultJSONFile];

This should be called before your views are displayed, the common place for that is your Application Delegate's didFinishLaunching method.

Remote

If you want to load your style from remote location to enable live updates, here's how to do that:

self.uiss = [UISS configureWithURL:[NSURL URLWithString:@"http://localhost/uiss.json"]];

Live updates

UISS can detect if your style changed and automatically update your interface. To enable this feature call this method:

uiss.autoReloadEnabled = YES;
uiss.autoReloadTimeInterval = 1;

Status bar

uiss.statusWindowEnabled = YES;

UISS will take a small portion of the screen (usually taken by status bar) to show you what is going on behind the scenes.

Console

Tapping on UISS status bar will present console view where:

  • you can get info about errors in your style
  • you can generate UIAppearance code for your style

Syntax

Axis parameters

Containment

Converters

UISS has value converters for every type used to set UIAppearance properties. These converters provide useful shortcuts and convinient syntax for defining your properties.

Here are some examples and eqivalent values in Objective-C code.

Colors

Hex

"#ffffff"
[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:1]

Default UIColor colors

"red"
[UIColor redColor]
"redColor"
[UIColor redColor]

Colors with pattern image

"patternImageName"
[UIColor colorWithPatternImage:@"patternImageName"]

RGB

[0, 255, 255]
[UIColor colorWithRed:0.0f green:1.0f blue:1.0f alpha:1.0f]

Colors with alpha

["#ffffff", 0.5]
[UIColor colorWithRed:1.0f green:1.0f blue:1.0f alpha:.0.5f]
["red", 0.5]
[[UIColor redColor] colorWithAlphaComponent:0.5f]
[0, 255, 255, 0.5]
[UIColor colorWithRed:0.0f green:1.0f blue:1.0f alpha:.0.5f]

Images

Simple image with name:

"imageName"
[UIImage imageNamed:@"imageName"]

Resizable images:

["imageName", 1, 2, 3, 4]
[[UIImage imageNamed:@"imageName"] resizableImageWithCapInsets:UIEdgeInsetsMake(1, 2, 3, 4)]

Fonts

14
[UIFont systemFontOfSize:14.0f]
["bold", 14]
[UIFont boldSystemFontOfSize:14.0f]
["italic", 20]
[UIFont italicSystemFontOfSize:14.0f]
["Georgia-Italic", 12]
[UIFont fontWithName:@"Georgia-Italic" size:12.0f]

TextAttributes

{
	"font": ["bold", 12],
	"textColor": "black",
	"textShadowColor": "lightGray",
	"textShadowOffset": [1, 2]
}
[NSDictionary dictionaryWithObjectsAndKeys:
 [UIFont boldSystemFontOfSize:12], UITextAttributeFont,
 [UIColor blackColor], UITextAttributeTextColor,
 [UIColor lightGrayColor], UITextAttributeTextShadowColor,
 [NSValue valueWithUIOffset:UIOffsetMake(1, 2)], UITextAttributeTextShadowOffset, nil];

Structures

CGSize

JSON Objective-C
1 CGSizeMake(1, 1)
[1] CGSizeMake(1, 1)
[1, 2] CGSizeMake(1, 2)

CGRect

JSON Objective-C
[1, 2, 3, 4] CGRectMake(1, 2, 3, 4)

UIEdgeInsets

JSON Objective-C
[1, 2, 3, 4] UIEdgeInsetsMake(1, 2, 3, 4)

UIOffset

JSON Objective-C
1 UIOffsetMake(1, 1)
[1] UIOffsetMake(1, 1)
[1, 2] UIOffsetMake(1, 2)

CGPoint

JSON Objective-C
1 CGPointMake(1, 1)
[1] CGPointMake(1, 1)
[1, 2] CGPointMake(1, 2)

UIKit Enums

UIBarMetrics

JSON Objective-C
default UIBarMetricsDefault
landscapePhone UIBarMetricsLandscapePhone

UIControlState

JSON Objective-C
normal UIControlStateNormal
highlighted UIControlStateHighlighted
disabled UIControlStateDisabled
selected UIControlStateSelected
reserved UIControlStateReserved
application UIControlStateApplication

UISegmentedControlSegment

JSON Objective-C
any UISegmentedControlSegmentAny
left UISegmentedControlSegmentLeft
center UISegmentedControlSegmentCenter
right UISegmentedControlSegmentRight
alone UISegmentedControlSegmentAlone

UIToolbarPosition

JSON Objective-C
any UIToolbarPositionAny
bottom UIToolbarPositionBottom
top UIToolbarPositionTop

UISearchBarIcon

JSON Objective-C
search UISearchBarIconSearch
clear UISearchBarIconClear
bookmark UISearchBarIconBookmark
resultsList UISearchBarIconResultsList

Variables

You can define variables that can be used in your UISS style. All variables shoud be defined under Variables key in your style dictionary. To reference a variable prefix its name with $ sign.

Example:

{
	"Variables": {
		"tintColor": "red"
	},

	"UIToolbar": {
		"tintColor": "$tintColor"
	}
}

User Interface Idioms

Sometimes you want to have a slightly different look on the iPhone from the one you have on the iPad. With UISS you can create parts of style that apply only to a specified UI Idiom.

{
	"UINavigationBar": {
	    "Phone": {
	        "tintColor": "gray"
	    },
	    "Pad": {
	        "tintColor": "lightGray"
	    }
	}
}

Comments

JSON specification doesn't support comments. But sometimes being able to easly disable some parts of your UISS style can be really useful. You can do that by adding - prefix to dictionary keys. UISS will ignore those keys without reporting errors.

Example:

{
	"UIToolbar": {
		"-tintColor": "blue",
		"backgroundImage:any:default": "background"
	},
	"-UITabbar": {
		"tintColor": "blue"
	}
}

This will only set UIToolbar's background image.