├── .gitignore
├── .swiftpm
└── xcode
│ └── package.xcworkspace
│ └── contents.xcworkspacedata
├── Example-iOS
├── AppDelegate.swift
├── Assets.xcassets
│ ├── AppIcon.appiconset
│ │ └── Contents.json
│ └── Contents.json
├── Base.lproj
│ ├── LaunchScreen.storyboard
│ └── Main.storyboard
├── Info.plist
└── ViewController.swift
├── Example-macOS
├── AppDelegate.swift
├── Assets.xcassets
│ └── AppIcon.appiconset
│ │ └── Contents.json
├── Base.lproj
│ └── Main.storyboard
├── Example_macOS.entitlements
├── Info.plist
└── ViewController.swift
├── LICENSE
├── Package.swift
├── README.md
├── Sources
├── Info.plist
└── SwimplyLabel
│ └── SwimplyLabel.swift
├── SwimplyLabel.podspec
└── SwimplyLabel.xcodeproj
├── project.pbxproj
├── project.xcworkspace
├── contents.xcworkspacedata
└── xcshareddata
│ ├── IDEWorkspaceChecks.plist
│ └── swiftpm
│ └── Package.resolved
└── xcshareddata
└── xcschemes
├── SwimplyCache-iOS.xcscheme
├── SwimplyCache-macOS.xcscheme
└── SwimplyCache-tvOS.xcscheme
/.gitignore:
--------------------------------------------------------------------------------
1 | # Xcode
2 | #
3 | # gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
4 |
5 | ## Build generated
6 | build/
7 | DerivedData/
8 |
9 | ## Various settings
10 | *.pbxuser
11 | !default.pbxuser
12 | *.mode1v3
13 | !default.mode1v3
14 | *.mode2v3
15 | !default.mode2v3
16 | *.perspectivev3
17 | !default.perspectivev3
18 | xcuserdata/
19 |
20 | ## Other
21 | *.moved-aside
22 | *.xcuserstate
23 |
24 | ## Obj-C/Swift specific
25 | *.hmap
26 | *.ipa
27 | *.dSYM.zip
28 | *.dSYM
29 |
30 | # CocoaPods
31 | #
32 | # We recommend against adding the Pods directory to your .gitignore. However
33 | # you should judge for yourself, the pros and cons are mentioned at:
34 | # https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control
35 | #
36 | Pods/
37 |
38 | # Carthage
39 | #
40 | # Add this line if you want to avoid checking in source code from Carthage dependencies.
41 | # Carthage/Checkouts
42 |
43 | Carthage/Build
44 |
45 | # fastlane
46 | #
47 | # It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the
48 | # screenshots whenever they are needed.
49 | # For more information about the recommended setup visit:
50 | # https://github.com/fastlane/fastlane/blob/master/fastlane/docs/Gitignore.md
51 |
52 | fastlane/report.xml
53 | fastlane/screenshots
54 |
55 | # Code Injection
56 | #
57 | # After new code Injection tools there's a generated folder /iOSInjectionProject
58 | # https://github.com/johnno1962/injectionforxcode
59 |
60 | iOSInjectionProject/
61 |
62 | *.DS_Store
63 | .AppleDouble
64 | .LSOverride
65 |
66 | # Icon must end with two \r
67 | Icon
68 |
69 |
70 | # Thumbnails
71 | ._*
72 |
73 | # Files that might appear in the root of a volume
74 | .DocumentRevisions-V100
75 | .fseventsd
76 | .Spotlight-V100
77 | .TemporaryItems
78 | .Trashes
79 | .VolumeIcon.icns
80 | .com.apple.timemachine.donotpresent
81 |
82 | # Directories potentially created on remote AFP share
83 | .AppleDB
84 | .AppleDesktop
85 | Network Trash Folder
86 | Temporary Items
87 | .apdisk
88 |
89 | .idea
90 | */xcuserdata/*
91 | .swiftpm
92 | Package.resolved
93 |
--------------------------------------------------------------------------------
/.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Example-iOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import UIKit
2 |
3 | @UIApplicationMain
4 | class AppDelegate: UIResponder, UIApplicationDelegate {
5 | var window: UIWindow?
6 |
7 | func application(_: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
8 | return true
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/Example-iOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | },
88 | {
89 | "idiom" : "ios-marketing",
90 | "size" : "1024x1024",
91 | "scale" : "1x"
92 | }
93 | ],
94 | "info" : {
95 | "version" : 1,
96 | "author" : "xcode"
97 | }
98 | }
--------------------------------------------------------------------------------
/Example-iOS/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "version" : 1,
4 | "author" : "xcode"
5 | }
6 | }
--------------------------------------------------------------------------------
/Example-iOS/Base.lproj/LaunchScreen.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
--------------------------------------------------------------------------------
/Example-iOS/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
--------------------------------------------------------------------------------
/Example-iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | 1
21 | LSRequiresIPhoneOS
22 |
23 | UILaunchStoryboardName
24 | LaunchScreen
25 | UIMainStoryboardFile
26 | Main
27 | UIRequiredDeviceCapabilities
28 |
29 | armv7
30 |
31 | UISupportedInterfaceOrientations
32 |
33 | UIInterfaceOrientationPortrait
34 | UIInterfaceOrientationLandscapeLeft
35 | UIInterfaceOrientationLandscapeRight
36 |
37 | UISupportedInterfaceOrientations~ipad
38 |
39 | UIInterfaceOrientationPortrait
40 | UIInterfaceOrientationPortraitUpsideDown
41 | UIInterfaceOrientationLandscapeLeft
42 | UIInterfaceOrientationLandscapeRight
43 |
44 |
45 |
46 |
--------------------------------------------------------------------------------
/Example-iOS/ViewController.swift:
--------------------------------------------------------------------------------
1 | import SwimplyLabel
2 | import UIKit
3 |
4 | class ViewController: UIViewController {
5 | @IBOutlet var textLabel: SwimplyLabel?
6 |
7 | override func viewDidLoad() {
8 | super.viewDidLoad()
9 | textLabel?.numberOfLines = 0
10 | textLabel?.lineBreakMode = .byWordWrapping
11 | textLabel?.insets = .init(top: 30, left: 30, bottom: 30, right: 30)
12 | textLabel?.textBackground = UIColor(white: 0.7, alpha: 1.0)
13 | textLabel?.layer.backgroundColor = UIColor(white: 0.9, alpha: 1.0).cgColor
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/Example-macOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | import Cocoa
2 |
3 | @NSApplicationMain
4 | class AppDelegate: NSObject, NSApplicationDelegate {}
5 |
--------------------------------------------------------------------------------
/Example-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "mac",
5 | "size" : "16x16",
6 | "scale" : "1x"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "size" : "16x16",
11 | "scale" : "2x"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "size" : "32x32",
16 | "scale" : "1x"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "size" : "32x32",
21 | "scale" : "2x"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "size" : "128x128",
26 | "scale" : "1x"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "size" : "128x128",
31 | "scale" : "2x"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "size" : "256x256",
36 | "scale" : "1x"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "size" : "256x256",
41 | "scale" : "2x"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "size" : "512x512",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "size" : "512x512",
51 | "scale" : "2x"
52 | }
53 | ],
54 | "info" : {
55 | "version" : 1,
56 | "author" : "xcode"
57 | }
58 | }
--------------------------------------------------------------------------------
/Example-macOS/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
673 |
674 |
675 |
676 |
677 |
678 |
679 |
680 |
681 |
682 |
683 |
684 |
685 |
686 |
687 |
688 |
689 |
690 |
691 |
692 |
693 |
694 |
695 |
696 |
697 |
698 |
699 |
700 |
701 |
702 |
703 |
704 |
705 |
706 |
707 |
708 |
709 |
710 |
711 |
712 |
713 |
714 |
715 |
716 | Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.
717 |
718 |
719 |
720 |
721 |
722 |
723 |
724 |
725 |
726 |
727 |
728 |
729 |
730 |
731 |
732 |
733 |
734 |
735 |
736 |
737 |
--------------------------------------------------------------------------------
/Example-macOS/Example_macOS.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Example-macOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIconFile
10 |
11 | CFBundleIdentifier
12 | $(PRODUCT_BUNDLE_IDENTIFIER)
13 | CFBundleInfoDictionaryVersion
14 | 6.0
15 | CFBundleName
16 | $(PRODUCT_NAME)
17 | CFBundlePackageType
18 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
19 | CFBundleShortVersionString
20 | 1.0
21 | CFBundleVersion
22 | 1
23 | LSMinimumSystemVersion
24 | $(MACOSX_DEPLOYMENT_TARGET)
25 | NSHumanReadableCopyright
26 | Copyright © 2020 Dennis Oberhoff. All rights reserved.
27 | NSMainStoryboardFile
28 | Main
29 | NSPrincipalClass
30 | NSApplication
31 | NSSupportsAutomaticTermination
32 |
33 | NSSupportsSuddenTermination
34 |
35 |
36 |
37 |
--------------------------------------------------------------------------------
/Example-macOS/ViewController.swift:
--------------------------------------------------------------------------------
1 | import Cocoa
2 | import SwimplyLabel
3 |
4 | class ViewController: NSViewController {
5 | @IBOutlet var textLabel: SwimplyLabel?
6 |
7 | override func viewDidLoad() {
8 | super.viewDidLoad()
9 | textLabel?.numberOfLines = 0
10 | textLabel?.lineBreakMode = .byWordWrapping
11 | textLabel?.insets = .init(top: 30, left: 30, bottom: 30, right: 30)
12 | textLabel?.textBackground = NSColor(white: 0.7, alpha: 1.0)
13 | textLabel?.layer?.backgroundColor = NSColor(white: 0.9, alpha: 1.0).cgColor
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Dennis Oberhoff
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | // swift-tools-version:5.1
2 | // The swift-tools-version declares the minimum version of Swift required to build this package.
3 |
4 | import PackageDescription
5 |
6 | let package = Package(
7 | name: "SwimplyLabel",
8 | platforms: [
9 | .iOS(.v10), .macOS(.v10_12), .tvOS(.v10),
10 | ],
11 | products: [
12 | .library(
13 | name: "SwimplyLabel",
14 | targets: ["SwimplyLabel"]
15 | ),
16 | ],
17 | dependencies: [
18 | .package(url: "https://github.com/docterd/SwimplyCache.git", from: "1.0.1"),
19 | ],
20 | targets: [
21 | .target(
22 | name: "SwimplyLabel",
23 | dependencies: ["SwimplyCache"]
24 | ),
25 | ]
26 | )
27 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # SwimplyLabel
2 | SwimplyLabel is a UILabel replacement for macOS and iOS. It is currently used in my macOS App [DaftCloud](https://itunes.apple.com/us/app/daftcloud/id1320450034?mt=12).
3 | DOLabel is based on CoreText and draws it's content directly into a CALayer for a better performance.
4 |
5 | 
6 |
--------------------------------------------------------------------------------
/Sources/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | $(DEVELOPMENT_LANGUAGE)
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | $(PRODUCT_BUNDLE_PACKAGE_TYPE)
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleVersion
20 | $(CURRENT_PROJECT_VERSION)
21 |
22 |
23 |
--------------------------------------------------------------------------------
/Sources/SwimplyLabel/SwimplyLabel.swift:
--------------------------------------------------------------------------------
1 | import CoreText
2 | import Foundation
3 | import SwimplyCache
4 |
5 | #if os(iOS) || os(tvOS)
6 | import UIKit
7 | public typealias Rect = CGRect
8 | public typealias Size = CGSize
9 | public typealias EdgeInsets = UIEdgeInsets
10 | public typealias Font = UIFont
11 | public typealias View = UIView
12 | public typealias Color = UIColor
13 | public typealias LineBreakMode = NSLineBreakMode
14 | public typealias LayoutPriority = UILayoutPriority
15 | #elseif os(OSX)
16 | import AppKit
17 | public typealias Rect = NSRect
18 | public typealias Size = NSSize
19 | public typealias EdgeInsets = NSEdgeInsets
20 | public typealias Font = NSFont
21 | public typealias View = NSView
22 | public typealias Color = NSColor
23 | public typealias LineBreakMode = NSLineBreakMode
24 | public typealias LayoutPriority = NSLayoutConstraint.Priority
25 | #endif
26 |
27 | @IBDesignable open class SwimplyLabel: View {
28 | private struct CacheKey: Hashable {
29 | let text: String?
30 | let boundWidth: CGFloat
31 | let alignment: NSTextAlignment
32 | let lineSpacing: CGFloat
33 | let kerning: CGFloat
34 | let pointSize: CGFloat
35 | let insets: SwimplyLabel.ContentEdgeInsets
36 | let preferredMaxLayoutWidth: CGFloat?
37 | let numberOfLines: Int
38 | }
39 |
40 | private struct CacheItem {
41 | let size: CGSize
42 | let drawingRect: CGRect
43 | }
44 |
45 | private struct ContentEdgeInsets: Hashable {
46 | let top: CGFloat
47 | let left: CGFloat
48 | let right: CGFloat
49 | let bottom: CGFloat
50 | }
51 |
52 | private static let sharedCache = SwimplyCache()
53 | private var shouldAntialias = true
54 | private var shouldSmoothFonts = true
55 | private var shouldSubpixelPositionFonts = false
56 | private var shouldSubpixelQuantizeFonts = false
57 | private var contentInsets: SwimplyLabel.ContentEdgeInsets = .init(top: 0, left: 0, right: 0, bottom: 0)
58 |
59 | override open var intrinsicContentSize: Size {
60 | return drawingRect.size
61 | }
62 |
63 | private var labelLayer: DOLayer? {
64 | return layer as? DOLayer
65 | }
66 |
67 | private var cacheKey: CacheKey {
68 | return CacheKey(text: text,
69 | boundWidth: bounds.width,
70 | alignment: textAlignment,
71 | lineSpacing: lineSpacing, kerning: kerning,
72 | pointSize: font.pointSize,
73 | insets: contentInsets,
74 | preferredMaxLayoutWidth: preferredMaxLayoutWidth,
75 | numberOfLines: numberOfLines)
76 | }
77 |
78 | private var defaultAttributedDict: [NSAttributedString.Key: Any] {
79 | var attributes = [
80 | .font: font,
81 | .foregroundColor: textColor,
82 | .backgroundColor: textBackground,
83 | .paragraphStyle: drawingParagraphStyle,
84 | .kern: kerning,
85 | ] as [NSAttributedString.Key: Any]
86 |
87 | if let shadow = textShadow {
88 | attributes[.shadow] = shadow
89 | }
90 | return attributes
91 | }
92 |
93 | private var drawingParagraphStyle: NSMutableParagraphStyle {
94 | let style = NSMutableParagraphStyle()
95 | style.alignment = textAlignment
96 | style.lineBreakMode = lineBreakMode
97 | style.lineSpacing = lineSpacing
98 | return style
99 | }
100 |
101 | private var drawingRect: CGRect = .zero {
102 | didSet {
103 | if oldValue == drawingRect { return }
104 | invalidateIntrinsicContentSize()
105 | }
106 | }
107 |
108 | @IBInspectable open var text: String? {
109 | didSet {
110 | if oldValue == text { return }
111 | needsContentDisplay()
112 | }
113 | }
114 |
115 | @IBInspectable open var textColor = Color.labelColor {
116 | didSet {
117 | if oldValue == textColor { return }
118 | needsContentDisplay()
119 | }
120 | }
121 |
122 | @IBInspectable open var textBackground = Color.clear {
123 | didSet {
124 | if oldValue == textBackground { return }
125 | self.needsContentDisplay()
126 | }
127 | }
128 |
129 | open var textShadow: NSShadow? {
130 | didSet {
131 | if oldValue == textShadow { return }
132 | needsContentDisplay()
133 | }
134 | }
135 |
136 | @IBInspectable open var font = Font.systemFont(ofSize: 14) {
137 | didSet {
138 | if oldValue == font { return }
139 | needsContentDisplay()
140 | }
141 | }
142 |
143 | open var textAlignment: NSTextAlignment = .left {
144 | didSet {
145 | if oldValue == textAlignment { return }
146 | needsContentDisplay()
147 | }
148 | }
149 |
150 | @IBInspectable open var numberOfLines = 1 {
151 | didSet {
152 | if oldValue == numberOfLines { return }
153 | needsContentDisplay()
154 | }
155 | }
156 |
157 | open var preferredMaxLayoutWidth: CGFloat? {
158 | didSet {
159 | if oldValue == preferredMaxLayoutWidth { return }
160 | needsContentDisplay()
161 | }
162 | }
163 |
164 | @IBInspectable open var lineSpacing: CGFloat = 0.0 {
165 | didSet {
166 | if oldValue == lineSpacing { return }
167 | needsContentDisplay()
168 | }
169 | }
170 |
171 | @IBInspectable open var kerning: CGFloat = 0.0 {
172 | didSet {
173 | if oldValue == kerning { return }
174 | needsContentDisplay()
175 | }
176 | }
177 |
178 | @IBInspectable open var lineBreakMode: LineBreakMode = .byTruncatingTail {
179 | didSet {
180 | if oldValue == lineBreakMode { return }
181 | needsContentDisplay()
182 | }
183 | }
184 |
185 | @IBInspectable open var insets: EdgeInsets {
186 | set {
187 | contentInsets = .init(top: newValue.top, left: newValue.left, right: newValue.right, bottom: newValue.bottom)
188 | } get {
189 | EdgeInsets(top: contentInsets.top, left: contentInsets.left, bottom: contentInsets.bottom, right: contentInsets.right)
190 | }
191 | }
192 |
193 | override public init(frame: Rect) {
194 | super.init(frame: frame)
195 | commonInit()
196 | }
197 |
198 | public required init?(coder: NSCoder) {
199 | super.init(coder: coder)
200 | commonInit()
201 | }
202 |
203 | override open func awakeFromNib() {
204 | super.awakeFromNib()
205 | commonInit()
206 | }
207 | }
208 |
209 | private extension SwimplyLabel {
210 | func commonInit() {
211 | #if os(iOS)
212 | let isRetina = UIScreen.main.scale >= 2.0
213 | shouldSubpixelPositionFonts = !isRetina
214 | shouldSubpixelQuantizeFonts = !isRetina
215 | layer.contentsScale = UIScreen.main.scale
216 | layer.rasterizationScale = UIScreen.main.scale
217 | #elseif os(OSX)
218 | wantsLayer = true
219 | canDrawConcurrently = true
220 | layerContentsRedrawPolicy = .onSetNeedsDisplay
221 | #endif
222 |
223 | setContentHuggingPriority(.defaultLow, for: .horizontal)
224 | setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
225 |
226 | labelLayer?.drawsAsynchronously = true
227 | labelLayer?.needsDisplayOnBoundsChange = true
228 | labelLayer?.delegate = self
229 | }
230 |
231 | func draw(context: CGContext) {
232 | calculateContentSize()
233 |
234 | context.textMatrix = .identity
235 | context.setAllowsAntialiasing(true)
236 | context.setAllowsFontSmoothing(true)
237 | context.setAllowsFontSubpixelPositioning(true)
238 | context.setAllowsFontSubpixelQuantization(true)
239 |
240 | context.setShouldAntialias(shouldAntialias)
241 | context.setShouldSmoothFonts(shouldSmoothFonts)
242 | context.setShouldSubpixelPositionFonts(shouldSubpixelPositionFonts)
243 | context.setShouldSubpixelQuantizeFonts(shouldSubpixelQuantizeFonts)
244 |
245 | context.translateBy(x: 0, y: bounds.height)
246 | context.scaleBy(x: 1.0, y: -1.0)
247 |
248 | let height = bounds.height - insets.bottom - insets.top
249 | let width = bounds.width - insets.left - insets.right
250 | let rect = CGRect(x: insets.left, y: insets.bottom, width: width, height: height)
251 | let drawingPath = CGPath(rect: rect, transform: nil)
252 |
253 | let attributedString = NSAttributedString(string: text ?? "", attributes: defaultAttributedDict)
254 | let setter = CTFramesetterCreateWithAttributedString(attributedString as CFAttributedString)
255 | let frame = CTFramesetterCreateFrame(setter, CFRangeMake(0, attributedString.length), drawingPath, nil)
256 | CTFrameDraw(frame, context)
257 | }
258 |
259 | func calculateContentSize() {
260 | if text == nil || text?.isEmpty == true {
261 | drawingRect = .zero
262 | return
263 | }
264 |
265 | if let cacheItem = SwimplyLabel.sharedCache.value(forKey: cacheKey) {
266 | drawingRect = cacheItem.drawingRect
267 | return
268 | }
269 |
270 | let attributedString = NSMutableAttributedString(string: text ?? "", attributes: defaultAttributedDict)
271 | let setter = CTFramesetterCreateWithAttributedString(attributedString as CFAttributedString)
272 | let constrainedWidth: CGFloat = numberOfLines == 1 ? .greatestFiniteMagnitude : (preferredMaxLayoutWidth ?? bounds.width)
273 | var size = CTFramesetterSuggestFrameSizeWithConstraints(setter, CFRange(location: 0, length: attributedString.length), nil,
274 | CGSize(width: constrainedWidth, height: .greatestFiniteMagnitude), nil)
275 |
276 | if numberOfLines >= 1 {
277 | let path = CGPath(rect: CGRect(x: 0, y: 0, width: size.width, height: size.height), transform: nil)
278 | let ctFrame = CTFramesetterCreateFrame(setter, CFRangeMake(0, 0), path, nil)
279 | let currentLines = CFArrayGetCount(CTFrameGetLines(ctFrame)) as Int
280 | let calculatedHeight = (size.height / CGFloat(currentLines)) * CGFloat(numberOfLines)
281 | size.height = min(size.height, calculatedHeight)
282 | }
283 |
284 | drawingRect = CGRect(x: 0, y: 0, width: ceil(size.width + insets.left + insets.right),
285 | height: ceil(size.height + insets.top + insets.bottom))
286 |
287 | let cacheItem = CacheItem(size: size, drawingRect: drawingRect)
288 | SwimplyLabel.sharedCache.setValue(cacheItem, forKey: cacheKey)
289 | }
290 |
291 | func needsContentDisplay() {
292 | calculateContentSize()
293 | labelLayer?.setNeedsDisplay()
294 | }
295 | }
296 |
297 | private extension SwimplyLabel {
298 | class DOLayer: CALayer {
299 | override func draw(in ctx: CGContext) {
300 | ctx.saveGState()
301 | delegate?.draw?(self, in: ctx)
302 | ctx.restoreGState()
303 | }
304 | }
305 | }
306 |
307 | #if os(OSX)
308 | extension SwimplyLabel: CALayerDelegate {
309 | public func draw(_: CALayer, in ctx: CGContext) {
310 | draw(context: ctx)
311 | }
312 |
313 | override open func makeBackingLayer() -> CALayer {
314 | return DOLayer()
315 | }
316 |
317 | override open func viewDidChangeBackingProperties() {
318 | super.viewDidChangeBackingProperties()
319 | let scale = window?.backingScaleFactor ?? 1.0
320 | let isRetina = scale >= 2.0
321 | shouldSmoothFonts = true
322 | shouldAntialias = true
323 | shouldSubpixelPositionFonts = !isRetina
324 | shouldSubpixelQuantizeFonts = !isRetina
325 | layer?.contentsScale = scale
326 | layer?.rasterizationScale = scale
327 | layer?.setNeedsDisplay()
328 | }
329 |
330 | override open var isFlipped: Bool {
331 | return true
332 | }
333 | }
334 | #endif
335 |
336 | #if os(iOS) || os(tvOS)
337 | extension SwimplyLabel {
338 | override open func draw(_: CALayer, in ctx: CGContext) {
339 | draw(context: ctx)
340 | }
341 |
342 | override public static var layerClass: AnyClass {
343 | return DOLayer.self
344 | }
345 | }
346 | #endif
347 |
--------------------------------------------------------------------------------
/SwimplyLabel.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = "SwimplyLabel"
3 | s.version = "2.1"
4 | s.summary = "UILabel replacement for iOS and macOS"
5 | s.homepage = "https://github.com/docterd/SwimplyLabel"
6 | s.license = { :type => "MIT" }
7 | s.author = { "Dennis Oberhoff" => "dennis@obrhoff.de" }
8 | s.source = { :git => "https://github.com/docterd/SwimplyLabel.git", :tag => "2.1"}
9 | s.source_files = "Sources/SwimplyLabel/SwimplyLabel.swift"
10 | s.osx.deployment_target = '10.12'
11 | s.osx.framework = 'AppKit'
12 | s.ios.deployment_target = "10.0"
13 | s.ios.framework = 'UIKit'
14 | s.tvos.deployment_target = "10.0"
15 | s.tvos.framework = 'UIKit'
16 | s.swift_version = '5.0'
17 | s.source = { :git => "https://github.com/docterd/swimplycache.git", :tag => "1.0.0"}
18 | s.dependency 'SwimplyCache', "= 1.0.0"
19 | end
20 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 52;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 79C10FB523F590460031860C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C10FB423F590460031860C /* AppDelegate.swift */; };
11 | 79C10FB923F590460031860C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C10FB823F590460031860C /* ViewController.swift */; };
12 | 79C10FBC23F590460031860C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 79C10FBA23F590460031860C /* Main.storyboard */; };
13 | 79C10FBE23F590470031860C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79C10FBD23F590470031860C /* Assets.xcassets */; };
14 | 79C10FC123F590470031860C /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 79C10FBF23F590470031860C /* LaunchScreen.storyboard */; };
15 | 79C10FC923F590B20031860C /* SwimplyLabel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7933919B23F58ED70080AD66 /* SwimplyLabel.framework */; };
16 | 79C10FCA23F590B20031860C /* SwimplyLabel.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 7933919B23F58ED70080AD66 /* SwimplyLabel.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
17 | 79C10FD523F591ED0031860C /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C10FD423F591ED0031860C /* AppDelegate.swift */; };
18 | 79C10FD723F591ED0031860C /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79C10FD623F591ED0031860C /* ViewController.swift */; };
19 | 79C10FD923F591EE0031860C /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 79C10FD823F591EE0031860C /* Assets.xcassets */; };
20 | 79C10FDC23F591EE0031860C /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 79C10FDA23F591EE0031860C /* Main.storyboard */; };
21 | 79C10FE223F5920B0031860C /* SwimplyLabel.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 79C10F9423F58FBC0031860C /* SwimplyLabel.framework */; };
22 | 79C10FE323F5920B0031860C /* SwimplyLabel.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 79C10F9423F58FBC0031860C /* SwimplyLabel.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
23 | E1482E3E246FABC500FD62CA /* SwimplyCache in Frameworks */ = {isa = PBXBuildFile; productRef = E1482E3D246FABC500FD62CA /* SwimplyCache */; };
24 | E1482E44246FAC5200FD62CA /* SwimplyCache in Frameworks */ = {isa = PBXBuildFile; productRef = E1482E43246FAC5200FD62CA /* SwimplyCache */; };
25 | E1482E46246FAC6500FD62CA /* SwimplyCache in Frameworks */ = {isa = PBXBuildFile; productRef = E1482E45246FAC6500FD62CA /* SwimplyCache */; };
26 | E19619C3246FB42900DA79FF /* SwimplyLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19619C2246FB39F00DA79FF /* SwimplyLabel.swift */; };
27 | E19619C4246FB42A00DA79FF /* SwimplyLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19619C2246FB39F00DA79FF /* SwimplyLabel.swift */; };
28 | E19619C5246FB42A00DA79FF /* SwimplyLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = E19619C2246FB39F00DA79FF /* SwimplyLabel.swift */; };
29 | /* End PBXBuildFile section */
30 |
31 | /* Begin PBXContainerItemProxy section */
32 | 79C10FC623F590AC0031860C /* PBXContainerItemProxy */ = {
33 | isa = PBXContainerItemProxy;
34 | containerPortal = 7933919223F58ED70080AD66 /* Project object */;
35 | proxyType = 1;
36 | remoteGlobalIDString = 7933919A23F58ED70080AD66;
37 | remoteInfo = "DOLabel-iOS";
38 | };
39 | 79C10FCB23F590B20031860C /* PBXContainerItemProxy */ = {
40 | isa = PBXContainerItemProxy;
41 | containerPortal = 7933919223F58ED70080AD66 /* Project object */;
42 | proxyType = 1;
43 | remoteGlobalIDString = 7933919A23F58ED70080AD66;
44 | remoteInfo = "DOLabel-iOS";
45 | };
46 | 79C10FE423F5920B0031860C /* PBXContainerItemProxy */ = {
47 | isa = PBXContainerItemProxy;
48 | containerPortal = 7933919223F58ED70080AD66 /* Project object */;
49 | proxyType = 1;
50 | remoteGlobalIDString = 79C10F8B23F58FBC0031860C;
51 | remoteInfo = "DOLabel-macOS";
52 | };
53 | /* End PBXContainerItemProxy section */
54 |
55 | /* Begin PBXCopyFilesBuildPhase section */
56 | 79C10FCD23F590B20031860C /* Embed Frameworks */ = {
57 | isa = PBXCopyFilesBuildPhase;
58 | buildActionMask = 2147483647;
59 | dstPath = "";
60 | dstSubfolderSpec = 10;
61 | files = (
62 | 79C10FCA23F590B20031860C /* SwimplyLabel.framework in Embed Frameworks */,
63 | );
64 | name = "Embed Frameworks";
65 | runOnlyForDeploymentPostprocessing = 0;
66 | };
67 | 79C10FE623F5920B0031860C /* Embed Frameworks */ = {
68 | isa = PBXCopyFilesBuildPhase;
69 | buildActionMask = 2147483647;
70 | dstPath = "";
71 | dstSubfolderSpec = 10;
72 | files = (
73 | 79C10FE323F5920B0031860C /* SwimplyLabel.framework in Embed Frameworks */,
74 | );
75 | name = "Embed Frameworks";
76 | runOnlyForDeploymentPostprocessing = 0;
77 | };
78 | /* End PBXCopyFilesBuildPhase section */
79 |
80 | /* Begin PBXFileReference section */
81 | 7933919B23F58ED70080AD66 /* SwimplyLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwimplyLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
82 | 7933919F23F58ED70080AD66 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist; name = Info.plist; path = Sources/Info.plist; sourceTree = ""; };
83 | 79C10F8923F58FA50031860C /* SwimplyLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwimplyLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
84 | 79C10F9423F58FBC0031860C /* SwimplyLabel.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = SwimplyLabel.framework; sourceTree = BUILT_PRODUCTS_DIR; };
85 | 79C10FB223F590460031860C /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
86 | 79C10FB423F590460031860C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
87 | 79C10FB823F590460031860C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
88 | 79C10FBB23F590460031860C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
89 | 79C10FBD23F590470031860C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
90 | 79C10FC023F590470031860C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; };
91 | 79C10FC223F590470031860C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
92 | 79C10FD223F591ED0031860C /* Example-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
93 | 79C10FD423F591ED0031860C /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
94 | 79C10FD623F591ED0031860C /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
95 | 79C10FD823F591EE0031860C /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
96 | 79C10FDB23F591EE0031860C /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
97 | 79C10FDD23F591EE0031860C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
98 | 79C10FDE23F591EE0031860C /* Example_macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Example_macOS.entitlements; sourceTree = ""; };
99 | E19619C2246FB39F00DA79FF /* SwimplyLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = SwimplyLabel.swift; path = Sources/SwimplyLabel/SwimplyLabel.swift; sourceTree = SOURCE_ROOT; };
100 | /* End PBXFileReference section */
101 |
102 | /* Begin PBXFrameworksBuildPhase section */
103 | 7933919823F58ED70080AD66 /* Frameworks */ = {
104 | isa = PBXFrameworksBuildPhase;
105 | buildActionMask = 2147483647;
106 | files = (
107 | E1482E3E246FABC500FD62CA /* SwimplyCache in Frameworks */,
108 | );
109 | runOnlyForDeploymentPostprocessing = 0;
110 | };
111 | 79C10F8423F58FA50031860C /* Frameworks */ = {
112 | isa = PBXFrameworksBuildPhase;
113 | buildActionMask = 2147483647;
114 | files = (
115 | E1482E46246FAC6500FD62CA /* SwimplyCache in Frameworks */,
116 | );
117 | runOnlyForDeploymentPostprocessing = 0;
118 | };
119 | 79C10F8F23F58FBC0031860C /* Frameworks */ = {
120 | isa = PBXFrameworksBuildPhase;
121 | buildActionMask = 2147483647;
122 | files = (
123 | E1482E44246FAC5200FD62CA /* SwimplyCache in Frameworks */,
124 | );
125 | runOnlyForDeploymentPostprocessing = 0;
126 | };
127 | 79C10FAF23F590460031860C /* Frameworks */ = {
128 | isa = PBXFrameworksBuildPhase;
129 | buildActionMask = 2147483647;
130 | files = (
131 | 79C10FC923F590B20031860C /* SwimplyLabel.framework in Frameworks */,
132 | );
133 | runOnlyForDeploymentPostprocessing = 0;
134 | };
135 | 79C10FCF23F591ED0031860C /* Frameworks */ = {
136 | isa = PBXFrameworksBuildPhase;
137 | buildActionMask = 2147483647;
138 | files = (
139 | 79C10FE223F5920B0031860C /* SwimplyLabel.framework in Frameworks */,
140 | );
141 | runOnlyForDeploymentPostprocessing = 0;
142 | };
143 | /* End PBXFrameworksBuildPhase section */
144 |
145 | /* Begin PBXGroup section */
146 | 7933919123F58ED70080AD66 = {
147 | isa = PBXGroup;
148 | children = (
149 | 7933919D23F58ED70080AD66 /* SwimplyLabel */,
150 | 79C10FB323F590460031860C /* Example-iOS */,
151 | 79C10FD323F591ED0031860C /* Example-macOS */,
152 | 7933919C23F58ED70080AD66 /* Products */,
153 | 79C10FC823F590B20031860C /* Frameworks */,
154 | );
155 | sourceTree = "";
156 | };
157 | 7933919C23F58ED70080AD66 /* Products */ = {
158 | isa = PBXGroup;
159 | children = (
160 | 7933919B23F58ED70080AD66 /* SwimplyLabel.framework */,
161 | 79C10F8923F58FA50031860C /* SwimplyLabel.framework */,
162 | 79C10F9423F58FBC0031860C /* SwimplyLabel.framework */,
163 | 79C10FB223F590460031860C /* Example-iOS.app */,
164 | 79C10FD223F591ED0031860C /* Example-macOS.app */,
165 | );
166 | name = Products;
167 | sourceTree = "";
168 | };
169 | 7933919D23F58ED70080AD66 /* SwimplyLabel */ = {
170 | isa = PBXGroup;
171 | children = (
172 | 7933919F23F58ED70080AD66 /* Info.plist */,
173 | E19619C2246FB39F00DA79FF /* SwimplyLabel.swift */,
174 | );
175 | path = SwimplyLabel;
176 | sourceTree = "";
177 | };
178 | 79C10FB323F590460031860C /* Example-iOS */ = {
179 | isa = PBXGroup;
180 | children = (
181 | 79C10FB423F590460031860C /* AppDelegate.swift */,
182 | 79C10FB823F590460031860C /* ViewController.swift */,
183 | 79C10FBA23F590460031860C /* Main.storyboard */,
184 | 79C10FBD23F590470031860C /* Assets.xcassets */,
185 | 79C10FBF23F590470031860C /* LaunchScreen.storyboard */,
186 | 79C10FC223F590470031860C /* Info.plist */,
187 | );
188 | path = "Example-iOS";
189 | sourceTree = "";
190 | };
191 | 79C10FC823F590B20031860C /* Frameworks */ = {
192 | isa = PBXGroup;
193 | children = (
194 | );
195 | name = Frameworks;
196 | sourceTree = "";
197 | };
198 | 79C10FD323F591ED0031860C /* Example-macOS */ = {
199 | isa = PBXGroup;
200 | children = (
201 | 79C10FD423F591ED0031860C /* AppDelegate.swift */,
202 | 79C10FD623F591ED0031860C /* ViewController.swift */,
203 | 79C10FD823F591EE0031860C /* Assets.xcassets */,
204 | 79C10FDA23F591EE0031860C /* Main.storyboard */,
205 | 79C10FDD23F591EE0031860C /* Info.plist */,
206 | 79C10FDE23F591EE0031860C /* Example_macOS.entitlements */,
207 | );
208 | path = "Example-macOS";
209 | sourceTree = "";
210 | };
211 | /* End PBXGroup section */
212 |
213 | /* Begin PBXHeadersBuildPhase section */
214 | 7933919623F58ED70080AD66 /* Headers */ = {
215 | isa = PBXHeadersBuildPhase;
216 | buildActionMask = 2147483647;
217 | files = (
218 | );
219 | runOnlyForDeploymentPostprocessing = 0;
220 | };
221 | 79C10F8123F58FA50031860C /* Headers */ = {
222 | isa = PBXHeadersBuildPhase;
223 | buildActionMask = 2147483647;
224 | files = (
225 | );
226 | runOnlyForDeploymentPostprocessing = 0;
227 | };
228 | 79C10F8C23F58FBC0031860C /* Headers */ = {
229 | isa = PBXHeadersBuildPhase;
230 | buildActionMask = 2147483647;
231 | files = (
232 | );
233 | runOnlyForDeploymentPostprocessing = 0;
234 | };
235 | /* End PBXHeadersBuildPhase section */
236 |
237 | /* Begin PBXNativeTarget section */
238 | 7933919A23F58ED70080AD66 /* SwimplyLabel-iOS */ = {
239 | isa = PBXNativeTarget;
240 | buildConfigurationList = 793391A323F58ED70080AD66 /* Build configuration list for PBXNativeTarget "SwimplyLabel-iOS" */;
241 | buildPhases = (
242 | 7933919623F58ED70080AD66 /* Headers */,
243 | 7933919723F58ED70080AD66 /* Sources */,
244 | 7933919823F58ED70080AD66 /* Frameworks */,
245 | 7933919923F58ED70080AD66 /* Resources */,
246 | );
247 | buildRules = (
248 | );
249 | dependencies = (
250 | );
251 | name = "SwimplyLabel-iOS";
252 | packageProductDependencies = (
253 | E1482E3D246FABC500FD62CA /* SwimplyCache */,
254 | );
255 | productName = DOLabel;
256 | productReference = 7933919B23F58ED70080AD66 /* SwimplyLabel.framework */;
257 | productType = "com.apple.product-type.framework";
258 | };
259 | 79C10F8023F58FA50031860C /* SwimplyLabel-tvOS */ = {
260 | isa = PBXNativeTarget;
261 | buildConfigurationList = 79C10F8623F58FA50031860C /* Build configuration list for PBXNativeTarget "SwimplyLabel-tvOS" */;
262 | buildPhases = (
263 | 79C10F8123F58FA50031860C /* Headers */,
264 | 79C10F8223F58FA50031860C /* Sources */,
265 | 79C10F8423F58FA50031860C /* Frameworks */,
266 | 79C10F8523F58FA50031860C /* Resources */,
267 | );
268 | buildRules = (
269 | );
270 | dependencies = (
271 | );
272 | name = "SwimplyLabel-tvOS";
273 | packageProductDependencies = (
274 | E1482E45246FAC6500FD62CA /* SwimplyCache */,
275 | );
276 | productName = DOLabel;
277 | productReference = 79C10F8923F58FA50031860C /* SwimplyLabel.framework */;
278 | productType = "com.apple.product-type.framework";
279 | };
280 | 79C10F8B23F58FBC0031860C /* SwimplyLabel-macOS */ = {
281 | isa = PBXNativeTarget;
282 | buildConfigurationList = 79C10F9123F58FBC0031860C /* Build configuration list for PBXNativeTarget "SwimplyLabel-macOS" */;
283 | buildPhases = (
284 | 79C10F8C23F58FBC0031860C /* Headers */,
285 | 79C10F8D23F58FBC0031860C /* Sources */,
286 | 79C10F8F23F58FBC0031860C /* Frameworks */,
287 | 79C10F9023F58FBC0031860C /* Resources */,
288 | );
289 | buildRules = (
290 | );
291 | dependencies = (
292 | );
293 | name = "SwimplyLabel-macOS";
294 | packageProductDependencies = (
295 | E1482E43246FAC5200FD62CA /* SwimplyCache */,
296 | );
297 | productName = DOLabel;
298 | productReference = 79C10F9423F58FBC0031860C /* SwimplyLabel.framework */;
299 | productType = "com.apple.product-type.framework";
300 | };
301 | 79C10FB123F590460031860C /* Example-iOS */ = {
302 | isa = PBXNativeTarget;
303 | buildConfigurationList = 79C10FC323F590470031860C /* Build configuration list for PBXNativeTarget "Example-iOS" */;
304 | buildPhases = (
305 | 79C10FAE23F590460031860C /* Sources */,
306 | 79C10FAF23F590460031860C /* Frameworks */,
307 | 79C10FB023F590460031860C /* Resources */,
308 | 79C10FCD23F590B20031860C /* Embed Frameworks */,
309 | );
310 | buildRules = (
311 | );
312 | dependencies = (
313 | 79C10FC723F590AC0031860C /* PBXTargetDependency */,
314 | 79C10FCC23F590B20031860C /* PBXTargetDependency */,
315 | );
316 | name = "Example-iOS";
317 | productName = "Example-iOS";
318 | productReference = 79C10FB223F590460031860C /* Example-iOS.app */;
319 | productType = "com.apple.product-type.application";
320 | };
321 | 79C10FD123F591ED0031860C /* Example-macOS */ = {
322 | isa = PBXNativeTarget;
323 | buildConfigurationList = 79C10FDF23F591EE0031860C /* Build configuration list for PBXNativeTarget "Example-macOS" */;
324 | buildPhases = (
325 | 79C10FCE23F591ED0031860C /* Sources */,
326 | 79C10FCF23F591ED0031860C /* Frameworks */,
327 | 79C10FD023F591ED0031860C /* Resources */,
328 | 79C10FE623F5920B0031860C /* Embed Frameworks */,
329 | );
330 | buildRules = (
331 | );
332 | dependencies = (
333 | 79C10FE523F5920B0031860C /* PBXTargetDependency */,
334 | );
335 | name = "Example-macOS";
336 | productName = "Example-macOS";
337 | productReference = 79C10FD223F591ED0031860C /* Example-macOS.app */;
338 | productType = "com.apple.product-type.application";
339 | };
340 | /* End PBXNativeTarget section */
341 |
342 | /* Begin PBXProject section */
343 | 7933919223F58ED70080AD66 /* Project object */ = {
344 | isa = PBXProject;
345 | attributes = {
346 | LastSwiftUpdateCheck = 1130;
347 | LastUpgradeCheck = 1140;
348 | ORGANIZATIONNAME = "Dennis Oberhoff";
349 | TargetAttributes = {
350 | 7933919A23F58ED70080AD66 = {
351 | CreatedOnToolsVersion = 11.3.1;
352 | LastSwiftMigration = 1130;
353 | };
354 | 79C10FB123F590460031860C = {
355 | CreatedOnToolsVersion = 11.3.1;
356 | };
357 | 79C10FD123F591ED0031860C = {
358 | CreatedOnToolsVersion = 11.3.1;
359 | };
360 | };
361 | };
362 | buildConfigurationList = 7933919523F58ED70080AD66 /* Build configuration list for PBXProject "SwimplyLabel" */;
363 | compatibilityVersion = "Xcode 9.3";
364 | developmentRegion = en;
365 | hasScannedForEncodings = 0;
366 | knownRegions = (
367 | en,
368 | Base,
369 | );
370 | mainGroup = 7933919123F58ED70080AD66;
371 | packageReferences = (
372 | E1482E3C246FABC500FD62CA /* XCRemoteSwiftPackageReference "SwimplyCache" */,
373 | );
374 | productRefGroup = 7933919C23F58ED70080AD66 /* Products */;
375 | projectDirPath = "";
376 | projectRoot = "";
377 | targets = (
378 | 7933919A23F58ED70080AD66 /* SwimplyLabel-iOS */,
379 | 79C10F8023F58FA50031860C /* SwimplyLabel-tvOS */,
380 | 79C10F8B23F58FBC0031860C /* SwimplyLabel-macOS */,
381 | 79C10FB123F590460031860C /* Example-iOS */,
382 | 79C10FD123F591ED0031860C /* Example-macOS */,
383 | );
384 | };
385 | /* End PBXProject section */
386 |
387 | /* Begin PBXResourcesBuildPhase section */
388 | 7933919923F58ED70080AD66 /* Resources */ = {
389 | isa = PBXResourcesBuildPhase;
390 | buildActionMask = 2147483647;
391 | files = (
392 | );
393 | runOnlyForDeploymentPostprocessing = 0;
394 | };
395 | 79C10F8523F58FA50031860C /* Resources */ = {
396 | isa = PBXResourcesBuildPhase;
397 | buildActionMask = 2147483647;
398 | files = (
399 | );
400 | runOnlyForDeploymentPostprocessing = 0;
401 | };
402 | 79C10F9023F58FBC0031860C /* Resources */ = {
403 | isa = PBXResourcesBuildPhase;
404 | buildActionMask = 2147483647;
405 | files = (
406 | );
407 | runOnlyForDeploymentPostprocessing = 0;
408 | };
409 | 79C10FB023F590460031860C /* Resources */ = {
410 | isa = PBXResourcesBuildPhase;
411 | buildActionMask = 2147483647;
412 | files = (
413 | 79C10FC123F590470031860C /* LaunchScreen.storyboard in Resources */,
414 | 79C10FBE23F590470031860C /* Assets.xcassets in Resources */,
415 | 79C10FBC23F590460031860C /* Main.storyboard in Resources */,
416 | );
417 | runOnlyForDeploymentPostprocessing = 0;
418 | };
419 | 79C10FD023F591ED0031860C /* Resources */ = {
420 | isa = PBXResourcesBuildPhase;
421 | buildActionMask = 2147483647;
422 | files = (
423 | 79C10FD923F591EE0031860C /* Assets.xcassets in Resources */,
424 | 79C10FDC23F591EE0031860C /* Main.storyboard in Resources */,
425 | );
426 | runOnlyForDeploymentPostprocessing = 0;
427 | };
428 | /* End PBXResourcesBuildPhase section */
429 |
430 | /* Begin PBXSourcesBuildPhase section */
431 | 7933919723F58ED70080AD66 /* Sources */ = {
432 | isa = PBXSourcesBuildPhase;
433 | buildActionMask = 2147483647;
434 | files = (
435 | E19619C5246FB42A00DA79FF /* SwimplyLabel.swift in Sources */,
436 | );
437 | runOnlyForDeploymentPostprocessing = 0;
438 | };
439 | 79C10F8223F58FA50031860C /* Sources */ = {
440 | isa = PBXSourcesBuildPhase;
441 | buildActionMask = 2147483647;
442 | files = (
443 | E19619C4246FB42A00DA79FF /* SwimplyLabel.swift in Sources */,
444 | );
445 | runOnlyForDeploymentPostprocessing = 0;
446 | };
447 | 79C10F8D23F58FBC0031860C /* Sources */ = {
448 | isa = PBXSourcesBuildPhase;
449 | buildActionMask = 2147483647;
450 | files = (
451 | E19619C3246FB42900DA79FF /* SwimplyLabel.swift in Sources */,
452 | );
453 | runOnlyForDeploymentPostprocessing = 0;
454 | };
455 | 79C10FAE23F590460031860C /* Sources */ = {
456 | isa = PBXSourcesBuildPhase;
457 | buildActionMask = 2147483647;
458 | files = (
459 | 79C10FB923F590460031860C /* ViewController.swift in Sources */,
460 | 79C10FB523F590460031860C /* AppDelegate.swift in Sources */,
461 | );
462 | runOnlyForDeploymentPostprocessing = 0;
463 | };
464 | 79C10FCE23F591ED0031860C /* Sources */ = {
465 | isa = PBXSourcesBuildPhase;
466 | buildActionMask = 2147483647;
467 | files = (
468 | 79C10FD723F591ED0031860C /* ViewController.swift in Sources */,
469 | 79C10FD523F591ED0031860C /* AppDelegate.swift in Sources */,
470 | );
471 | runOnlyForDeploymentPostprocessing = 0;
472 | };
473 | /* End PBXSourcesBuildPhase section */
474 |
475 | /* Begin PBXTargetDependency section */
476 | 79C10FC723F590AC0031860C /* PBXTargetDependency */ = {
477 | isa = PBXTargetDependency;
478 | target = 7933919A23F58ED70080AD66 /* SwimplyLabel-iOS */;
479 | targetProxy = 79C10FC623F590AC0031860C /* PBXContainerItemProxy */;
480 | };
481 | 79C10FCC23F590B20031860C /* PBXTargetDependency */ = {
482 | isa = PBXTargetDependency;
483 | target = 7933919A23F58ED70080AD66 /* SwimplyLabel-iOS */;
484 | targetProxy = 79C10FCB23F590B20031860C /* PBXContainerItemProxy */;
485 | };
486 | 79C10FE523F5920B0031860C /* PBXTargetDependency */ = {
487 | isa = PBXTargetDependency;
488 | target = 79C10F8B23F58FBC0031860C /* SwimplyLabel-macOS */;
489 | targetProxy = 79C10FE423F5920B0031860C /* PBXContainerItemProxy */;
490 | };
491 | /* End PBXTargetDependency section */
492 |
493 | /* Begin PBXVariantGroup section */
494 | 79C10FBA23F590460031860C /* Main.storyboard */ = {
495 | isa = PBXVariantGroup;
496 | children = (
497 | 79C10FBB23F590460031860C /* Base */,
498 | );
499 | name = Main.storyboard;
500 | sourceTree = "";
501 | };
502 | 79C10FBF23F590470031860C /* LaunchScreen.storyboard */ = {
503 | isa = PBXVariantGroup;
504 | children = (
505 | 79C10FC023F590470031860C /* Base */,
506 | );
507 | name = LaunchScreen.storyboard;
508 | sourceTree = "";
509 | };
510 | 79C10FDA23F591EE0031860C /* Main.storyboard */ = {
511 | isa = PBXVariantGroup;
512 | children = (
513 | 79C10FDB23F591EE0031860C /* Base */,
514 | );
515 | name = Main.storyboard;
516 | sourceTree = "";
517 | };
518 | /* End PBXVariantGroup section */
519 |
520 | /* Begin XCBuildConfiguration section */
521 | 793391A123F58ED70080AD66 /* Debug */ = {
522 | isa = XCBuildConfiguration;
523 | buildSettings = {
524 | ALWAYS_SEARCH_USER_PATHS = NO;
525 | CLANG_ANALYZER_NONNULL = YES;
526 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
527 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
528 | CLANG_CXX_LIBRARY = "libc++";
529 | CLANG_ENABLE_MODULES = YES;
530 | CLANG_ENABLE_OBJC_ARC = YES;
531 | CLANG_ENABLE_OBJC_WEAK = YES;
532 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
533 | CLANG_WARN_BOOL_CONVERSION = YES;
534 | CLANG_WARN_COMMA = YES;
535 | CLANG_WARN_CONSTANT_CONVERSION = YES;
536 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
537 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
538 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
539 | CLANG_WARN_EMPTY_BODY = YES;
540 | CLANG_WARN_ENUM_CONVERSION = YES;
541 | CLANG_WARN_INFINITE_RECURSION = YES;
542 | CLANG_WARN_INT_CONVERSION = YES;
543 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
544 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
545 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
546 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
547 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
548 | CLANG_WARN_STRICT_PROTOTYPES = YES;
549 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
550 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
551 | CLANG_WARN_UNREACHABLE_CODE = YES;
552 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
553 | COPY_PHASE_STRIP = NO;
554 | CURRENT_PROJECT_VERSION = 1;
555 | DEBUG_INFORMATION_FORMAT = dwarf;
556 | ENABLE_STRICT_OBJC_MSGSEND = YES;
557 | ENABLE_TESTABILITY = YES;
558 | GCC_C_LANGUAGE_STANDARD = gnu11;
559 | GCC_DYNAMIC_NO_PIC = NO;
560 | GCC_NO_COMMON_BLOCKS = YES;
561 | GCC_OPTIMIZATION_LEVEL = 0;
562 | GCC_PREPROCESSOR_DEFINITIONS = (
563 | "DEBUG=1",
564 | "$(inherited)",
565 | );
566 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
567 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
568 | GCC_WARN_UNDECLARED_SELECTOR = YES;
569 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
570 | GCC_WARN_UNUSED_FUNCTION = YES;
571 | GCC_WARN_UNUSED_VARIABLE = YES;
572 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
573 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
574 | MTL_FAST_MATH = YES;
575 | ONLY_ACTIVE_ARCH = YES;
576 | SDKROOT = iphoneos;
577 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
578 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
579 | VERSIONING_SYSTEM = "apple-generic";
580 | VERSION_INFO_PREFIX = "";
581 | };
582 | name = Debug;
583 | };
584 | 793391A223F58ED70080AD66 /* Release */ = {
585 | isa = XCBuildConfiguration;
586 | buildSettings = {
587 | ALWAYS_SEARCH_USER_PATHS = NO;
588 | CLANG_ANALYZER_NONNULL = YES;
589 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
590 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
591 | CLANG_CXX_LIBRARY = "libc++";
592 | CLANG_ENABLE_MODULES = YES;
593 | CLANG_ENABLE_OBJC_ARC = YES;
594 | CLANG_ENABLE_OBJC_WEAK = YES;
595 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
596 | CLANG_WARN_BOOL_CONVERSION = YES;
597 | CLANG_WARN_COMMA = YES;
598 | CLANG_WARN_CONSTANT_CONVERSION = YES;
599 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
600 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
601 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
602 | CLANG_WARN_EMPTY_BODY = YES;
603 | CLANG_WARN_ENUM_CONVERSION = YES;
604 | CLANG_WARN_INFINITE_RECURSION = YES;
605 | CLANG_WARN_INT_CONVERSION = YES;
606 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
607 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
608 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
609 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
610 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
611 | CLANG_WARN_STRICT_PROTOTYPES = YES;
612 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
613 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
614 | CLANG_WARN_UNREACHABLE_CODE = YES;
615 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
616 | COPY_PHASE_STRIP = NO;
617 | CURRENT_PROJECT_VERSION = 1;
618 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
619 | ENABLE_NS_ASSERTIONS = NO;
620 | ENABLE_STRICT_OBJC_MSGSEND = YES;
621 | GCC_C_LANGUAGE_STANDARD = gnu11;
622 | GCC_NO_COMMON_BLOCKS = YES;
623 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
624 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
625 | GCC_WARN_UNDECLARED_SELECTOR = YES;
626 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
627 | GCC_WARN_UNUSED_FUNCTION = YES;
628 | GCC_WARN_UNUSED_VARIABLE = YES;
629 | IPHONEOS_DEPLOYMENT_TARGET = 13.2;
630 | MTL_ENABLE_DEBUG_INFO = NO;
631 | MTL_FAST_MATH = YES;
632 | SDKROOT = iphoneos;
633 | SWIFT_COMPILATION_MODE = wholemodule;
634 | SWIFT_OPTIMIZATION_LEVEL = "-O";
635 | VALIDATE_PRODUCT = YES;
636 | VERSIONING_SYSTEM = "apple-generic";
637 | VERSION_INFO_PREFIX = "";
638 | };
639 | name = Release;
640 | };
641 | 793391A423F58ED70080AD66 /* Debug */ = {
642 | isa = XCBuildConfiguration;
643 | buildSettings = {
644 | APPLICATION_EXTENSION_API_ONLY = YES;
645 | CLANG_ENABLE_MODULES = YES;
646 | CODE_SIGN_STYLE = Automatic;
647 | DEFINES_MODULE = YES;
648 | DEVELOPMENT_TEAM = YE33ZK7Z99;
649 | DYLIB_COMPATIBILITY_VERSION = 1;
650 | DYLIB_CURRENT_VERSION = 1;
651 | DYLIB_INSTALL_NAME_BASE = "@rpath";
652 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
653 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
654 | LD_RUNPATH_SEARCH_PATHS = (
655 | "$(inherited)",
656 | "@executable_path/Frameworks",
657 | "@loader_path/Frameworks",
658 | );
659 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
660 | PRODUCT_NAME = SwimplyLabel;
661 | SKIP_INSTALL = YES;
662 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
663 | SWIFT_VERSION = 5.0;
664 | TARGETED_DEVICE_FAMILY = "1,2";
665 | };
666 | name = Debug;
667 | };
668 | 793391A523F58ED70080AD66 /* Release */ = {
669 | isa = XCBuildConfiguration;
670 | buildSettings = {
671 | APPLICATION_EXTENSION_API_ONLY = YES;
672 | CLANG_ENABLE_MODULES = YES;
673 | CODE_SIGN_STYLE = Automatic;
674 | DEFINES_MODULE = YES;
675 | DEVELOPMENT_TEAM = YE33ZK7Z99;
676 | DYLIB_COMPATIBILITY_VERSION = 1;
677 | DYLIB_CURRENT_VERSION = 1;
678 | DYLIB_INSTALL_NAME_BASE = "@rpath";
679 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
680 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
681 | LD_RUNPATH_SEARCH_PATHS = (
682 | "$(inherited)",
683 | "@executable_path/Frameworks",
684 | "@loader_path/Frameworks",
685 | );
686 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
687 | PRODUCT_NAME = SwimplyLabel;
688 | SKIP_INSTALL = YES;
689 | SWIFT_VERSION = 5.0;
690 | TARGETED_DEVICE_FAMILY = "1,2";
691 | };
692 | name = Release;
693 | };
694 | 79C10F8723F58FA50031860C /* Debug */ = {
695 | isa = XCBuildConfiguration;
696 | buildSettings = {
697 | APPLICATION_EXTENSION_API_ONLY = YES;
698 | CLANG_ENABLE_MODULES = YES;
699 | CODE_SIGN_STYLE = Automatic;
700 | DEFINES_MODULE = YES;
701 | DEVELOPMENT_TEAM = YE33ZK7Z99;
702 | DYLIB_COMPATIBILITY_VERSION = 1;
703 | DYLIB_CURRENT_VERSION = 1;
704 | DYLIB_INSTALL_NAME_BASE = "@rpath";
705 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
706 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
707 | LD_RUNPATH_SEARCH_PATHS = (
708 | "$(inherited)",
709 | "@executable_path/Frameworks",
710 | "@loader_path/Frameworks",
711 | );
712 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
713 | PRODUCT_NAME = SwimplyLabel;
714 | SDKROOT = appletvos;
715 | SKIP_INSTALL = YES;
716 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
717 | SWIFT_VERSION = 5.0;
718 | TVOS_DEPLOYMENT_TARGET = 10.0;
719 | };
720 | name = Debug;
721 | };
722 | 79C10F8823F58FA50031860C /* Release */ = {
723 | isa = XCBuildConfiguration;
724 | buildSettings = {
725 | APPLICATION_EXTENSION_API_ONLY = YES;
726 | CLANG_ENABLE_MODULES = YES;
727 | CODE_SIGN_STYLE = Automatic;
728 | DEFINES_MODULE = YES;
729 | DEVELOPMENT_TEAM = YE33ZK7Z99;
730 | DYLIB_COMPATIBILITY_VERSION = 1;
731 | DYLIB_CURRENT_VERSION = 1;
732 | DYLIB_INSTALL_NAME_BASE = "@rpath";
733 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
734 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
735 | LD_RUNPATH_SEARCH_PATHS = (
736 | "$(inherited)",
737 | "@executable_path/Frameworks",
738 | "@loader_path/Frameworks",
739 | );
740 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
741 | PRODUCT_NAME = SwimplyLabel;
742 | SDKROOT = appletvos;
743 | SKIP_INSTALL = YES;
744 | SWIFT_VERSION = 5.0;
745 | TVOS_DEPLOYMENT_TARGET = 10.0;
746 | };
747 | name = Release;
748 | };
749 | 79C10F9223F58FBC0031860C /* Debug */ = {
750 | isa = XCBuildConfiguration;
751 | buildSettings = {
752 | APPLICATION_EXTENSION_API_ONLY = YES;
753 | CLANG_ENABLE_MODULES = YES;
754 | CODE_SIGN_STYLE = Automatic;
755 | DEFINES_MODULE = YES;
756 | DEVELOPMENT_TEAM = YE33ZK7Z99;
757 | DYLIB_COMPATIBILITY_VERSION = 1;
758 | DYLIB_CURRENT_VERSION = 1;
759 | DYLIB_INSTALL_NAME_BASE = "@rpath";
760 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
761 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
762 | LD_RUNPATH_SEARCH_PATHS = (
763 | "$(inherited)",
764 | "@executable_path/Frameworks",
765 | "@loader_path/Frameworks",
766 | );
767 | MACOSX_DEPLOYMENT_TARGET = 10.12;
768 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
769 | PRODUCT_NAME = SwimplyLabel;
770 | SDKROOT = macosx;
771 | SKIP_INSTALL = YES;
772 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
773 | SWIFT_VERSION = 5.0;
774 | };
775 | name = Debug;
776 | };
777 | 79C10F9323F58FBC0031860C /* Release */ = {
778 | isa = XCBuildConfiguration;
779 | buildSettings = {
780 | APPLICATION_EXTENSION_API_ONLY = YES;
781 | CLANG_ENABLE_MODULES = YES;
782 | CODE_SIGN_STYLE = Automatic;
783 | DEFINES_MODULE = YES;
784 | DEVELOPMENT_TEAM = YE33ZK7Z99;
785 | DYLIB_COMPATIBILITY_VERSION = 1;
786 | DYLIB_CURRENT_VERSION = 1;
787 | DYLIB_INSTALL_NAME_BASE = "@rpath";
788 | INFOPLIST_FILE = "$(SRCROOT)/Sources/Info.plist";
789 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
790 | LD_RUNPATH_SEARCH_PATHS = (
791 | "$(inherited)",
792 | "@executable_path/Frameworks",
793 | "@loader_path/Frameworks",
794 | );
795 | MACOSX_DEPLOYMENT_TARGET = 10.12;
796 | PRODUCT_BUNDLE_IDENTIFIER = com.obrhoff.SwimplyLabel;
797 | PRODUCT_NAME = SwimplyLabel;
798 | SDKROOT = macosx;
799 | SKIP_INSTALL = YES;
800 | SWIFT_VERSION = 5.0;
801 | };
802 | name = Release;
803 | };
804 | 79C10FC423F590470031860C /* Debug */ = {
805 | isa = XCBuildConfiguration;
806 | buildSettings = {
807 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
808 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
809 | CODE_SIGN_STYLE = Automatic;
810 | DEVELOPMENT_TEAM = YE33ZK7Z99;
811 | INFOPLIST_FILE = "Example-iOS/Info.plist";
812 | LD_RUNPATH_SEARCH_PATHS = (
813 | "$(inherited)",
814 | "@executable_path/Frameworks",
815 | );
816 | PRODUCT_BUNDLE_IDENTIFIER = "com.obrhoff.swimplylabel.Example-iOS";
817 | PRODUCT_NAME = "$(TARGET_NAME)";
818 | SWIFT_VERSION = 5.0;
819 | TARGETED_DEVICE_FAMILY = "1,2";
820 | };
821 | name = Debug;
822 | };
823 | 79C10FC523F590470031860C /* Release */ = {
824 | isa = XCBuildConfiguration;
825 | buildSettings = {
826 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
827 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
828 | CODE_SIGN_STYLE = Automatic;
829 | DEVELOPMENT_TEAM = YE33ZK7Z99;
830 | INFOPLIST_FILE = "Example-iOS/Info.plist";
831 | LD_RUNPATH_SEARCH_PATHS = (
832 | "$(inherited)",
833 | "@executable_path/Frameworks",
834 | );
835 | PRODUCT_BUNDLE_IDENTIFIER = "com.obrhoff.swimplylabel.Example-iOS";
836 | PRODUCT_NAME = "$(TARGET_NAME)";
837 | SWIFT_VERSION = 5.0;
838 | TARGETED_DEVICE_FAMILY = "1,2";
839 | };
840 | name = Release;
841 | };
842 | 79C10FE023F591EE0031860C /* Debug */ = {
843 | isa = XCBuildConfiguration;
844 | buildSettings = {
845 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
846 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
847 | CODE_SIGN_ENTITLEMENTS = "Example-macOS/Example_macOS.entitlements";
848 | CODE_SIGN_STYLE = Automatic;
849 | COMBINE_HIDPI_IMAGES = YES;
850 | DEVELOPMENT_TEAM = YE33ZK7Z99;
851 | ENABLE_HARDENED_RUNTIME = YES;
852 | INFOPLIST_FILE = "Example-macOS/Info.plist";
853 | LD_RUNPATH_SEARCH_PATHS = (
854 | "$(inherited)",
855 | "@executable_path/../Frameworks",
856 | );
857 | MACOSX_DEPLOYMENT_TARGET = 10.15;
858 | PRODUCT_BUNDLE_IDENTIFIER = "com.obrhoff.swimplylabel.Example-macOS";
859 | PRODUCT_NAME = "$(TARGET_NAME)";
860 | SDKROOT = macosx;
861 | SWIFT_VERSION = 5.0;
862 | };
863 | name = Debug;
864 | };
865 | 79C10FE123F591EE0031860C /* Release */ = {
866 | isa = XCBuildConfiguration;
867 | buildSettings = {
868 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
869 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
870 | CODE_SIGN_ENTITLEMENTS = "Example-macOS/Example_macOS.entitlements";
871 | CODE_SIGN_STYLE = Automatic;
872 | COMBINE_HIDPI_IMAGES = YES;
873 | DEVELOPMENT_TEAM = YE33ZK7Z99;
874 | ENABLE_HARDENED_RUNTIME = YES;
875 | INFOPLIST_FILE = "Example-macOS/Info.plist";
876 | LD_RUNPATH_SEARCH_PATHS = (
877 | "$(inherited)",
878 | "@executable_path/../Frameworks",
879 | );
880 | MACOSX_DEPLOYMENT_TARGET = 10.15;
881 | PRODUCT_BUNDLE_IDENTIFIER = "com.obrhoff.swimplylabel.Example-macOS";
882 | PRODUCT_NAME = "$(TARGET_NAME)";
883 | SDKROOT = macosx;
884 | SWIFT_VERSION = 5.0;
885 | };
886 | name = Release;
887 | };
888 | /* End XCBuildConfiguration section */
889 |
890 | /* Begin XCConfigurationList section */
891 | 7933919523F58ED70080AD66 /* Build configuration list for PBXProject "SwimplyLabel" */ = {
892 | isa = XCConfigurationList;
893 | buildConfigurations = (
894 | 793391A123F58ED70080AD66 /* Debug */,
895 | 793391A223F58ED70080AD66 /* Release */,
896 | );
897 | defaultConfigurationIsVisible = 0;
898 | defaultConfigurationName = Release;
899 | };
900 | 793391A323F58ED70080AD66 /* Build configuration list for PBXNativeTarget "SwimplyLabel-iOS" */ = {
901 | isa = XCConfigurationList;
902 | buildConfigurations = (
903 | 793391A423F58ED70080AD66 /* Debug */,
904 | 793391A523F58ED70080AD66 /* Release */,
905 | );
906 | defaultConfigurationIsVisible = 0;
907 | defaultConfigurationName = Release;
908 | };
909 | 79C10F8623F58FA50031860C /* Build configuration list for PBXNativeTarget "SwimplyLabel-tvOS" */ = {
910 | isa = XCConfigurationList;
911 | buildConfigurations = (
912 | 79C10F8723F58FA50031860C /* Debug */,
913 | 79C10F8823F58FA50031860C /* Release */,
914 | );
915 | defaultConfigurationIsVisible = 0;
916 | defaultConfigurationName = Release;
917 | };
918 | 79C10F9123F58FBC0031860C /* Build configuration list for PBXNativeTarget "SwimplyLabel-macOS" */ = {
919 | isa = XCConfigurationList;
920 | buildConfigurations = (
921 | 79C10F9223F58FBC0031860C /* Debug */,
922 | 79C10F9323F58FBC0031860C /* Release */,
923 | );
924 | defaultConfigurationIsVisible = 0;
925 | defaultConfigurationName = Release;
926 | };
927 | 79C10FC323F590470031860C /* Build configuration list for PBXNativeTarget "Example-iOS" */ = {
928 | isa = XCConfigurationList;
929 | buildConfigurations = (
930 | 79C10FC423F590470031860C /* Debug */,
931 | 79C10FC523F590470031860C /* Release */,
932 | );
933 | defaultConfigurationIsVisible = 0;
934 | defaultConfigurationName = Release;
935 | };
936 | 79C10FDF23F591EE0031860C /* Build configuration list for PBXNativeTarget "Example-macOS" */ = {
937 | isa = XCConfigurationList;
938 | buildConfigurations = (
939 | 79C10FE023F591EE0031860C /* Debug */,
940 | 79C10FE123F591EE0031860C /* Release */,
941 | );
942 | defaultConfigurationIsVisible = 0;
943 | defaultConfigurationName = Release;
944 | };
945 | /* End XCConfigurationList section */
946 |
947 | /* Begin XCRemoteSwiftPackageReference section */
948 | E1482E3C246FABC500FD62CA /* XCRemoteSwiftPackageReference "SwimplyCache" */ = {
949 | isa = XCRemoteSwiftPackageReference;
950 | repositoryURL = "https://github.com/docterd/SwimplyCache.git";
951 | requirement = {
952 | kind = upToNextMajorVersion;
953 | minimumVersion = 1.0.0;
954 | };
955 | };
956 | /* End XCRemoteSwiftPackageReference section */
957 |
958 | /* Begin XCSwiftPackageProductDependency section */
959 | E1482E3D246FABC500FD62CA /* SwimplyCache */ = {
960 | isa = XCSwiftPackageProductDependency;
961 | package = E1482E3C246FABC500FD62CA /* XCRemoteSwiftPackageReference "SwimplyCache" */;
962 | productName = SwimplyCache;
963 | };
964 | E1482E43246FAC5200FD62CA /* SwimplyCache */ = {
965 | isa = XCSwiftPackageProductDependency;
966 | package = E1482E3C246FABC500FD62CA /* XCRemoteSwiftPackageReference "SwimplyCache" */;
967 | productName = SwimplyCache;
968 | };
969 | E1482E45246FAC6500FD62CA /* SwimplyCache */ = {
970 | isa = XCSwiftPackageProductDependency;
971 | package = E1482E3C246FABC500FD62CA /* XCRemoteSwiftPackageReference "SwimplyCache" */;
972 | productName = SwimplyCache;
973 | };
974 | /* End XCSwiftPackageProductDependency section */
975 | };
976 | rootObject = 7933919223F58ED70080AD66 /* Project object */;
977 | }
978 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved:
--------------------------------------------------------------------------------
1 | {
2 | "object": {
3 | "pins": [
4 | {
5 | "package": "SwimplyCache",
6 | "repositoryURL": "https://github.com/docterd/SwimplyCache.git",
7 | "state": {
8 | "branch": null,
9 | "revision": "48472a0bd6c7872e21b6508f1fbafadf2c822d60",
10 | "version": "1.0.0"
11 | }
12 | }
13 | ]
14 | },
15 | "version": 1
16 | }
17 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/xcshareddata/xcschemes/SwimplyCache-iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
57 |
58 |
59 |
60 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/xcshareddata/xcschemes/SwimplyCache-macOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
57 |
58 |
59 |
60 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/SwimplyLabel.xcodeproj/xcshareddata/xcschemes/SwimplyCache-tvOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
43 |
44 |
50 |
51 |
57 |
58 |
59 |
60 |
62 |
63 |
66 |
67 |
68 |
--------------------------------------------------------------------------------