ThemeImage
open class ThemeImage: NSImage
ThemeImage is a NSImage subclass that dynamically changes its colors
whenever a new theme is make current.
Theme-aware means you don’t need to check any conditions when choosing which image to draw. E.g.:
ThemeImage.logoImage.draw(in: bounds)
The drawing code will draw with different image depending on the selected theme. Unless some drawing cache is being done, there’s no need to refresh the UI after changing the current theme.
Defining theme-aware images
The recommended way of adding your own dynamic images is as follows:
Add a
ThemeImageclass extension (orTKThemeImagecategory on Objective-C) to add class methods for your images. E.g.:In Swift:
extension ThemeImage { static var logoImage: ThemeImage { return ThemeImage.image(with: #function) } }In Objective-C:
@interface TKThemeImage (Demo) + (TKThemeImage*)logoImage; @end @implementation TKThemeImage (Demo) + (TKThemeImage*)logoImage { return [TKThemeImage imageWithSelector:_cmd]; } @endAdd Class Extensions on any
Themeyou want to support (e.g.,LightThemeandDarkTheme-TKLightThemeandTKDarkThemeon Objective-C) to provide instance methods for each theme image class method defined on (1). E.g.:In Swift:
extension LightTheme { var logoImage: NSImage? { return NSImage(named: "MyLightLogo") } } extension DarkTheme { var logoImage: NSImage? { return NSImage(contentsOfFile: "somewhere/MyDarkLogo.png") } }In Objective-C:
@interface TKLightTheme (Demo) @end @implementation TKLightTheme (Demo) - (NSImage*)logoImage { return [NSImage imageNamed:@"MyLightLogo"]; } @end @interface TKDarkTheme (Demo) @end @implementation TKDarkTheme (Demo) - (NSImage*)logoImage { return [NSImage alloc] initWithContentsOfFile:@"somewhere/MyDarkLogo.png"]; } @endIf supporting
UserTheme‘s, define properties on user theme files (.theme) for each theme image class method defined on (1). E.g.:displayName = Sample User Theme identifier = com.luckymarmot.ThemeKit.SampleUserTheme darkTheme = false logoImage = image(named:MyLogo) //logoImage = image(file:../some/path/MyLogo.png)
Fallback images
Unimplemented properties/methods on target theme class will default to
fallbackImage. This too, can be customized per theme.
Please check ThemeColor for theme-aware colors and ThemeGradient for theme-aware gradients.
-
ThemeImageimage selector used as theme instance method for same selector or, if inexistent, as argument in the theme instance methodthemeAsset(_:).Declaration
Swift
@objc public var themeImageSelector: Selector? -
Resolved Image from current theme (dynamically changes with the current theme).
Declaration
Swift
@objc public var resolvedThemeImage: NSImage = NSImage(size: NSSize.zero)
-
Create a new ThemeImage instance for the specified selector.
Returns an image returned by calling
selectoron current theme as an instance method or, if unavailable, the result of callingthemeAsset(_:)on the current theme.Declaration
Swift
public class func image(with selector: Selector) -> ThemeImageParameters
selectorSelector for image method.
Return Value
A
ThemeImageinstance for the specified selector. -
Current theme image, but respecting view appearance and any window specific theme (if set).
If a
NSWindow.windowThemewas set, it will be used instead. Some views may be using a different appearance than the theme appearance. In thoses cases, image won’t be resolved using current theme, but from eitherlightThemeordarkTheme, depending of whether view appearance is light or dark, respectively.Declaration
Swift
public class func image(for view: NSView, selector: Selector) -> NSImage?Parameters
viewA
NSViewinstance.selectorAn image selector.
Return Value
Resolved image for specified selector on given view.
-
Forces dynamic color resolution into
resolvedThemeImageand cache it. You should not need to manually call this function.Declaration
Swift
@objc open func recacheImage() -
Clear all caches. You should not need to manually call this function.
Declaration
Swift
@objc class open func emptyCache()
View on GitHub
Install in Dash
ThemeImage Class Reference