Idea & Features • Supported Versions • Installation • Usage • Contributing • License • Issues • Pull Requests
At WWDC 2019, Apple announced a new library of icons that came included with that year's new operating system versions. To browse them, there's a dedicated Mac app called SF Symbols. However, developers still have to copy the name of a symbol and reference it unsafely, resulting in code like this:
UIImage(systemName: "circle.fill")
It didn't take long until first ideas came up to make these icons accessible in a safe way using a framework. And this is just the basic idea behind SFSafeSymbols
!
Furthermore, with SFSafeSymbols
...
- ... you can be sure your symbol code won't crash due to typos or symbol availability issues. This is because all symbols are tested via a CI (on the latest iOS & tvOS versions and also some earlier OS versions).
- ... lookups in the SF Symbols app (e. g. about available layersets, available localizations & the look of the symbol) are no longer needed because every symbol is documented in code.
- ... multiple SF Symbols versions are supported at the same time (via utilization of the
@availability
flag). Each symbol is only made available on those platform versions where Apple says it's available. - ... renamed symbols can be detected easily (via a deprecation notice which suggests the use of the new name at the same time).
The following SF Symbols versions are currently supported:
SF Symbols Version | iOS Version | macOS Version | tvOS Version | watchOS Version |
---|---|---|---|---|
1.0 | 13.0 | 11.0 | 13.0 | 6.0 |
2.0 | 14.0 | 11.0 | 14.0 | 7.0 |
2.1 | 14.2 | 11.0 | 14.2 | 7.1 |
2.2 | 14.5 | 11.3 | 14.5 | 7.4 |
3.0 | 15.0 | 12.0 | 15.0 | 8.0 |
3.1 | 15.1 | 12.0 | 15.1 | 8.1 |
SFSafeSymbols
can be installed via the Swift Package Manager (recommended), Carthage or CocoaPods.
Supported platforms are iOS (11.0+)
, macOS (10.13+)
, tvOS (11.0+)
and watchOS (4.0+)
, although the actual functionality is of course only accessible starting with iOS 13.0
, macOS 11.0
, tvOS 13.0
and watchOS 6.0
.
To integrate SFSafeSymbols using the Xcode-built-in SPM, choose File
→ Swift Packages
→ Add Package Dependency
. Enter the following url: https://github.com/SFSafeSymbols/SFSafeSymbols
and click Next
. When asked about the version, leave the preselection and click Next
. In the following step, select SFSafeSymbols
as the package product and click Finish
unless you really want to use SFSafeSymbols-Dynamic
and know what you are doing.
To integrate using the standalone version of Apple's Swift Package Manager, add the following as a dependency to your Package.swift
:
.package(url: "https://github.com/SFSafeSymbols/SFSafeSymbols.git", .upToNextMajor(from: "2.1.3"))
After specifying "SFSafeSymbols"
as a dependency of the target in which you want to use it, run swift package update
.
Add the following entry to your Cartfile:
github "SFSafeSymbols/SFSafeSymbols" ~> 2.1.3
Then run carthage update
.
Add the following entry to your Podfile:
pod 'SFSafeSymbols', '~> 2.1.3'
Then run pod install
.
All the system symbols are accessible via the SFSymbol
type. They are named similar to Apple's names, but use a lower camel case style and prefix names with leading numbers with a _
character:
c.circle ~> SFSymbol.cCircle
e.circle.fill ~> SFSymbol.eCircleFill
11.circle.fill ~> SFSymbol._11CircleFill
A SF Symbol UIImage
can now be initialized using the SFSymbol
type. This image is already unwrapped, so you get a UIImage
instead of a UIImage?
:
UIImage(systemSymbol: .cCircle)
UIImage(systemSymbol: SFSymbol.eCircleFill)
UIImage(systemSymbol: ._11CircleFill, withConfiguration: /* Some UIImage.Configuration */)
A SF Symbol SwiftUI.Image
can also be initialized using the SFSymbol
type:
Image(systemSymbol: .cCircle)
Image(systemSymbol: SFSymbol.eCircleFill)
There are also SwiftUI.Label
initializers:
Label("MyText", systemSymbol: .cCircle)
Label(LocalizedStringKey("my.text"), systemSymbol: SFSymbol.eCircleFill)
... and interfaces for UIButton
:
let button = UIButton.systemButton(with: .cCircle, target: self, selector: #selector(testMethod))
button.setImage(.eCircleFill, for: .normal)
... and an initializer for UIApplicationShortcutItem
:
UIApplicationShortcutIcon(systemSymbol: .cCircle)
UIApplicationShortcutIcon(systemSymbol: SFSymbol.eCircleFill)
... and finally also an initializer for AppKit's NSImage
:
NSImage(systemSymbol: .cCircle)
NSImage(systemSymbol: SFSymbol.eCircleFill, accessibilityDescription: "some.description")
Contributions are very much welcome! See CONTRIBUTING.md for more information.
This library is released under the MIT License. See LICENSE for details.