From c77730e4a2b02eb933dd08c67fef35234056fefb Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Feb 2021 15:07:20 +0000 Subject: [PATCH 01/12] Minimum target is 12.0 --- GridView/GridView.xcodeproj/project.pbxproj | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/GridView/GridView.xcodeproj/project.pbxproj b/GridView/GridView.xcodeproj/project.pbxproj index 8324803..58f1176 100644 --- a/GridView/GridView.xcodeproj/project.pbxproj +++ b/GridView/GridView.xcodeproj/project.pbxproj @@ -143,7 +143,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0830; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 531CCB861EAA45D2008349F4 = { @@ -320,6 +320,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -344,7 +345,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -380,6 +381,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -398,7 +400,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; @@ -414,7 +416,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -432,7 +434,7 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = GridView/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 9.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", From 828445fffe248ecd14e7f30a8e4bfa3279dd0251 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Tue, 9 Feb 2021 15:09:06 +0000 Subject: [PATCH 02/12] Define launch screen in Info.plist --- .../xcshareddata/xcschemes/List.xcscheme | 78 +++++++++++++++++++ .../BackgroundColor.colorset/Contents.json | 15 ++++ .../Contents.json | 15 ++++ .../List/Base.lproj/LaunchScreen.storyboard | 38 +++++++-- ListCollection/List/Info.plist | 44 ++++++++++- ListCollection/List/ListController.swift | 2 +- 6 files changed, 183 insertions(+), 9 deletions(-) create mode 100644 ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme create mode 100644 ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json create mode 100644 ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json diff --git a/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme new file mode 100644 index 0000000..370e826 --- /dev/null +++ b/ListCollection/List.xcodeproj/xcshareddata/xcschemes/List.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..db2c315 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/BackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemPurpleColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json new file mode 100644 index 0000000..89b5d90 --- /dev/null +++ b/ListCollection/List/Assets.xcassets/EditBackgroundColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemYellowColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ListCollection/List/Base.lproj/LaunchScreen.storyboard b/ListCollection/List/Base.lproj/LaunchScreen.storyboard index 865e932..1efaf14 100644 --- a/ListCollection/List/Base.lproj/LaunchScreen.storyboard +++ b/ListCollection/List/Base.lproj/LaunchScreen.storyboard @@ -1,7 +1,9 @@ - - + + + - + + @@ -11,15 +13,39 @@ - + - + + - + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ListCollection/List/Info.plist b/ListCollection/List/Info.plist index 5b531f7..dbc1db6 100644 --- a/ListCollection/List/Info.plist +++ b/ListCollection/List/Info.plist @@ -16,6 +16,19 @@ $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 + CFBundleURLTypes + + + CFBundleTypeRole + Editor + CFBundleURLName + com.useyourloaf.list + CFBundleURLSchemes + + facts + + + CFBundleVersion 1 LSRequiresIPhoneOS @@ -41,8 +54,35 @@ UIApplicationSupportsIndirectInputEvents - UILaunchStoryboardName - LaunchScreen + UILaunchScreens + + UIDefaultLaunchScreen + HomeScreen + UILaunchScreenDefinitions + + + UIColorName + BackgroundColor + UILaunchScreenIdentifier + HomeScreen + UINavigationBar + + + + UIColorName + EditBackgroundColor + UILaunchScreenIdentifier + EditScreen + UINavigationBar + + + + UIURLToLaunchScreenAssociations + + facts://country + EditScreen + + UIMainStoryboardFile Main UIRequiredDeviceCapabilities diff --git a/ListCollection/List/ListController.swift b/ListCollection/List/ListController.swift index 5d2fd2b..af95527 100644 --- a/ListCollection/List/ListController.swift +++ b/ListCollection/List/ListController.swift @@ -83,7 +83,7 @@ final class ListController: UICollectionViewController { private func createLayout() { var config = UICollectionLayoutListConfiguration(appearance: .insetGrouped) - config.backgroundColor = .systemPurple + config.backgroundColor = UIColor(named: "BackgroundColor") collectionView.collectionViewLayout = UICollectionViewCompositionalLayout.list(using: config) } From 6e330303a3b79c034b2292ee61e7014ceaac087c Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Thu, 11 Mar 2021 16:10:50 +0000 Subject: [PATCH 03/12] Updated ScaledFont - now a Swift Package - added a SwiftUI example --- .../{ScaledFont => Fonts}/Noteworthy.plist | 22 +- .../{ScaledFont => Fonts}/NotoSerif.plist | 22 +- .../Noto_Serif/LICENSE.txt | 0 .../Noto_Serif/NotoSerif-Bold.ttf | Bin .../Noto_Serif/NotoSerif-BoldItalic.ttf | Bin .../Noto_Serif/NotoSerif-Italic.ttf | Bin .../Noto_Serif/NotoSerif-Regular.ttf | Bin ScaledFont/README.md | 82 +++- .../{ScaledFont => Sampler}/AppDelegate.swift | 8 +- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++ .../Sampler/Assets.xcassets/Contents.json | 6 + ScaledFont/Sampler/Base.lproj/Main.storyboard | 53 +++ ScaledFont/Sampler/Info.plist | 75 ++++ ScaledFont/Sampler/SceneDelegate.swift | 33 ++ .../StyleViewController.swift} | 6 +- .../AccentColor.colorset/Contents.json | 11 + .../AppIcon.appiconset/Contents.json | 98 +++++ .../SamplerUI/Assets.xcassets/Contents.json | 6 + .../{ScaledFont => SamplerUI}/Info.plist | 31 +- .../Preview Assets.xcassets/Contents.json | 6 + ScaledFont/SamplerUI/SamplerUIApp.swift | 44 +++ ScaledFont/SamplerUI/StyleView.swift | 100 +++++ .../ScaledFont.xcodeproj/project.pbxproj | 355 ++++++++++++++---- .../AppIcon.appiconset/Contents.json | 98 ----- .../Base.lproj/LaunchScreen.storyboard | 25 -- .../ScaledFont/Base.lproj/Main.storyboard | 47 --- ScaledFont/ScaledFont/ScaledFont.swift | 113 ------ 28 files changed, 927 insertions(+), 423 deletions(-) rename ScaledFont/{ScaledFont => Fonts}/Noteworthy.plist (78%) rename ScaledFont/{ScaledFont => Fonts}/NotoSerif.plist (78%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/LICENSE.txt (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Bold.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-BoldItalic.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Italic.ttf (100%) rename ScaledFont/{ScaledFont => Fonts}/Noto_Serif/NotoSerif-Regular.ttf (100%) rename ScaledFont/{ScaledFont => Sampler}/AppDelegate.swift (87%) create mode 100644 ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScaledFont/Sampler/Assets.xcassets/Contents.json create mode 100644 ScaledFont/Sampler/Base.lproj/Main.storyboard create mode 100644 ScaledFont/Sampler/Info.plist create mode 100644 ScaledFont/Sampler/SceneDelegate.swift rename ScaledFont/{ScaledFont/ViewController.swift => Sampler/StyleViewController.swift} (96%) create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 ScaledFont/SamplerUI/Assets.xcassets/Contents.json rename ScaledFont/{ScaledFont => SamplerUI}/Info.plist (82%) create mode 100644 ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json create mode 100644 ScaledFont/SamplerUI/SamplerUIApp.swift create mode 100644 ScaledFont/SamplerUI/StyleView.swift delete mode 100644 ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard delete mode 100644 ScaledFont/ScaledFont/Base.lproj/Main.storyboard delete mode 100644 ScaledFont/ScaledFont/ScaledFont.swift diff --git a/ScaledFont/ScaledFont/Noteworthy.plist b/ScaledFont/Fonts/Noteworthy.plist similarity index 78% rename from ScaledFont/ScaledFont/Noteworthy.plist rename to ScaledFont/Fonts/Noteworthy.plist index 4395e75..9714135 100644 --- a/ScaledFont/ScaledFont/Noteworthy.plist +++ b/ScaledFont/Fonts/Noteworthy.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName Noteworthy-Light fontSize 34 - UICTFontTextStyleTitle1 + title fontName Noteworthy-Light fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName Noteworthy-Light fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName Noteworthy-Light fontSize 20 - UICTFontTextStyleHeadline + headline fontName Noteworthy-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName Noteworthy-Light fontSize 15 - UICTFontTextStyleBody + body fontName Noteworthy-Light fontSize 17 - UICTFontTextStyleCallout + callout fontName Noteworthy-Light fontSize 16 - UICTFontTextStyleFootnote + footnote fontName Noteworthy-Light fontSize 13 - UICTFontTextStyleCaption1 + caption fontName Noteworthy-Light fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName Noteworthy-Light diff --git a/ScaledFont/ScaledFont/NotoSerif.plist b/ScaledFont/Fonts/NotoSerif.plist similarity index 78% rename from ScaledFont/ScaledFont/NotoSerif.plist rename to ScaledFont/Fonts/NotoSerif.plist index 2d35c45..79f5db2 100644 --- a/ScaledFont/ScaledFont/NotoSerif.plist +++ b/ScaledFont/Fonts/NotoSerif.plist @@ -2,77 +2,77 @@ - UICTFontTextStyleTitle0 + largeTitle fontName NotoSerif fontSize 34 - UICTFontTextStyleTitle1 + title fontName NotoSerif fontSize 28 - UICTFontTextStyleTitle2 + title2 fontName NotoSerif fontSize 22 - UICTFontTextStyleTitle3 + title3 fontName NotoSerif fontSize 20 - UICTFontTextStyleHeadline + headline fontName NotoSerif-Bold fontSize 17 - UICTFontTextStyleSubhead + subheadline fontName NotoSerif-Italic fontSize 15 - UICTFontTextStyleBody + body fontName NotoSerif fontSize 17 - UICTFontTextStyleCallout + callout fontName NotoSerif fontSize 16 - UICTFontTextStyleFootnote + footnote fontName NotoSerif fontSize 13 - UICTFontTextStyleCaption1 + caption fontName NotoSerif-Italic fontSize 12 - UICTFontTextStyleCaption2 + caption2 fontName NotoSerif-Italic diff --git a/ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt b/ScaledFont/Fonts/Noto_Serif/LICENSE.txt similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/LICENSE.txt rename to ScaledFont/Fonts/Noto_Serif/LICENSE.txt diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Bold.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Bold.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-BoldItalic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-BoldItalic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Italic.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Italic.ttf diff --git a/ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf b/ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf similarity index 100% rename from ScaledFont/ScaledFont/Noto_Serif/NotoSerif-Regular.ttf rename to ScaledFont/Fonts/Noto_Serif/NotoSerif-Regular.ttf diff --git a/ScaledFont/README.md b/ScaledFont/README.md index d54fccd..84d4e26 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -2,43 +2,85 @@ ## Using Dynamic Type With Custom Fonts -An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font which is built-in to iOS and the Noto Serif font which was downloaded from google fonts: +An example of using custom fonts with dynamic type making use of the `UIFontMetrics` class introduced with iOS 11. It provides examples using the Noteworthy font that Apple ships built-in to iOS and the Noto Serif font which you can download from google fonts: + [Noto Serif](https://fonts.google.com/specimen/Noto+Serif?selection.family=Noto+Serif) -*Refer to LICENSE.txt if you plan on using Noto Serif in a shipping application.* +*See the LICENSE.txt file if you plan on using Noto Serif in a shipping application.* -**This project requires iOS 11** +## Sample Targets -### ScaledFont +There are two targets in this project: -A utility class to help you use custom fonts with dynamic type. ++ Sampler - A UIKit example that requires a minimum of iOS 11 ++ SamplerUI - A SwiftUI example that requires a minimum of iOS 14 -To use this class you must supply the name of a style dictionary for the font when creating the class. The style dictionary should be stored as a property list file in the main bundle. +## Swift Package -The style dictionary contains an entry for each text style that uses the raw string value for each `UIFontTextStyle` as the key. +The ScaledFont implementation is now provided as a Swift Package Manager dependency. You can find the GitHub repository for the package here: + ++ [ScaledFont on GitHub](https://github.com/kharrison/ScaledFont) + +## ScaledFont Details + +The `ScaledFont` type is a utility type to help you use custom fonts with dynamic type. You must give the name of a style dictionary for the font when creating the `ScaledFont`. You include the style dictionary as a property list file in the main bundle of your app. + +The style dictionary contains an entry for each text style. The available text styles are: + ++ `largeTitle`, `title`, `title2`, `title3` ++ `headline`, `subheadline`, `body`, `callout` ++ `footnote`, `caption`, `caption2` The value of each entry is a dictionary with two keys: -+ fontName: A String which is the font name. -+ fontSize: A number which is the point size to use at the `.large` content size. ++ `fontName`: A `String` which is the font name. ++ `fontSize`: A number which is the point size to use at the `.large` (base) content size. For example to use a 17 pt Noteworthy-Bold font for the `.headline` style at the `.large` content size: - - UICTFontTextStyleHeadline - - fontName - Noteworthy-Bold - fontSize - 17 - - +``` + + headline + + fontName + Noteworthy-Bold + fontSize + 17 + + +``` You do not need to include an entry for every text style but if you try to use a text style that is not included in the dictionary it will fallback to the system preferred font. -### Further Details +## Using With UIKit + +For `UIKit`, apply the scaled font to text labels, text fields or text views: + + ```swift +let scaledFont = ScaledFont(fontName: "Noteworthy") +label.font = scaledFont.font(forTextStyle: .headline) +label.adjustsFontForContentSizeCategory = true +``` + +Remember to set the `adjustsFontFotContentSizeCategory` property to have the font size adjust automatically when the user changes their preferred content size. + +## Using With SwiftUI + +For `SwiftUI`, add the scaled font to the environment of a view: + + ```swift +ContentView() +.environment(\.scaledFont, scaledFont) +``` + +Then apply the scaled fint view modifier to any view containing text in the view hierarchy: + + ```swift +Text("Headline") +.scaledFont(.headline) +``` +## Further Details -See the following blog post for further details: +See this blog post for further details: + [Using A Custom Font With Dynamic Type](https://useyourloaf.com/blog/using-a-custom-font-with-dynamic-type/) diff --git a/ScaledFont/ScaledFont/AppDelegate.swift b/ScaledFont/Sampler/AppDelegate.swift similarity index 87% rename from ScaledFont/ScaledFont/AppDelegate.swift rename to ScaledFont/Sampler/AppDelegate.swift index 6420758..ed37160 100644 --- a/ScaledFont/ScaledFont/AppDelegate.swift +++ b/ScaledFont/Sampler/AppDelegate.swift @@ -1,5 +1,4 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -29,7 +28,6 @@ import UIKit -@UIApplicationMain -class AppDelegate: UIResponder, UIApplicationDelegate { - var window: UIWindow? +@main +final class AppDelegate: UIResponder, UIApplicationDelegate { } diff --git a/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Assets.xcassets/Contents.json b/ScaledFont/Sampler/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/Sampler/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/Sampler/Base.lproj/Main.storyboard b/ScaledFont/Sampler/Base.lproj/Main.storyboard new file mode 100644 index 0000000..b831831 --- /dev/null +++ b/ScaledFont/Sampler/Base.lproj/Main.storyboard @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ScaledFont/Sampler/Info.plist b/ScaledFont/Sampler/Info.plist new file mode 100644 index 0000000..0622451 --- /dev/null +++ b/ScaledFont/Sampler/Info.plist @@ -0,0 +1,75 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UIMainStoryboardFile + Main + UILaunchScreen + + UINavigationBar + + + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + + + diff --git a/ScaledFont/Sampler/SceneDelegate.swift b/ScaledFont/Sampler/SceneDelegate.swift new file mode 100644 index 0000000..80bb407 --- /dev/null +++ b/ScaledFont/Sampler/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/ScaledFont/ScaledFont/ViewController.swift b/ScaledFont/Sampler/StyleViewController.swift similarity index 96% rename from ScaledFont/ScaledFont/ViewController.swift rename to ScaledFont/Sampler/StyleViewController.swift index 315a7fd..d11b721 100644 --- a/ScaledFont/ScaledFont/ViewController.swift +++ b/ScaledFont/Sampler/StyleViewController.swift @@ -1,5 +1,4 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. +// Copyright © 2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -27,9 +26,10 @@ // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. +import ScaledFont import UIKit -class ViewController: UIViewController { +final class StyleViewController: UIViewController { // private let fontName = "Default" // private let fontName = "Noteworthy" private let fontName = "NotoSerif" diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..eb87897 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..9221b9b --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "20x20" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "29x29" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "40x40" + }, + { + "idiom" : "iphone", + "scale" : "2x", + "size" : "60x60" + }, + { + "idiom" : "iphone", + "scale" : "3x", + "size" : "60x60" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "20x20" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "29x29" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "40x40" + }, + { + "idiom" : "ipad", + "scale" : "1x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "76x76" + }, + { + "idiom" : "ipad", + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/ScaledFont/Info.plist b/ScaledFont/SamplerUI/Info.plist similarity index 82% rename from ScaledFont/ScaledFont/Info.plist rename to ScaledFont/SamplerUI/Info.plist index 24cd042..d7f7654 100644 --- a/ScaledFont/ScaledFont/Info.plist +++ b/ScaledFont/SamplerUI/Info.plist @@ -13,23 +13,25 @@ CFBundleName $(PRODUCT_NAME) CFBundlePackageType - APPL + $(PRODUCT_BUNDLE_PACKAGE_TYPE) CFBundleShortVersionString 1.0 CFBundleVersion 1 LSRequiresIPhoneOS - UILaunchStoryboardName - LaunchScreen - UIMainStoryboardFile - Main - UIAppFonts - - NotoSerif-Regular.ttf - NotoSerif-Bold.ttf - NotoSerif-Italic.ttf - + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + + UIApplicationSupportsIndirectInputEvents + + UILaunchScreen + + UINavigationBar + + UIRequiredDeviceCapabilities armv7 @@ -39,7 +41,6 @@ UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight - UIInterfaceOrientationPortraitUpsideDown UISupportedInterfaceOrientations~ipad @@ -48,5 +49,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + UIAppFonts + + NotoSerif-Regular.ttf + NotoSerif-Bold.ttf + NotoSerif-Italic.ttf + diff --git a/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/ScaledFont/SamplerUI/Preview Content/Preview Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/ScaledFont/SamplerUI/SamplerUIApp.swift b/ScaledFont/SamplerUI/SamplerUIApp.swift new file mode 100644 index 0000000..d85ee8e --- /dev/null +++ b/ScaledFont/SamplerUI/SamplerUIApp.swift @@ -0,0 +1,44 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +@main +struct SamplerUIApp: App { +// let fontName = "Default" + let fontName = "Noteworthy" +// let fontName = "NotoSerif" + + var body: some Scene { + WindowGroup { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } + } +} diff --git a/ScaledFont/SamplerUI/StyleView.swift b/ScaledFont/SamplerUI/StyleView.swift new file mode 100644 index 0000000..93f6160 --- /dev/null +++ b/ScaledFont/SamplerUI/StyleView.swift @@ -0,0 +1,100 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import ScaledFont +import SwiftUI + +struct StyleView: View { + let fontName: String + + var body: some View { + NavigationView { + ScrollView { + TextStyles() + } + .navigationBarTitle(fontName, displayMode: .inline) + } + } +} + +private struct TextStyles: View { + var defaultSpacing: CGFloat = 8.0 + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: defaultSpacing) { + Text("Title 1") + .scaledFont(.title) + + if #available(iOS 14.0, *) { + Text("Title 2") + .scaledFont(.title2) + } + + if #available(iOS 14.0, *) { + Text("Title 3") + .scaledFont(.title3) + } + + Text("Headline") + .scaledFont(.headline) + + Text("Subheadline") + .scaledFont(.subheadline) + + Text("Body") + .scaledFont(.body) + + Text("Callout") + .scaledFont(.callout) + + Text("Footnote") + .scaledFont(.footnote) + + Text("Caption 1") + .scaledFont(.caption) + + if #available(iOS 14.0, *) { + Text("Caption 2") + .scaledFont(.caption2) + } + } + .padding() + .frame(maxWidth: .infinity, alignment: .leading) + } + } +} + +struct ContentView_Previews: PreviewProvider { + static let fontName = "Noteworthy" + + static var previews: some View { + StyleView(fontName: fontName) + .environment(\.scaledFont, ScaledFont(fontName: fontName)) + } +} diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index 59a6cc6..0454578 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -3,24 +3,41 @@ archiveVersion = 1; classes = { }; - objectVersion = 50; + objectVersion = 52; objects = { /* Begin PBXBuildFile section */ - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */; }; - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919201F3FA05700FF9E25 /* ViewController.swift */; }; - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919221F3FA05700FF9E25 /* Main.storyboard */; }; - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 537919251F3FA05700FF9E25 /* Assets.xcassets */; }; - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */; }; - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = 537919301F3FA0B500FF9E25 /* ScaledFont.swift */; }; + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */; }; + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */; }; + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */; }; + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53581E7F25F7D6B6000DAD54 /* Main.storyboard */; }; + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53581E8225F7D6B6000DAD54 /* Assets.xcassets */; }; + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53581E8D25F7D6C0000DAD54 /* ScaledFont */; }; + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */; }; + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53A0BBEA25F912AF0061BB67 /* StyleView.swift */; }; + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEC25F912B00061BB67 /* Assets.xcassets */; }; + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */; }; + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */ = {isa = PBXBuildFile; productRef = 53A0BC0525F916180061BB67 /* ScaledFont */; }; + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */; }; + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */ = {isa = PBXBuildFile; fileRef = 537709E51F40B18B0041A64F /* NotoSerif.plist */; }; + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */; }; + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E01F40AFD80041A64F /* NotoSerif-Italic.ttf */; }; + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */ = {isa = PBXBuildFile; fileRef = 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */; }; /* End PBXBuildFile section */ /* Begin PBXFileReference section */ + 53581E7725F7D6B6000DAD54 /* Sampler.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Sampler.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleViewController.swift; sourceTree = ""; }; + 53581E8025F7D6B6000DAD54 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53581E8725F7D6B6000DAD54 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 537709DD1F40AFD80041A64F /* LICENSE.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = LICENSE.txt; sourceTree = ""; }; 537709DE1F40AFD80041A64F /* NotoSerif-Bold.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Bold.ttf"; sourceTree = ""; }; 537709DF1F40AFD80041A64F /* NotoSerif-BoldItalic.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-BoldItalic.ttf"; sourceTree = ""; }; @@ -28,28 +45,55 @@ 537709E11F40AFD80041A64F /* NotoSerif-Regular.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "NotoSerif-Regular.ttf"; sourceTree = ""; }; 537709E51F40B18B0041A64F /* NotoSerif.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = NotoSerif.plist; sourceTree = ""; }; 537709E71F40F3B80041A64F /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = ScaledFont.app; sourceTree = BUILT_PRODUCTS_DIR; }; - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; - 537919201F3FA05700FF9E25 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; - 537919231F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 537919251F3FA05700FF9E25 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; - 537919281F3FA05700FF9E25 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; - 5379192A1F3FA05700FF9E25 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScaledFont.swift; sourceTree = ""; }; 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Noteworthy.plist; sourceTree = ""; }; + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = SamplerUI.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SamplerUIApp.swift; sourceTree = ""; }; + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StyleView.swift; sourceTree = ""; }; + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; }; + 53A0BBF125F912B00061BB67 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 537919181F3FA05700FF9E25 /* Frameworks */ = { + 53581E7425F7D6B6000DAD54 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + 53581E8E25F7D6C0000DAD54 /* ScaledFont in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE325F912AF0061BB67 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BC0625F916180061BB67 /* ScaledFont in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53581E7825F7D6B6000DAD54 /* Sampler */ = { + isa = PBXGroup; + children = ( + 53581E7925F7D6B6000DAD54 /* AppDelegate.swift */, + 53581E7B25F7D6B6000DAD54 /* SceneDelegate.swift */, + 53581E7D25F7D6B6000DAD54 /* StyleViewController.swift */, + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */, + 53581E8225F7D6B6000DAD54 /* Assets.xcassets */, + 53581E8725F7D6B6000DAD54 /* Info.plist */, + ); + path = Sampler; + sourceTree = ""; + }; + 53581E8C25F7D6C0000DAD54 /* Frameworks */ = { + isa = PBXGroup; + children = ( + ); + name = Frameworks; + sourceTree = ""; + }; 537709DC1F40AFD80041A64F /* Noto_Serif */ = { isa = PBXGroup; children = ( @@ -66,54 +110,94 @@ isa = PBXGroup; children = ( 537709E71F40F3B80041A64F /* README.md */, - 5379191D1F3FA05700FF9E25 /* ScaledFont */, + 5379191D1F3FA05700FF9E25 /* Fonts */, + 53581E7825F7D6B6000DAD54 /* Sampler */, + 53A0BBE725F912AF0061BB67 /* SamplerUI */, 5379191C1F3FA05700FF9E25 /* Products */, + 53581E8C25F7D6C0000DAD54 /* Frameworks */, ); sourceTree = ""; }; 5379191C1F3FA05700FF9E25 /* Products */ = { isa = PBXGroup; children = ( - 5379191B1F3FA05700FF9E25 /* ScaledFont.app */, + 53581E7725F7D6B6000DAD54 /* Sampler.app */, + 53A0BBE625F912AF0061BB67 /* SamplerUI.app */, ); name = Products; sourceTree = ""; }; - 5379191D1F3FA05700FF9E25 /* ScaledFont */ = { + 5379191D1F3FA05700FF9E25 /* Fonts */ = { isa = PBXGroup; children = ( 537709DC1F40AFD80041A64F /* Noto_Serif */, - 5379191E1F3FA05700FF9E25 /* AppDelegate.swift */, - 537919201F3FA05700FF9E25 /* ViewController.swift */, - 537919301F3FA0B500FF9E25 /* ScaledFont.swift */, 537919321F3FA0CF00FF9E25 /* Noteworthy.plist */, 537709E51F40B18B0041A64F /* NotoSerif.plist */, - 537919221F3FA05700FF9E25 /* Main.storyboard */, - 537919251F3FA05700FF9E25 /* Assets.xcassets */, - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */, - 5379192A1F3FA05700FF9E25 /* Info.plist */, ); - path = ScaledFont; + path = Fonts; + sourceTree = ""; + }; + 53A0BBE725F912AF0061BB67 /* SamplerUI */ = { + isa = PBXGroup; + children = ( + 53A0BBE825F912AF0061BB67 /* SamplerUIApp.swift */, + 53A0BBEA25F912AF0061BB67 /* StyleView.swift */, + 53A0BBEC25F912B00061BB67 /* Assets.xcassets */, + 53A0BBF125F912B00061BB67 /* Info.plist */, + 53A0BBEE25F912B00061BB67 /* Preview Content */, + ); + path = SamplerUI; + sourceTree = ""; + }; + 53A0BBEE25F912B00061BB67 /* Preview Content */ = { + isa = PBXGroup; + children = ( + 53A0BBEF25F912B00061BB67 /* Preview Assets.xcassets */, + ); + path = "Preview Content"; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ - 5379191A1F3FA05700FF9E25 /* ScaledFont */ = { + 53581E7625F7D6B6000DAD54 /* Sampler */ = { isa = PBXNativeTarget; - buildConfigurationList = 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */; + buildConfigurationList = 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */; buildPhases = ( - 537919171F3FA05700FF9E25 /* Sources */, - 537919181F3FA05700FF9E25 /* Frameworks */, - 537919191F3FA05700FF9E25 /* Resources */, + 53581E7325F7D6B6000DAD54 /* Sources */, + 53581E7425F7D6B6000DAD54 /* Frameworks */, + 53581E7525F7D6B6000DAD54 /* Resources */, ); buildRules = ( ); dependencies = ( ); - name = ScaledFont; - productName = ScaledFont; - productReference = 5379191B1F3FA05700FF9E25 /* ScaledFont.app */; + name = Sampler; + packageProductDependencies = ( + 53581E8D25F7D6C0000DAD54 /* ScaledFont */, + ); + productName = Sampler; + productReference = 53581E7725F7D6B6000DAD54 /* Sampler.app */; + productType = "com.apple.product-type.application"; + }; + 53A0BBE525F912AF0061BB67 /* SamplerUI */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */; + buildPhases = ( + 53A0BBE225F912AF0061BB67 /* Sources */, + 53A0BBE325F912AF0061BB67 /* Frameworks */, + 53A0BBE425F912AF0061BB67 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = SamplerUI; + packageProductDependencies = ( + 53A0BC0525F916180061BB67 /* ScaledFont */, + ); + productName = SamplerUI; + productReference = 53A0BBE625F912AF0061BB67 /* SamplerUI.app */; productType = "com.apple.product-type.application"; }; /* End PBXNativeTarget section */ @@ -122,13 +206,15 @@ 537919131F3FA05700FF9E25 /* Project object */ = { isa = PBXProject; attributes = { - LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 0940; + LastSwiftUpdateCheck = 1240; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { - 5379191A1F3FA05700FF9E25 = { - CreatedOnToolsVersion = 9.0; - LastSwiftMigration = 1020; + 53581E7625F7D6B6000DAD54 = { + CreatedOnToolsVersion = 12.4; + }; + 53A0BBE525F912AF0061BB67 = { + CreatedOnToolsVersion = 12.4; }; }; }; @@ -141,66 +227,129 @@ Base, ); mainGroup = 537919121F3FA05700FF9E25; + packageReferences = ( + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */, + ); productRefGroup = 5379191C1F3FA05700FF9E25 /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( - 5379191A1F3FA05700FF9E25 /* ScaledFont */, + 53581E7625F7D6B6000DAD54 /* Sampler */, + 53A0BBE525F912AF0061BB67 /* SamplerUI */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ - 537919191F3FA05700FF9E25 /* Resources */ = { + 53581E7525F7D6B6000DAD54 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53581E8325F7D6B6000DAD54 /* Assets.xcassets in Resources */, + 53581E9925F7DF0A000DAD54 /* NotoSerif-Regular.ttf in Resources */, + 53581E9725F7DF07000DAD54 /* NotoSerif-Italic.ttf in Resources */, + 53581E9C25F7DF19000DAD54 /* Noteworthy.plist in Resources */, + 53581E9325F7DEFF000DAD54 /* NotoSerif-Bold.ttf in Resources */, + 53581E9E25F7DF1B000DAD54 /* NotoSerif.plist in Resources */, + 53581E8125F7D6B6000DAD54 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE425F912AF0061BB67 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919291F3FA05700FF9E25 /* LaunchScreen.storyboard in Resources */, - 537709E31F40B06B0041A64F /* NotoSerif-Regular.ttf in Resources */, - 537709E61F40B18B0041A64F /* NotoSerif.plist in Resources */, - 537709E41F40B06F0041A64F /* NotoSerif-Italic.ttf in Resources */, - 537709DB1F4061130041A64F /* Noteworthy.plist in Resources */, - 537709E21F40B0650041A64F /* NotoSerif-Bold.ttf in Resources */, - 537919261F3FA05700FF9E25 /* Assets.xcassets in Resources */, - 537919241F3FA05700FF9E25 /* Main.storyboard in Resources */, + 53A0BC0925F9193F0061BB67 /* Noteworthy.plist in Resources */, + 53A0BBF025F912B00061BB67 /* Preview Assets.xcassets in Resources */, + 53A0BC1225F9194B0061BB67 /* NotoSerif-Italic.ttf in Resources */, + 53A0BC1525F9194F0061BB67 /* NotoSerif-Regular.ttf in Resources */, + 53A0BC0F25F919480061BB67 /* NotoSerif-Bold.ttf in Resources */, + 53A0BC0C25F919420061BB67 /* NotoSerif.plist in Resources */, + 53A0BBED25F912B00061BB67 /* Assets.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 537919171F3FA05700FF9E25 /* Sources */ = { + 53581E7325F7D6B6000DAD54 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 537919311F3FA0B500FF9E25 /* ScaledFont.swift in Sources */, - 537919211F3FA05700FF9E25 /* ViewController.swift in Sources */, - 5379191F1F3FA05700FF9E25 /* AppDelegate.swift in Sources */, + 53581E7E25F7D6B6000DAD54 /* StyleViewController.swift in Sources */, + 53581E7A25F7D6B6000DAD54 /* AppDelegate.swift in Sources */, + 53581E7C25F7D6B6000DAD54 /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 53A0BBE225F912AF0061BB67 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53A0BBEB25F912AF0061BB67 /* StyleView.swift in Sources */, + 53A0BBE925F912AF0061BB67 /* SamplerUIApp.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXSourcesBuildPhase section */ /* Begin PBXVariantGroup section */ - 537919221F3FA05700FF9E25 /* Main.storyboard */ = { + 53581E7F25F7D6B6000DAD54 /* Main.storyboard */ = { isa = PBXVariantGroup; children = ( - 537919231F3FA05700FF9E25 /* Base */, + 53581E8025F7D6B6000DAD54 /* Base */, ); name = Main.storyboard; sourceTree = ""; }; - 537919271F3FA05700FF9E25 /* LaunchScreen.storyboard */ = { - isa = PBXVariantGroup; - children = ( - 537919281F3FA05700FF9E25 /* Base */, - ); - name = LaunchScreen.storyboard; - sourceTree = ""; - }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53581E8925F7D6B6000DAD54 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53581E8A25F7D6B6000DAD54 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = LCC2J94N44; + INFOPLIST_FILE = Sampler/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 11.0; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.Sampler; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5379192B1F3FA05700FF9E25 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -226,6 +375,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -285,6 +435,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -313,34 +464,49 @@ }; name = Release; }; - 5379192E1F3FA05700FF9E25 /* Debug */ = { + 53A0BBF325F912B00061BB67 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; }; - 5379192F1F3FA05700FF9E25 /* Release */ = { + 53A0BBF425F912B00061BB67 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ENABLE_OBJC_WEAK = YES; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_ASSET_PATHS = "\"SamplerUI/Preview Content\""; DEVELOPMENT_TEAM = LCC2J94N44; - INFOPLIST_FILE = ScaledFont/Info.plist; + ENABLE_PREVIEWS = YES; + INFOPLIST_FILE = SamplerUI/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.1; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", ); - PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.ScaledFont; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.SamplerUI; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; @@ -350,6 +516,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53581E8825F7D6B6000DAD54 /* Build configuration list for PBXNativeTarget "Sampler" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53581E8925F7D6B6000DAD54 /* Debug */, + 53581E8A25F7D6B6000DAD54 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 537919161F3FA05700FF9E25 /* Build configuration list for PBXProject "ScaledFont" */ = { isa = XCConfigurationList; buildConfigurations = ( @@ -359,16 +534,40 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 5379192D1F3FA05700FF9E25 /* Build configuration list for PBXNativeTarget "ScaledFont" */ = { + 53A0BBF225F912B00061BB67 /* Build configuration list for PBXNativeTarget "SamplerUI" */ = { isa = XCConfigurationList; buildConfigurations = ( - 5379192E1F3FA05700FF9E25 /* Debug */, - 5379192F1F3FA05700FF9E25 /* Release */, + 53A0BBF325F912B00061BB67 /* Debug */, + 53A0BBF425F912B00061BB67 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; /* End XCConfigurationList section */ + +/* Begin XCRemoteSwiftPackageReference section */ + 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "git@github.com:kharrison/ScaledFont.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.0.0; + }; + }; +/* End XCRemoteSwiftPackageReference section */ + +/* Begin XCSwiftPackageProductDependency section */ + 53581E8D25F7D6C0000DAD54 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; + 53A0BC0525F916180061BB67 /* ScaledFont */ = { + isa = XCSwiftPackageProductDependency; + package = 53581E6D25F7D4C1000DAD54 /* XCRemoteSwiftPackageReference "ScaledFont" */; + productName = ScaledFont; + }; +/* End XCSwiftPackageProductDependency section */ }; rootObject = 537919131F3FA05700FF9E25 /* Project object */; } diff --git a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json b/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index d8db8d6..0000000 --- a/ScaledFont/ScaledFont/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,98 +0,0 @@ -{ - "images" : [ - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" - }, - { - "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" - }, - { - "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" - }, - { - "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" - }, - { - "idiom" : "ios-marketing", - "size" : "1024x1024", - "scale" : "1x" - } - ], - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard b/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard deleted file mode 100644 index f83f6fd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/LaunchScreen.storyboard +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard b/ScaledFont/ScaledFont/Base.lproj/Main.storyboard deleted file mode 100644 index f995ddd..0000000 --- a/ScaledFont/ScaledFont/Base.lproj/Main.storyboard +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/ScaledFont/ScaledFont/ScaledFont.swift b/ScaledFont/ScaledFont/ScaledFont.swift deleted file mode 100644 index 09b8b81..0000000 --- a/ScaledFont/ScaledFont/ScaledFont.swift +++ /dev/null @@ -1,113 +0,0 @@ -// Created by Keith Harrison https://useyourloaf.com -// Copyright (c) 2017 Keith Harrison. All rights reserved. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// 1. Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// -// 2. Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// 3. Neither the name of the copyright holder nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -// POSSIBILITY OF SUCH DAMAGE. - -import UIKit - -/// A utility class to help you use custom fonts with -/// dynamic type. -/// -/// To use this class you must supply the name of a style -/// dictionary for the font when creating the class. The -/// style dictionary should be stored as a property list -/// file in the main bundle. -/// -/// The style dictionary contains an entry for each text -/// style that uses the raw string value for each -/// `UIFontTextStyle` as the key. -/// -/// The value of each entry is a dictionary with two keys: -/// -/// + fontName: A String which is the font name. -/// + fontSize: A number which is the point size to use -/// at the `.large` content size. -/// -/// For example to use a 17 pt Noteworthy-Bold font -/// for the `.headline` style at the `.large` content size: -/// -/// -/// UICTFontTextStyleHeadline -/// -/// fontName -/// Noteworthy-Bold -/// fontSize -/// 17 -/// -/// -/// -/// You do not need to include an entry for every text style -/// but if you try to use a text style that is not included -/// in the dictionary it will fallback to the system preferred -/// font. - -public final class ScaledFont { - private struct FontDescription: Decodable { - let fontSize: CGFloat - let fontName: String - } - - private typealias StyleDictionary = [UIFont.TextStyle.RawValue: FontDescription] - private var styleDictionary: StyleDictionary? - - /// Create a `ScaledFont` - /// - /// - Parameter fontName: Name of a plist file (without the extension) - /// in the main bundle that contains the style dictionary used to - /// scale fonts for each text style. - - public init(fontName: String) { - if let url = Bundle.main.url(forResource: fontName, withExtension: "plist"), - let data = try? Data(contentsOf: url) { - let decoder = PropertyListDecoder() - styleDictionary = try? decoder.decode(StyleDictionary.self, from: data) - } - } - - /// Get the scaled font for the given text style using the - /// style dictionary supplied at initialization. - /// - /// - Parameter textStyle: The `UIFontTextStyle` for the - /// font. - /// - Returns: A `UIFont` of the custom font that has been - /// scaled for the users currently selected preferred - /// text size. - /// - /// - Note: If the style dictionary does not have - /// a font for this text style the default preferred - /// font is returned. - - public func font(forTextStyle textStyle: UIFont.TextStyle) -> UIFont { - guard let fontDescription = styleDictionary?[textStyle.rawValue], - let font = UIFont(name: fontDescription.fontName, size: fontDescription.fontSize) else { - return UIFont.preferredFont(forTextStyle: textStyle) - } - - let fontMetrics = UIFontMetrics(forTextStyle: textStyle) - return fontMetrics.scaledFont(for: font) - } -} From 3d8975a73630ced475d783237d9bc1270205cfaf Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Mar 2021 14:13:22 +0000 Subject: [PATCH 04/12] Add link to blog post on using ScaledFont with SwiftUI --- ScaledFont/README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/ScaledFont/README.md b/ScaledFont/README.md index 84d4e26..2e30463 100644 --- a/ScaledFont/README.md +++ b/ScaledFont/README.md @@ -81,6 +81,7 @@ Text("Headline") ``` ## Further Details -See this blog post for further details: +See these blog posts for further details: + [Using A Custom Font With Dynamic Type](https://useyourloaf.com/blog/using-a-custom-font-with-dynamic-type/) ++ [Scaling Custom SwiftUI Fonts With Dynamic Type](https://useyourloaf.com/blog/scaling-custom-swiftui-fonts-with-dynamic-type/) From 12c43b8e793cc920cfc311dd33af6d503b6a17ea Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 2 Apr 2021 16:30:02 +0100 Subject: [PATCH 05/12] Updated for Xcode 12.4 --- DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index 995fc45..f94e69b 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -119,7 +119,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0900; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1240; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53A2B5361F94DBE500095FAD = { @@ -223,6 +223,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -248,7 +249,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -282,6 +283,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -301,7 +303,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; From 35882ef4925345c3e5f2ef18cf9482bf2fa7101f Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 5 Apr 2021 16:03:34 +0100 Subject: [PATCH 06/12] Add App Bound Domains (iOS 14) --- .../DynamicWebKit.xcodeproj/project.pbxproj | 14 +- .../AppIcon.appiconset/Contents.json | 79 +++++---- .../Assets.xcassets/Contents.json | 6 + .../chevron.backward.symbolset/Contents.json | 13 ++ .../chevron.backward.symbolset/backward.svg | 161 ++++++++++++++++++ .../chevron.forward.symbolset/Contents.json | 13 ++ .../chevron.forward.symbolset/forward.svg | 161 ++++++++++++++++++ .../DynamicWebKit/Base.lproj/Main.storyboard | 29 +++- DynamicWebKit/DynamicWebKit/Info.plist | 6 + .../DynamicWebKit/WebViewController.swift | 60 ++++++- DynamicWebKit/README.md | 5 +- 11 files changed, 498 insertions(+), 49 deletions(-) create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json create mode 100644 DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj index f94e69b..aa1b646 100644 --- a/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.pbxproj @@ -31,6 +31,7 @@ 53A2B54C1F94DC9700095FAD /* default.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = default.html; sourceTree = ""; }; 53A2B54E1F94DD8200095FAD /* stylesheet.css */ = {isa = PBXFileReference; lastKnownFileType = text.css; path = stylesheet.css; sourceTree = ""; }; 53A2B5501F94F14800095FAD /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; + 53C25DE92617A45300E8BC02 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; }; 53E34DFF2403D67600EE575E /* 001-dark@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001-dark@2x.png"; sourceTree = ""; }; 53E34E002403D67600EE575E /* 001@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = "001@2x.png"; sourceTree = ""; }; 53E34E012403D67600EE575E /* 001.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = 001.png; sourceTree = ""; }; @@ -54,6 +55,7 @@ 53A2B5501F94F14800095FAD /* README.md */, 53A2B5391F94DBE500095FAD /* DynamicWebKit */, 53A2B5381F94DBE500095FAD /* Products */, + 53C25DE82617A45300E8BC02 /* Frameworks */, ); sourceTree = ""; }; @@ -79,6 +81,14 @@ path = DynamicWebKit; sourceTree = ""; }; + 53C25DE82617A45300E8BC02 /* Frameworks */ = { + isa = PBXGroup; + children = ( + 53C25DE92617A45300E8BC02 /* WebKit.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; 53E34DFE2403D58400EE575E /* HTML */ = { isa = PBXGroup; children = ( @@ -249,7 +259,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -303,7 +313,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json index 1d060ed..9221b9b 100644 --- a/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -2,92 +2,97 @@ "images" : [ { "idiom" : "iphone", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "20x20", - "scale" : "3x" + "scale" : "3x", + "size" : "20x20" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "29x29", - "scale" : "3x" + "scale" : "3x", + "size" : "29x29" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "40x40", - "scale" : "3x" + "scale" : "3x", + "size" : "40x40" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "2x" + "scale" : "2x", + "size" : "60x60" }, { "idiom" : "iphone", - "size" : "60x60", - "scale" : "3x" + "scale" : "3x", + "size" : "60x60" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "1x" + "scale" : "1x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "20x20", - "scale" : "2x" + "scale" : "2x", + "size" : "20x20" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "1x" + "scale" : "1x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "29x29", - "scale" : "2x" + "scale" : "2x", + "size" : "29x29" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "1x" + "scale" : "1x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "40x40", - "scale" : "2x" + "scale" : "2x", + "size" : "40x40" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "1x" + "scale" : "1x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "76x76", - "scale" : "2x" + "scale" : "2x", + "size" : "76x76" }, { "idiom" : "ipad", - "size" : "83.5x83.5", - "scale" : "2x" + "scale" : "2x", + "size" : "83.5x83.5" + }, + { + "idiom" : "ios-marketing", + "scale" : "1x", + "size" : "1024x1024" } ], "info" : { - "version" : 1, - "author" : "xcode" + "author" : "xcode", + "version" : 1 } -} \ No newline at end of file +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json new file mode 100644 index 0000000..3aee322 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "backward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg new file mode 100644 index 0000000..f32a098 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.backward.symbolset/backward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.backward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json new file mode 100644 index 0000000..b8b271f --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/Contents.json @@ -0,0 +1,13 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + }, + "symbols" : [ + { + "filename" : "forward.svg", + "idiom" : "universal", + "language-direction" : "left-to-right" + } + ] +} diff --git a/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg new file mode 100644 index 0000000..c387b82 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit/Assets.xcassets/chevron.forward.symbolset/forward.svg @@ -0,0 +1,161 @@ + + + + + + + + + Weight/Scale Variations + Ultralight + Thin + Light + Regular + Medium + Semibold + Bold + Heavy + Black + + + + + + + + + + + Design Variations + Symbols are supported in up to nine weights and three scales. + For optimal layout with text and other symbols, vertically align + symbols with the adjacent text. + + + + + + Margins + Leading and trailing margins on the left and right side of each symbol + can be adjusted by modifying the x-location of the margin guidelines. + Modifications are automatically applied proportionally to all + scales and weights. + + + + Exporting + Symbols should be outlined when exporting to ensure the + design is preserved when submitting to Xcode. + Template v.2.0 + Requires Xcode 12 or greater + Generated from chevron.forward + Typeset at 100 points + Small + Medium + Large + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard index c0a6762..97443bd 100644 --- a/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard +++ b/DynamicWebKit/DynamicWebKit/Base.lproj/Main.storyboard @@ -1,9 +1,9 @@ - + - + @@ -15,10 +15,27 @@ - + - + + + + + + + + + + + + + + + + + + @@ -43,4 +60,8 @@ + + + + diff --git a/DynamicWebKit/DynamicWebKit/Info.plist b/DynamicWebKit/DynamicWebKit/Info.plist index 16be3b6..cf8aa00 100644 --- a/DynamicWebKit/DynamicWebKit/Info.plist +++ b/DynamicWebKit/DynamicWebKit/Info.plist @@ -41,5 +41,11 @@ UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight + WKAppBoundDomains + + useyourloaf.com + github.com + apple.com + diff --git a/DynamicWebKit/DynamicWebKit/WebViewController.swift b/DynamicWebKit/DynamicWebKit/WebViewController.swift index 90b5382..91632b7 100644 --- a/DynamicWebKit/DynamicWebKit/WebViewController.swift +++ b/DynamicWebKit/DynamicWebKit/WebViewController.swift @@ -31,6 +31,9 @@ import UIKit import WebKit final class WebViewController: UIViewController { + @IBOutlet private var backwardButton: UIBarButtonItem! + @IBOutlet private var forwardButton: UIBarButtonItem! + var html: String = "default" { didSet { loadHTML(html) @@ -38,11 +41,24 @@ final class WebViewController: UIViewController { } private lazy var webView: WKWebView = { - let preferences = WKPreferences() - preferences.javaScriptEnabled = false let configuration = WKWebViewConfiguration() - configuration.preferences = preferences - return WKWebView(frame: .zero, configuration: configuration) + + if #available(iOS 14.0, *) { + // Allow restricted API access on the + // app-bound domains (cookies, etc). + // Doesn't seem to be required + // configuration.limitsNavigationsToAppBoundDomains = true + } else { + // Fallback to WKPreferences for iOS 13 to + // disable javascript. + let preferences = WKPreferences() + // preferences.javaScriptEnabled = false + configuration.preferences = preferences + } + + let webView = WKWebView(frame: .zero, configuration: configuration) + webView.navigationDelegate = self + return webView }() override func loadView() { @@ -51,6 +67,14 @@ final class WebViewController: UIViewController { NotificationCenter.default.addObserver(self, selector: #selector(contentSizeDidChange(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) } + @IBAction func forwardAction(_ sender: UIBarButtonItem) { + webView.goForward() + } + + @IBAction func backwardAction(_ sender: UIBarButtonItem) { + webView.goBack() + } + @objc private func contentSizeDidChange(_ notification: Notification) { webView.reload() } @@ -61,3 +85,31 @@ final class WebViewController: UIViewController { } } } + +extension WebViewController: WKNavigationDelegate { + func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, preferences: WKWebpagePreferences, decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void) { + if #available(iOS 14.0, *) { + // To disable all javascript content + // preferences.allowsContentJavaScript = true + } + decisionHandler(.allow, preferences) + } + + func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) { + print(error) + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error) { + updateNavigationState(webView) + } + + func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) { + updateNavigationState(webView) + } + + private func updateNavigationState(_ webView: WKWebView) { + backwardButton.isEnabled = webView.canGoBack + forwardButton.isEnabled = webView.canGoForward + } +} diff --git a/DynamicWebKit/README.md b/DynamicWebKit/README.md index 3f59978..40310c5 100644 --- a/DynamicWebKit/README.md +++ b/DynamicWebKit/README.md @@ -2,9 +2,9 @@ An example of how to use the Apple system fonts in a CSS stylesheet so static HTML content in a web view respects the user's choice of content size. -## Adding Support For Dark Mode +## Adding Support For Dark Mode And App Bound Domains -I've updated this project to support dark mode (requires iOS 13). +I've updated this project to support dark mode (requires iOS 13) and app bound domains (iOS 14). ## Further Details @@ -12,3 +12,4 @@ For further details see the following blog posts: + [Using Dynamic Type With Web Views](https://useyourloaf.com/blog/using-dynamic-type-with-web-views/) + [Supporting Dark Mode In WkWebView](https://useyourloaf.com/blog/supporting-dark-mode-in-wkwebview/) ++ [App Bound Domains](https://useyourloaf.com/blog/app-bound-domains/) From a8f39bb8f76ab314acaad36dcbe72337ba0f584d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 14 May 2021 14:38:19 +0100 Subject: [PATCH 07/12] Create FUNDING.yml --- .github/FUNDING.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..dfe500f --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1 @@ +github: [kharrison] From 217ff38ee40b6dc2f484249d8c3450d2d4839ad8 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 19 May 2021 22:32:54 +0100 Subject: [PATCH 08/12] Update DynamicText for Xcode 12 and add Swift version --- .../DynamicText.xcodeproj/project.pbxproj | 233 ++++++++-- .../AccentColor.colorset/Contents.json | 38 ++ .../AppIcon.appiconset/Contents.json | 0 .../AppIcon.appiconset/icon-1024.png | Bin .../AppIcon.appiconset/icon-120.png | Bin .../AppIcon.appiconset/icon-167.png | Bin .../AppIcon.appiconset/icon-180.png | Bin .../AppIcon.appiconset/icon-20.png | Bin .../AppIcon.appiconset/icon-29.png | Bin .../AppIcon.appiconset/icon-29@2x-1.png | Bin .../AppIcon.appiconset/icon-29@2x.png | Bin .../AppIcon.appiconset/icon-29@3x.png | Bin .../AppIcon.appiconset/icon-40.png | Bin .../AppIcon.appiconset/icon-40@2x-1.png | Bin .../AppIcon.appiconset/icon-40@2x.png | Bin .../AppIcon.appiconset/icon-41.png | Bin .../AppIcon.appiconset/icon-42.png | Bin .../AppIcon.appiconset/icon-60.png | Bin .../AppIcon.appiconset/icon-60@2x.png | Bin .../AppIcon.appiconset/icon-76.png | Bin .../AppIcon.appiconset/icon-76@2x.png | Bin .../DynamicText/Assets.xcassets/Contents.json | 6 + .../Tab Bar/First.imageset/Contents.json | 0 .../Tab Bar/First.imageset/first30.png | Bin .../Tab Bar/First.imageset/first60.png | Bin .../Tab Bar/First.imageset/first90.png | Bin .../Tab Bar/Second.imageset/Contents.json | 0 .../Tab Bar/Second.imageset/second30.png | Bin .../Tab Bar/Second.imageset/second60.png | Bin .../Tab Bar/Second.imageset/second90.png | Bin .../Base.lproj/LaunchScreen.storyboard | 72 ++- .../DynamicText/Base.lproj/Main.storyboard | 409 +++++++++++------- .../DynamicText/DynamicText-Prefix.pch | 16 - .../DynamicText/Images.xcassets/Contents.json | 6 - .../{DynamicText-Info.plist => Info.plist} | 0 .../DynamicText/UIFont+UYLScaledFont.h | 13 +- .../DynamicText/UIFont+UYLScaledFont.m | 15 +- DynamicText/DynamicText/UYLAppDelegate.h | 11 +- DynamicText/DynamicText/UYLAppDelegate.m | 10 +- .../UYLScaledTextStyleViewController.h | 33 +- .../UYLScaledTextStyleViewController.m | 52 ++- .../DynamicText/UYLTextStyleViewController.h | 19 +- .../DynamicText/UYLTextStyleViewController.m | 110 ++--- .../DynamicText/en.lproj/InfoPlist.strings | 2 - DynamicText/DynamicText/main.m | 7 +- .../DynamicTextSwift/AppDelegate.swift | 33 ++ .../AccentColor.colorset/Contents.json | 15 + .../AppIcon.appiconset/Contents.json | 116 +++++ .../AppIcon.appiconset/icon-1024.png | Bin 0 -> 56305 bytes .../AppIcon.appiconset/icon-120.png | Bin 0 -> 11031 bytes .../AppIcon.appiconset/icon-167.png | Bin 0 -> 11276 bytes .../AppIcon.appiconset/icon-180.png | Bin 0 -> 17230 bytes .../AppIcon.appiconset/icon-20.png | Bin 0 -> 736 bytes .../AppIcon.appiconset/icon-29.png | Bin 0 -> 821 bytes .../AppIcon.appiconset/icon-29@2x-1.png | Bin 0 -> 2535 bytes .../AppIcon.appiconset/icon-29@2x.png | Bin 0 -> 2561 bytes .../AppIcon.appiconset/icon-29@3x.png | Bin 0 -> 5904 bytes .../AppIcon.appiconset/icon-40.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-40@2x-1.png | Bin 0 -> 4680 bytes .../AppIcon.appiconset/icon-40@2x.png | Bin 0 -> 4710 bytes .../AppIcon.appiconset/icon-41.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-42.png | Bin 0 -> 1328 bytes .../AppIcon.appiconset/icon-60.png | Bin 0 -> 3017 bytes .../AppIcon.appiconset/icon-60@2x.png | Bin 0 -> 18310 bytes .../AppIcon.appiconset/icon-76.png | Bin 0 -> 4136 bytes .../AppIcon.appiconset/icon-76@2x.png | Bin 0 -> 17726 bytes .../Assets.xcassets/Contents.json | 6 + .../Tab Bar/First.imageset/Contents.json | 23 + .../Tab Bar/First.imageset/first30.png | Bin 0 -> 230 bytes .../Tab Bar/First.imageset/first60.png | Bin 0 -> 407 bytes .../Tab Bar/First.imageset/first90.png | Bin 0 -> 672 bytes .../Tab Bar/Second.imageset/Contents.json | 23 + .../Tab Bar/Second.imageset/second30.png | Bin 0 -> 110 bytes .../Tab Bar/Second.imageset/second60.png | Bin 0 -> 135 bytes .../Tab Bar/Second.imageset/second90.png | Bin 0 -> 148 bytes .../Base.lproj/LaunchScreen.storyboard | 115 +++++ .../Base.lproj/Main.storyboard | 315 ++++++++++++++ DynamicText/DynamicTextSwift/Info.plist | 66 +++ .../DynamicTextSwift/SceneDelegate.swift | 33 ++ .../DynamicTextSwift/UIFont+Extension.swift | 36 ++ .../UYLScaledTextStyleViewController.swift | 68 +++ .../UYLTextStyleViewController.swift | 68 +++ DynamicText/README.md | 7 +- 83 files changed, 1615 insertions(+), 361 deletions(-) create mode 100644 DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-1024.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-120.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-167.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-180.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-20.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@2x-1.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-29@3x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40@2x-1.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-40@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-41.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-42.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-60@2x.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-76.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/AppIcon.appiconset/icon-76@2x.png (100%) create mode 100644 DynamicText/DynamicText/Assets.xcassets/Contents.json rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first30.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/First.imageset/first90.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/Contents.json (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second30.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second60.png (100%) rename DynamicText/DynamicText/{Images.xcassets => Assets.xcassets}/Tab Bar/Second.imageset/second90.png (100%) delete mode 100644 DynamicText/DynamicText/DynamicText-Prefix.pch delete mode 100644 DynamicText/DynamicText/Images.xcassets/Contents.json rename DynamicText/DynamicText/{DynamicText-Info.plist => Info.plist} (100%) delete mode 100644 DynamicText/DynamicText/en.lproj/InfoPlist.strings create mode 100644 DynamicText/DynamicTextSwift/AppDelegate.swift create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-180.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-41.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-42.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first30.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/Contents.json create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second30.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second60.png create mode 100644 DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png create mode 100644 DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard create mode 100644 DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard create mode 100644 DynamicText/DynamicTextSwift/Info.plist create mode 100644 DynamicText/DynamicTextSwift/SceneDelegate.swift create mode 100644 DynamicText/DynamicTextSwift/UIFont+Extension.swift create mode 100644 DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift create mode 100644 DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift diff --git a/DynamicText/DynamicText.xcodeproj/project.pbxproj b/DynamicText/DynamicText.xcodeproj/project.pbxproj index 8707dce..cf90168 100644 --- a/DynamicText/DynamicText.xcodeproj/project.pbxproj +++ b/DynamicText/DynamicText.xcodeproj/project.pbxproj @@ -9,14 +9,18 @@ /* Begin PBXBuildFile section */ 531B320A1861EFB6005F2332 /* UYLScaledTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */; }; 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */; }; - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52D17F83CB600AD2292 /* Foundation.framework */; }; - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */; }; - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5393B53117F83CB600AD2292 /* UIKit.framework */; }; - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53617F83CB600AD2292 /* InfoPlist.strings */; }; - 5393B53A17F83CB600AD2292 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53917F83CB600AD2292 /* main.m */; }; + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB72655769D0033DD1E /* AppDelegate.swift */; }; + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AB92655769D0033DD1E /* SceneDelegate.swift */; }; + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */; }; + 53855ACA265577880033DD1E /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 53855AC9265577880033DD1E /* main.m */; }; + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */; }; + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD1265581DE0033DD1E /* Main.storyboard */; }; + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD42655834B0033DD1E /* Assets.xcassets */; }; + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 53855AD6265583680033DD1E /* LaunchScreen.storyboard */; }; + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */; }; 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */; }; 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 5393B53F17F83CB600AD2292 /* Main.storyboard */; }; - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Images.xcassets */; }; + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 5393B54517F83CB600AD2292 /* Assets.xcassets */; }; 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */; }; 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */ = {isa = PBXBuildFile; fileRef = 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */; }; /* End PBXBuildFile section */ @@ -26,18 +30,26 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLScaledTextStyleViewController.m; sourceTree = ""; }; 5325F8AD18020B0B0000A32A /* README.md */ = {isa = PBXFileReference; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 53615D2E1F41B67900C7D904 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicTextSwift.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 53855AB72655769D0033DD1E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 53855AB92655769D0033DD1E /* SceneDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SceneDelegate.swift; sourceTree = ""; }; + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLTextStyleViewController.swift; sourceTree = ""; }; + 53855AC52655769E0033DD1E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 53855AC9265577880033DD1E /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UYLScaledTextStyleViewController.swift; sourceTree = ""; }; + 53855AD2265581DE0033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 53855AD42655834B0033DD1E /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 53855AD7265583680033DD1E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIFont+Extension.swift"; sourceTree = ""; }; 5393B52A17F83CB600AD2292 /* DynamicText.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DynamicText.app; sourceTree = BUILT_PRODUCTS_DIR; }; 5393B52D17F83CB600AD2292 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 5393B52F17F83CB600AD2292 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 5393B53117F83CB600AD2292 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "DynamicText-Info.plist"; sourceTree = ""; }; - 5393B53717F83CB600AD2292 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; - 5393B53917F83CB600AD2292 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "DynamicText-Prefix.pch"; sourceTree = ""; }; + 5393B53517F83CB600AD2292 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = UYLAppDelegate.h; sourceTree = ""; }; 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = UYLAppDelegate.m; sourceTree = ""; }; 5393B54017F83CB600AD2292 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; - 5393B54517F83CB600AD2292 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; + 5393B54517F83CB600AD2292 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; 5393B54C17F83CB600AD2292 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UYLTextStyleViewController.h; sourceTree = ""; }; 5393B56317F83DB000AD2292 /* UYLTextStyleViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = UYLTextStyleViewController.m; sourceTree = ""; }; @@ -46,24 +58,45 @@ /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ + 53855AB22655769D0033DD1E /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52717F83CB600AD2292 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53017F83CB600AD2292 /* CoreGraphics.framework in Frameworks */, - 5393B53217F83CB600AD2292 /* UIKit.framework in Frameworks */, - 5393B52E17F83CB600AD2292 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 53855AB62655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXGroup; + children = ( + 53855AD42655834B0033DD1E /* Assets.xcassets */, + 53855AD1265581DE0033DD1E /* Main.storyboard */, + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */, + 53855AB72655769D0033DD1E /* AppDelegate.swift */, + 53855AB92655769D0033DD1E /* SceneDelegate.swift */, + 53855ABB2655769D0033DD1E /* UYLTextStyleViewController.swift */, + 53855ACF26557D590033DD1E /* UYLScaledTextStyleViewController.swift */, + 53855AD92655AAA70033DD1E /* UIFont+Extension.swift */, + 53855AC52655769E0033DD1E /* Info.plist */, + ); + path = DynamicTextSwift; + sourceTree = ""; + }; 5393B52117F83CB600AD2292 = { isa = PBXGroup; children = ( 5325F8AD18020B0B0000A32A /* README.md */, 5393B53317F83CB600AD2292 /* DynamicText */, + 53855AB62655769D0033DD1E /* DynamicTextSwift */, 5393B52C17F83CB600AD2292 /* Frameworks */, 5393B52B17F83CB600AD2292 /* Products */, ); @@ -73,6 +106,7 @@ isa = PBXGroup; children = ( 5393B52A17F83CB600AD2292 /* DynamicText.app */, + 53855AB52655769D0033DD1E /* DynamicTextSwift.app */, ); name = Products; sourceTree = ""; @@ -91,6 +125,7 @@ 5393B53317F83CB600AD2292 /* DynamicText */ = { isa = PBXGroup; children = ( + 5393B53F17F83CB600AD2292 /* Main.storyboard */, 5393B53C17F83CB600AD2292 /* UYLAppDelegate.h */, 5393B53D17F83CB600AD2292 /* UYLAppDelegate.m */, 5393B56217F83DB000AD2292 /* UYLTextStyleViewController.h */, @@ -99,9 +134,8 @@ 531B32091861EFB6005F2332 /* UYLScaledTextStyleViewController.m */, 53FE524A1871CDB700DE5F24 /* UIFont+UYLScaledFont.h */, 53FE524B1871CDB700DE5F24 /* UIFont+UYLScaledFont.m */, - 5393B53F17F83CB600AD2292 /* Main.storyboard */, + 5393B54517F83CB600AD2292 /* Assets.xcassets */, 53615D2D1F41B67900C7D904 /* LaunchScreen.storyboard */, - 5393B54517F83CB600AD2292 /* Images.xcassets */, 5393B53417F83CB600AD2292 /* Supporting Files */, ); path = DynamicText; @@ -110,10 +144,8 @@ 5393B53417F83CB600AD2292 /* Supporting Files */ = { isa = PBXGroup; children = ( - 5393B53517F83CB600AD2292 /* DynamicText-Info.plist */, - 5393B53617F83CB600AD2292 /* InfoPlist.strings */, - 5393B53917F83CB600AD2292 /* main.m */, - 5393B53B17F83CB600AD2292 /* DynamicText-Prefix.pch */, + 53855AC9265577880033DD1E /* main.m */, + 5393B53517F83CB600AD2292 /* Info.plist */, ); name = "Supporting Files"; sourceTree = ""; @@ -121,6 +153,23 @@ /* End PBXGroup section */ /* Begin PBXNativeTarget section */ + 53855AB42655769D0033DD1E /* DynamicTextSwift */ = { + isa = PBXNativeTarget; + buildConfigurationList = 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */; + buildPhases = ( + 53855AB12655769D0033DD1E /* Sources */, + 53855AB22655769D0033DD1E /* Frameworks */, + 53855AB32655769D0033DD1E /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = DynamicTextSwift; + productName = DynamicTextSwift; + productReference = 53855AB52655769D0033DD1E /* DynamicTextSwift.app */; + productType = "com.apple.product-type.application"; + }; 5393B52917F83CB600AD2292 /* DynamicText */ = { isa = PBXNativeTarget; buildConfigurationList = 5393B55C17F83CB600AD2292 /* Build configuration list for PBXNativeTarget "DynamicText" */; @@ -145,8 +194,14 @@ isa = PBXProject; attributes = { CLASSPREFIX = UYL; - LastUpgradeCheck = 1120; + LastSwiftUpdateCheck = 1250; + LastUpgradeCheck = 1250; ORGANIZATIONNAME = "Keith Harrison"; + TargetAttributes = { + 53855AB42655769D0033DD1E = { + CreatedOnToolsVersion = 12.5; + }; + }; }; buildConfigurationList = 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */; compatibilityVersion = "Xcode 11.0"; @@ -162,18 +217,28 @@ projectRoot = ""; targets = ( 5393B52917F83CB600AD2292 /* DynamicText */, + 53855AB42655769D0033DD1E /* DynamicTextSwift */, ); }; /* End PBXProject section */ /* Begin PBXResourcesBuildPhase section */ + 53855AB32655769D0033DD1E /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD8265583680033DD1E /* LaunchScreen.storyboard in Resources */, + 53855AD52655834B0033DD1E /* Assets.xcassets in Resources */, + 53855AD3265581DE0033DD1E /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52817F83CB600AD2292 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B54617F83CB600AD2292 /* Images.xcassets in Resources */, + 5393B54617F83CB600AD2292 /* Assets.xcassets in Resources */, 53615D2F1F41B67900C7D904 /* LaunchScreen.storyboard in Resources */, - 5393B53817F83CB600AD2292 /* InfoPlist.strings in Resources */, 5393B54117F83CB600AD2292 /* Main.storyboard in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -181,11 +246,23 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ + 53855AB12655769D0033DD1E /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 53855AD026557D590033DD1E /* UYLScaledTextStyleViewController.swift in Sources */, + 53855ABC2655769D0033DD1E /* UYLTextStyleViewController.swift in Sources */, + 53855AB82655769D0033DD1E /* AppDelegate.swift in Sources */, + 53855ADA2655AAA70033DD1E /* UIFont+Extension.swift in Sources */, + 53855ABA2655769D0033DD1E /* SceneDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; 5393B52617F83CB600AD2292 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 5393B53A17F83CB600AD2292 /* main.m in Sources */, + 53855ACA265577880033DD1E /* main.m in Sources */, 5393B56417F83DB000AD2292 /* UYLTextStyleViewController.m in Sources */, 5393B53E17F83CB600AD2292 /* UYLAppDelegate.m in Sources */, 53FE524C1871CDB700DE5F24 /* UIFont+UYLScaledFont.m in Sources */, @@ -204,12 +281,20 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; - 5393B53617F83CB600AD2292 /* InfoPlist.strings */ = { + 53855AD1265581DE0033DD1E /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 53855AD2265581DE0033DD1E /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 53855AD6265583680033DD1E /* LaunchScreen.storyboard */ = { isa = PBXVariantGroup; children = ( - 5393B53717F83CB600AD2292 /* en */, + 53855AD7265583680033DD1E /* Base */, ); - name = InfoPlist.strings; + name = LaunchScreen.storyboard; sourceTree = ""; }; 5393B53F17F83CB600AD2292 /* Main.storyboard */ = { @@ -223,6 +308,73 @@ /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ + 53855AC72655769E0033DD1E /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 53855AC82655769E0033DD1E /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_STYLE = Automatic; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = LCC2J94N44; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = DynamicTextSwift/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 14.5; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.DynamicTextSwift; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; 5393B55A17F83CB600AD2292 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { @@ -246,6 +398,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -299,6 +452,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -326,12 +480,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -343,12 +497,12 @@ isa = XCBuildConfiguration; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; - CURRENT_PROJECT_VERSION = 1.3; + CURRENT_PROJECT_VERSION = 1.4; DEVELOPMENT_TEAM = LCC2J94N44; GCC_PRECOMPILE_PREFIX_HEADER = YES; - GCC_PREFIX_HEADER = "DynamicText/DynamicText-Prefix.pch"; - INFOPLIST_FILE = "DynamicText/DynamicText-Info.plist"; - MARKETING_VERSION = 1.3; + GCC_PREFIX_HEADER = ""; + INFOPLIST_FILE = DynamicText/Info.plist; + MARKETING_VERSION = 1.4; PRODUCT_BUNDLE_IDENTIFIER = "com.useyourloaf.${PRODUCT_NAME:rfc1034identifier}"; PRODUCT_NAME = "$(TARGET_NAME)"; TARGETED_DEVICE_FAMILY = "1,2"; @@ -359,6 +513,15 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ + 53855AC62655769E0033DD1E /* Build configuration list for PBXNativeTarget "DynamicTextSwift" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 53855AC72655769E0033DD1E /* Debug */, + 53855AC82655769E0033DD1E /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; 5393B52517F83CB600AD2292 /* Build configuration list for PBXProject "DynamicText" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..22c4bb0 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,38 @@ +{ + "colors" : [ + { + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + }, + { + "appearances" : [ + { + "appearance" : "luminosity", + "value" : "dark" + } + ], + "color" : { + "color-space" : "srgb", + "components" : { + "alpha" : "1.000", + "blue" : "1.000", + "green" : "1.000", + "red" : "1.000" + } + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-1024.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-1024.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-120.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-120.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-167.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-167.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-180.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-180.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-20.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-20.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-29@3x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-29@3x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x-1.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x-1.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-40@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-41.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-41.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-42.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-42.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-60@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76.png diff --git a/DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png b/DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/AppIcon.appiconset/icon-76@2x.png rename to DynamicText/DynamicText/Assets.xcassets/AppIcon.appiconset/icon-76@2x.png diff --git a/DynamicText/DynamicText/Assets.xcassets/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Contents.json new file mode 100644 index 0000000..73c0059 --- /dev/null +++ b/DynamicText/DynamicText/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/First.imageset/first90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/First.imageset/first90.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/Contents.json rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/Contents.json diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second30.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second30.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second60.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second60.png diff --git a/DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png similarity index 100% rename from DynamicText/DynamicText/Images.xcassets/Tab Bar/Second.imageset/second90.png rename to DynamicText/DynamicText/Assets.xcassets/Tab Bar/Second.imageset/second90.png diff --git a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard index f746012..e16eba7 100644 --- a/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard +++ b/DynamicText/DynamicText/Base.lproj/LaunchScreen.storyboard @@ -1,15 +1,14 @@ - - - - + + - + + - + @@ -18,18 +17,17 @@ - + - + - - + - + @@ -38,16 +36,15 @@ - + - + - - + @@ -61,17 +58,58 @@ - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/Base.lproj/Main.storyboard b/DynamicText/DynamicText/Base.lproj/Main.storyboard index f069627..2606c66 100644 --- a/DynamicText/DynamicText/Base.lproj/Main.storyboard +++ b/DynamicText/DynamicText/Base.lproj/Main.storyboard @@ -1,200 +1,260 @@ - + - + + + + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + - - - - - - - + + + + + + + + + + + + + + + + + + + + - + - + - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + - - - - - - - - - - - - - - - - - - - - + + + + - - + + - + + + + + + + + + + + + + - + @@ -208,17 +268,58 @@ - - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicText/DynamicText-Prefix.pch b/DynamicText/DynamicText/DynamicText-Prefix.pch deleted file mode 100644 index 82a2bb4..0000000 --- a/DynamicText/DynamicText/DynamicText-Prefix.pch +++ /dev/null @@ -1,16 +0,0 @@ -// -// Prefix header -// -// The contents of this file are implicitly included at the beginning of every source file. -// - -#import - -#ifndef __IPHONE_5_0 -#warning "This project uses features only available in iOS SDK 5.0 and later." -#endif - -#ifdef __OBJC__ - #import - #import -#endif diff --git a/DynamicText/DynamicText/Images.xcassets/Contents.json b/DynamicText/DynamicText/Images.xcassets/Contents.json deleted file mode 100644 index da4a164..0000000 --- a/DynamicText/DynamicText/Images.xcassets/Contents.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "info" : { - "version" : 1, - "author" : "xcode" - } -} \ No newline at end of file diff --git a/DynamicText/DynamicText/DynamicText-Info.plist b/DynamicText/DynamicText/Info.plist similarity index 100% rename from DynamicText/DynamicText/DynamicText-Info.plist rename to DynamicText/DynamicText/Info.plist diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.h b/DynamicText/DynamicText/UIFont+UYLScaledFont.h index 3dc52dd..3704d97 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.h +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.h @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,11 +26,11 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UIFont (UYLScaledFont) -// +uylPreferredFontForTextStyle:scale: +// +preferredFontForTextStyle:scale: // // Return a UIFont object for the specified text style that is scaled by the // speficied scale factor. @@ -45,6 +40,6 @@ // The scaleFactor modifies the default point size of the text style. So for // a font that is twice the default size specify a scaleFactor of 2.0. -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor; @end diff --git a/DynamicText/DynamicText/UIFont+UYLScaledFont.m b/DynamicText/DynamicText/UIFont+UYLScaledFont.m index 0efddd2..781264b 100644 --- a/DynamicText/DynamicText/UIFont+UYLScaledFont.m +++ b/DynamicText/DynamicText/UIFont+UYLScaledFont.m @@ -1,9 +1,4 @@ -// -// UIFont+UYLScaledFont.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -35,12 +30,10 @@ @implementation UIFont (UYLScaledFont) -+ (UIFont *)uylPreferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor ++ (UIFont *)preferredFontForTextStyle:(NSString *)style scale:(CGFloat)scaleFactor { - UIFontDescriptor *descriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:style]; - CGFloat pointSize = descriptor.pointSize * scaleFactor; - UIFont *font = [UIFont fontWithDescriptor:descriptor size:pointSize]; - return font; + UIFont *font = [UIFont preferredFontForTextStyle:style]; + return [font fontWithSize:font.pointSize * scaleFactor]; } @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.h b/DynamicText/DynamicText/UYLAppDelegate.h index 5efc6de..920cfe0 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.h +++ b/DynamicText/DynamicText/UYLAppDelegate.h @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -31,10 +26,8 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -#import +@import UIKit; @interface UYLAppDelegate : UIResponder - @property (strong, nonatomic) UIWindow *window; - @end diff --git a/DynamicText/DynamicText/UYLAppDelegate.m b/DynamicText/DynamicText/UYLAppDelegate.m index 59ba911..5a307a4 100644 --- a/DynamicText/DynamicText/UYLAppDelegate.m +++ b/DynamicText/DynamicText/UYLAppDelegate.m @@ -1,9 +1,4 @@ -// -// UYLAppDelegate.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -33,5 +28,4 @@ #import "UYLAppDelegate.h" @implementation UYLAppDelegate - -@end \ No newline at end of file +@end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h index 3c408b4..986a63c 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.h @@ -1,13 +1,32 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. // -// UYLScaledTextStyleViewController.h -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison on 18/12/2013. -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. -#import "UYLTextStyleViewController.h" - -@interface UYLScaledTextStyleViewController : UYLTextStyleViewController +@import UIKit; +@interface UYLScaledTextStyleViewController : UIViewController @end diff --git a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m index 5214e5e..b706e52 100644 --- a/DynamicText/DynamicText/UYLScaledTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLScaledTextStyleViewController.m @@ -9,22 +9,56 @@ #import "UYLScaledTextStyleViewController.h" #import "UIFont+UYLScaledFont.h" +@interface UYLScaledTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLScaledTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)configureView -{ +- (void)viewDidLoad { + [super viewDidLoad]; + [self configureView]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; +} + +- (void)configureView { CGFloat scaleFactor = 2.0; - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; - self.headlineLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; - self.subheadLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; - self.bodyLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; - self.caption1Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; - self.caption2Label.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; - self.footnoteLabel.font = [UIFont uylPreferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1 scale:scaleFactor]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2 scale:scaleFactor]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3 scale:scaleFactor]; + self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline scale:scaleFactor]; + self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline scale:scaleFactor]; + self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody scale:scaleFactor]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout scale:scaleFactor]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote scale:scaleFactor]; + self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1 scale:scaleFactor]; + self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2 scale:scaleFactor]; } +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - + +- (void)updateTextStyles:(NSNotification *)notification { + [self configureView]; +} @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.h b/DynamicText/DynamicText/UYLTextStyleViewController.h index 88bbcef..6c64a99 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.h +++ b/DynamicText/DynamicText/UYLTextStyleViewController.h @@ -1,9 +1,4 @@ -// -// UYLTableViewController.h -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: @@ -30,17 +25,7 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -#import +@import UIKit; @interface UYLTextStyleViewController : UIViewController - -@property (weak, nonatomic) IBOutlet UILabel *textSizeLabel; -@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; -@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; -@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; -@property (weak, nonatomic) IBOutlet UILabel *caption1Label; -@property (weak, nonatomic) IBOutlet UILabel *caption2Label; -@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; - @end diff --git a/DynamicText/DynamicText/UYLTextStyleViewController.m b/DynamicText/DynamicText/UYLTextStyleViewController.m index 6871248..98b752d 100644 --- a/DynamicText/DynamicText/UYLTextStyleViewController.m +++ b/DynamicText/DynamicText/UYLTextStyleViewController.m @@ -1,77 +1,83 @@ +// Copyright © 2013-2021 Keith Harrison. All rights reserved. // -// UYLTableViewController.m -// DynamicText +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: // -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. // -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. // -// Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. // -// Redistributions in binary form must reproduce the above copyright -// notice, this list of conditions and the following disclaimer in the -// documentation and/or other materials provided with the distribution. -// -// Neither the name of Keith Harrison nor the names of its contributors -// may be used to endorse or promote products derived from this software -// without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER ''AS IS'' AND ANY -// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY -// DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -// ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. #import "UYLTextStyleViewController.h" +@interface UYLTextStyleViewController () +@property (strong, nonatomic) IBOutletCollection(UILabel) NSArray *allLabels; + +@property (weak, nonatomic) IBOutlet UILabel *title1Label; +@property (weak, nonatomic) IBOutlet UILabel *title2Label; +@property (weak, nonatomic) IBOutlet UILabel *title3Label; +@property (weak, nonatomic) IBOutlet UILabel *headlineLabel; +@property (weak, nonatomic) IBOutlet UILabel *subheadLabel; +@property (weak, nonatomic) IBOutlet UILabel *bodyLabel; +@property (weak, nonatomic) IBOutlet UILabel *calloutLabel; +@property (weak, nonatomic) IBOutlet UILabel *footnoteLabel; +@property (weak, nonatomic) IBOutlet UILabel *caption1Label; +@property (weak, nonatomic) IBOutlet UILabel *caption2Label; +@end + @implementation UYLTextStyleViewController #pragma mark - #pragma mark === View Life Cycle === #pragma mark - -- (void)viewDidLoad -{ - [super viewDidLoad]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(didChangePreferredContentSize:) - name:UIContentSizeCategoryDidChangeNotification - object:nil]; +- (void)viewDidLoad { + [super viewDidLoad]; + if (@available(iOS 10, *)) { + for (UILabel *label in self.allLabels) { + label.adjustsFontForContentSizeCategory = YES; + } + } else { + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(updateTextStyles:) + name:UIContentSizeCategoryDidChangeNotification + object:nil]; + } } -- (void)viewDidAppear:(BOOL)animated -{ - [super viewDidAppear:animated]; - [self configureView]; -} +#pragma mark - +#pragma mark === Notification Methods === +#pragma mark - -- (void)configureView -{ - self.textSizeLabel.text = [[UIApplication sharedApplication] preferredContentSizeCategory]; +- (void)updateTextStyles:(NSNotification *)notification { + self.title1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle1]; + self.title2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle2]; + self.title3Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleTitle3]; self.headlineLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline]; self.subheadLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleSubheadline]; self.bodyLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + self.calloutLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCallout]; + self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; self.caption1Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption1]; self.caption2Label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleCaption2]; - self.footnoteLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; -} - -#pragma mark - -#pragma mark === Notification Methods === -#pragma mark - - -- (void)didChangePreferredContentSize:(NSNotification *)notification -{ - [self configureView]; } @end diff --git a/DynamicText/DynamicText/en.lproj/InfoPlist.strings b/DynamicText/DynamicText/en.lproj/InfoPlist.strings deleted file mode 100644 index 477b28f..0000000 --- a/DynamicText/DynamicText/en.lproj/InfoPlist.strings +++ /dev/null @@ -1,2 +0,0 @@ -/* Localized versions of Info.plist keys */ - diff --git a/DynamicText/DynamicText/main.m b/DynamicText/DynamicText/main.m index 94553a1..0530728 100644 --- a/DynamicText/DynamicText/main.m +++ b/DynamicText/DynamicText/main.m @@ -1,9 +1,4 @@ -// -// main.m -// DynamicText -// -// Created by Keith Harrison http://useyourloaf.com -// Copyright (c) 2013 Keith Harrison. All rights reserved. +// Copyright (c) 2013-2021 Keith Harrison. All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: diff --git a/DynamicText/DynamicTextSwift/AppDelegate.swift b/DynamicText/DynamicTextSwift/AppDelegate.swift new file mode 100644 index 0000000..972061e --- /dev/null +++ b/DynamicText/DynamicTextSwift/AppDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +@main +class AppDelegate: UIResponder, UIApplicationDelegate { +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 0000000..9b711cb --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,15 @@ +{ + "colors" : [ + { + "color" : { + "platform" : "ios", + "reference" : "systemBlueColor" + }, + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..1120389 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,116 @@ +{ + "images" : [ + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-40.png", + "scale" : "2x" + }, + { + "size" : "20x20", + "idiom" : "iphone", + "filename" : "icon-60.png", + "scale" : "3x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@2x.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "iphone", + "filename" : "icon-29@3x.png", + "scale" : "3x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-40@2x.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "iphone", + "filename" : "icon-120.png", + "scale" : "3x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-60@2x.png", + "scale" : "2x" + }, + { + "size" : "60x60", + "idiom" : "iphone", + "filename" : "icon-180.png", + "scale" : "3x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-20.png", + "scale" : "1x" + }, + { + "size" : "20x20", + "idiom" : "ipad", + "filename" : "icon-41.png", + "scale" : "2x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29.png", + "scale" : "1x" + }, + { + "size" : "29x29", + "idiom" : "ipad", + "filename" : "icon-29@2x-1.png", + "scale" : "2x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-42.png", + "scale" : "1x" + }, + { + "size" : "40x40", + "idiom" : "ipad", + "filename" : "icon-40@2x-1.png", + "scale" : "2x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76.png", + "scale" : "1x" + }, + { + "size" : "76x76", + "idiom" : "ipad", + "filename" : "icon-76@2x.png", + "scale" : "2x" + }, + { + "size" : "83.5x83.5", + "idiom" : "ipad", + "filename" : "icon-167.png", + "scale" : "2x" + }, + { + "size" : "1024x1024", + "idiom" : "ios-marketing", + "filename" : "icon-1024.png", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-1024.png new file mode 100644 index 0000000000000000000000000000000000000000..4a1a9de7f6ad69ba2280fc5250c4368846b7921e GIT binary patch literal 56305 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 Y^-*HM%6=&H7sNNxH`Ob=>iF!x09e}G4*&oF literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-120.png new file mode 100644 index 0000000000000000000000000000000000000000..d4b42eb733c454496d3f006ee95be509b23a5971 GIT binary patch literal 11031 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 R>I(n>002ovPDHLkV1hPf$(8^B literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-167.png new file mode 100644 index 0000000000000000000000000000000000000000..0a5ec66a8746d77c19afa4db06b0e9e27145e92d GIT binary patch literal 11276 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-20.png new file mode 100644 index 0000000000000000000000000000000000000000..3c16adf7399bfbac2f393af203271775d21ea91d GIT binary patch literal 736 zcmV<60w4W}P)xN#0004uP)t-s0dL;; z?1cC2iu~#){puI`>r?&e5&h~C`0a%J>oEH3UH9#f_wA4T>K^**Sp4cH`0a}L>~{I= zb^Pib{puF@>~;I=IsEH6{OU0H?0o#{FZt|t`s-Z!>r(maXZh=B`Rii)>O%bMC;IDQ z{OS_@>K^&*Z~E(5{pub2>pJ)Cll$vK`|C{k>~8z(OZe=4`0bEbnze(muQ7+r>gSGw zu%Gzti#LkI`0RcRblEb8$CSFD7kbs|<7Hf(vO$l*_U)7U>tgrqlK1SA=iy@6+jslx zQ~B#*BY@Af%98u*P4w%FiL;JqqoK>xeWSvo`|CvV=UiZ(qac3DE``ECj<@jWfUw7W zkhYEych)(Jx)FEOiL-_D=sx-CJDa}dPyFnz3u`|3LT z>oD@=Hh-;#@#Q!B>Mwn*qx}UAwgZ%3z_UU6!mbW*G!|ml~>ES*6>K6Iy zUH$74^ypwplesd7#r*0K_w9@O>q7nM5&r8D*|JoE0003GNkl$lC?wr$(CZN7N3*K5DoOtL8Y)4{5XRW~XO!?4-dSWV!n<9YsrGF(IDa`80aR8{3v zj^oCw=rCQOq1;m4GH32^I1D$5x}(uSpxN*7dx#%-mUduZtMnI=yUE_#w)#bo#-_@% zu|(n$sm|2RE&kozXZy2w(slji6_&TwSS+T)kxwSKVcO|&FpwmvPm<-7# zGXm3S8FPV&VrB}Mo&jdlpCpZgLS|`sWp!1v427>`;nidM}?LUOHL+$AJ!U_FOv+3oWm=fC7;`ilR^S(X-%Lkrg5?m$B|0HhMw#Y;*RcKaH4`+6CI?mc+I`X#^YBi%zEO5BUo zOuc84yCAxk#)~(VCarsPr?;v1Fz@z266J_)_yxONRCkf8-N%Q%)ac^a_0vPVkzu!k zq`fGL5@Xk6_s6aW4US`Y*llg;txdg^2Oaz_=gD(DUTJ(DyD)eAC|n9Ak&cwuZDy&O zQi@V@$`Trdlzn&MCM?a;8zyVuLE#N7PDd}VU1{}Z)3Y>6)*a}L`(Qk&V7HEkd#GQ( z(rm+l9;4QdYCLmx-eGG$>u^{eg?C$@$U1mqooVw1uN=2>PoE1HTAHl3#eKS$Hm{>u zyaw1v9a+8YylL`8gbIvUZQiMF@#-pa34#R7;O>ewwE=-KVE zg-0z7G5SZ39e1u)vU#ZhdMWG{_mw~@HtcT^Vt2rbK{hWY9-|ZL*e&cUMCky!Z^Y`} zA$Ds_nQlvu9SM$_!}2*iZ=m|qCx+Nf-+!&c^8h_Yp(L8ab2vOZP?2RHyi6YYvFpy4 z8(k2`_gWv39+Pau<=OCiGdesYrQ*}}2WaAlt~(ZPZ-|>+M=E6)uu4qdyn_EVLjaaR zb6IMKr*;^ma=FJl@>F-PXU1Q?-}>;-l^u**X>cRV-&XJYF5B^S)4ob{<1+sfqmmL` zbNSyMMxOVB#|pQa)BoPJw2pWD3-`XiD9u~{3|ZNB?$+A)L~u#yh~N8bkY8N>3l$>w z@c1v-{my0I6ZG(S=m+0YYH{pKmwibo`9c;a3Uvin-XK56?k92VW09^nQVGeGx&piJ z$Lc+~gIu&Y{!Sbd-c~vi#8J5c*DuOtJbyb8(SyWh4HWAp00000NkvXXu0mjfk&l*@ literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x-1.png new file mode 100644 index 0000000000000000000000000000000000000000..3c599a552c33fae613e1ab51f03e7e7434bbcb81 GIT binary patch literal 2535 zcmV3lX0h#lWXSWo;P(4KWM`Cimf}wNl~&^|7!&o? z@NN0lK?e@Sm!kdd@j1OFhjCe}33J-EEuW!0^f?=A+UA2KvaqbgJ~cwvG)q{4N;oOk z58g=PhUReJb!y6O>tEPaxgK~N;Xb!7=?6k{i%^nLhSc!7yxKFwb03aE%Ax~s?E<93 zNh)gj0p~fru7+^BHf@J1mK(O+KX29m9$C+YC$(0^+P12-ZQHhO+qP}nwpFb4YzH-_ zgZy_UH*+#KclvyPm1R#)=Dc}xa@0kXc=$fxGr=bkunp8oZ$mtTU@s!UA+xJq!6G4$ ziIUlz2^b~M%o9*am_TNejCCx)T_A|94~2nQY(YZZ8H1m~K5{O4+GjsKcfT&Uw%IcU zqmSTyi0I81PG2%}9jsj%3^7p<;Lal=N+l=((?BX0xiDy1qE*MkH7AQ+H~6y9yap}sDUfRf1})st!t+<*b|+3b)Sx{@|L|aAVS@Hm3HjlWV5r=@^_4pqNESs~Vj&944RhDnQTXXQfA7tgVn+ z6|#pt>~{zr1f`j!k*`+ZDY6BDRy|T-6fYT02{ z@!AD`5~xYlkRV}74S4fNV0W0+v$PcmSdg4I9DZM{=gFoD+pBhg?-#orryoTliWDLX zR3T-`T&tr*)esCwSd?%${@96n`%rb3AWfEFwP%pZ>)MxmVX^LtBv+Fnp~by5MZHYF zi+QWP+_aVi1B9@z(30lCGfeCbqS?R_u^^k1|NM(~3sQLoX*`3~UII7);`hi*Cgl_? zPuKXOp6X&g8sTr@0L8u31+qjr*c&9-L=0;5Oh~I707VCIDW;qCPb$v5Su;A(S&{b3 z-p*Jf?~hZRj<`4&Fx#@RSs+o_S5p75mA3)oUZ+|ed0#3W;AZ!Tx!z+>Vb5>~6(S-r z?vX&&hb^#Z2@8))Z$w>Av_1W)M4Dptc8j^*eNVBhYJyUdu!xMn?S*Jg!%P5Y6Rpl* z*WqZ#3!z2R2&<=S+|};8OJxf~n2*J5Q-=j-=m8?WC#Rbe4fbsgce(bZP^x3i+T9U{>r2%PK0#I?if;663RGU=g{&{x7*(frXp4kC+&qUy8?6nCiMaPiny8=k*C&G znj4U$KY@-XPUqNke~*X1@}&w^H^;=YUG`MV^WA2W~{mGL; ztS%0^)1CIz%Kw!cT1ksRX5NPdXXwmMm*nlX^; zS>*YGhQiLoZbz#4e+;|Sac=eZ_It0)kqoR3c7`ME_BAc~k;5fVE$gL1R%?%}9URNf zinuxAmgj-PFSbbrT;Ci&9`s$$fs>i%!eo?$0&^g1$F^kbz!Btf{nMDsE!RJ-maJ%y zpq?<@TE;e3FxBH+#00ms&2F5z4Cq*>-#6Jm;QH5Mie#-XBWCBy7zIF0HlSwbXCpB7 z(|HBjt5EFU6)wBLaXHFj63tcwWEf}Q0&|fAwk%vYJC5APVl-=ww$a<^^ zty7fN#e3-zMRM2j2FHd6+~%e=+@OGaaYz@|1S8r+{pa=MSH5byCL|kfzlwJ^G&zXr z#FD-$4l+QcxOK{g02JCax!B7zT6dbwGu(RI zv7l<>Lk$s3y54TZ!-lrd1myZsF58ctud3;d4zdbfuF-$Tj$s7sP*+N-W#Ed;aBI;Q z1#04~U0Oi^^j3#PTnH`C>m4&K*^aRtO{)6AepjbfJLTyb%S@@E<2D-c z;rErN-Rk%w(#K+HUE>`Ce6L&Gnsjy}GwenBut1hPZbFRdbQ8v9Z~o@<+rF46v@Z5| zVZ8$dGyj8@8(ABslXI=naqZ(qi|)6I(wbWQVg46aHrx#r7qn%f2mxU*q(OS6AJt|$ zdKz^R1;K7S^uB8MQ=2yiP<=oq+xA_$U>1=P;hb=(~iI+VIEiQ&-dfe2gufQRaYXmYH5 z+H_5$t^e!OERb`DVIUkGq3tWaGUNTP6u3ed_01Z7hP5MWHUe+99K3VLX1r@^aP&ql zYwN$le1w!UyPmZFDA_MpR&h2BQya(+$vu$ub5!b_x%*v!y5<|$5Mu`Kq5Z6IyJ=Z! zPn9dl6xfHz!(RdHnvWqFOd>snnH!(;D<))73d#tsNUsKa_ig=}xQIawQU5U{S|*Vn zbvBEDR1d&K67PZRNl;rFDRfw3!MK4uF}RrIiUTv}^5WCDWedi-=7FX7pzR!mFL9cO zSr_^dQINu=ITg{06rm?P(Rk$Q>RVlh2hTXAv2?RN&WP^fHK7fT4t9#;LOhr*H*2dK zvq9LR27#UfMH`+3hI)|y>Q@?+-5-!iR)2T(1$u?p;5-f0L#a!36i-X|OJoZlbhNHM zhoNfLb}&zMe$!FO62pZ!*41ZWH>cpV!_vs~s5}Tk+9*J6-fd2`{6@tB x1(_k&M9l=rA!vCn(U9(Dgbdgt>7mOqN{*4oF%$-ZPgei{002ovPDHLkV1oQ}-OB&~ literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-29@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..7759c83f4b10efb32e7c54af86c6cfd0adc14e64 GIT binary patch literal 2561 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 KMNUMnLSTa7Rs$~p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-40@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..611f339f038e238579905363c9ebca267886fe79 GIT binary patch literal 4710 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 LNkvXXu0mjf{o2?p literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..515d2b6dedfd7a88dc9b5ca7c610af06da0cdfb8 GIT binary patch literal 18310 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png b/DynamicText/DynamicTextSwift/Assets.xcassets/AppIcon.appiconset/icon-76.png new file mode 100644 index 0000000000000000000000000000000000000000..90d600a7aa8aeaaa2bcb278003fc7037805b61f1 GIT binary patch literal 4136 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 literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first60.png new file mode 100644 index 0000000000000000000000000000000000000000..975a75f185cc454be83c825024039b1f509ad2ed GIT binary patch literal 407 zcmV;I0cie-P)O23dr+15>~nGz@{8Fa#1ykPeA+|KipclEmO+onQI}h=>5} zBc8uTIJBryB894QRCr*8ylBM(6> zL4yTykOd7cIJ5*k39MTOF~4T4H(*yO zR)}&dQf&4g5{Xj(o0W$*uND%CR{!(Y!}EBAL}J8dPe>%5_Ji#&9sfzB literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/First.imageset/first90.png new file mode 100644 index 0000000000000000000000000000000000000000..92341c241ccd42707bad3cbe1440bb567666d8f8 GIT binary patch literal 672 zcmV;R0$=@!P)K8k-7#u8oU=X%sYIFcl{g-SKu9Zk7@937|?jb90E(oSjY&R`(&B9NwYMC z1GN1=$KMv4dS` zhbdx&sC5w%yx|CQ@`X1fh)|o_nBWAvu@fd}qp~$I!U1+?2aM1}WePCB7WQDa7$88Y z>tYRiaBFl?%7!?@O5%(mN>hLoR#GVfJajEAVI{Xj3lG^dHn57=;Q0}My*8(hI6}LoyyOqLfBE?-A!fIxSo7Tk{Rx@XGagze9VKucz0QdgDYHk46 zn%Kf>Zi^<|8o}h-2rjj8fXTN5+PHcXnEYdcs}^OR@yQ7huGarB$&}z~&0vyghN~3f z2$M`lgt)jKOn%kF#Z6)It0^w3fgS8uvO@!fdx1$VFM2+g;5q#YlU({J+!!XgjCCeh zf-}VhOmbPEaPKh5Wrf1+VUo)ph5LX>E*~h|3g%CbjyX(nnd{HH+er1oQi2zjKFpt9 z!DE=@5~FY(nB>yYKmPsg(9ltqzbT0HoOTuC;zE4EGRYT0U7+#zhO3ppGD)IKj{Z)F zbZyt)L>JNh9njWjg};%8g-SmxL^OcL-!#x!oqp1ihEl1^9292 zyvjeVV{=an2A|-bR%UvqC9wBTYmK$2TZ_82dR`w>s810R%y5J`Ibwzc5o%qCp2G)k zdI*t`YTyMuykd+L3%q0h;~fj67~>Va8+^h^DW#NBN~ym@K8_W5vJ&h70000^s(ZRPhEy;nFOYch-@ReJ!@oL}fA$Lh?TsWn{{;Tikhir@cp~n_$gnDM V{@G3a;))>SJYD@<);T3K0RY_vB*6dx literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png b/DynamicText/DynamicTextSwift/Assets.xcassets/Tab Bar/Second.imageset/second90.png new file mode 100644 index 0000000000000000000000000000000000000000..617046103b2a3723431d791c31b2bed762d53962 GIT binary patch literal 148 zcmeAS@N?(olHy`uVBq!ia0vp^Q6S933?yBTt(*v?cmjMvT!Azkn7%Zh2IMf81o;Is zcs_n~t~mh6HSu(D45?sDmN054{9j-4fkoxq7kTDC44uZwUH>J|JX(wdcf2y4^Yy_5 ZMuwbeb6+jl8O;YW+tbz0Wt~$(69DGqF&_W` literal 0 HcmV?d00001 diff --git a/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..e16eba7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,115 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard new file mode 100644 index 0000000..52c8196 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Base.lproj/Main.storyboard @@ -0,0 +1,315 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/DynamicText/DynamicTextSwift/Info.plist b/DynamicText/DynamicTextSwift/Info.plist new file mode 100644 index 0000000..5b531f7 --- /dev/null +++ b/DynamicText/DynamicTextSwift/Info.plist @@ -0,0 +1,66 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + $(PRODUCT_BUNDLE_PACKAGE_TYPE) + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UIApplicationSceneManifest + + UIApplicationSupportsMultipleScenes + + UISceneConfigurations + + UIWindowSceneSessionRoleApplication + + + UISceneConfigurationName + Default Configuration + UISceneDelegateClassName + $(PRODUCT_MODULE_NAME).SceneDelegate + UISceneStoryboardFile + Main + + + + + UIApplicationSupportsIndirectInputEvents + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/DynamicText/DynamicTextSwift/SceneDelegate.swift b/DynamicText/DynamicTextSwift/SceneDelegate.swift new file mode 100644 index 0000000..8b6fc47 --- /dev/null +++ b/DynamicText/DynamicTextSwift/SceneDelegate.swift @@ -0,0 +1,33 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +class SceneDelegate: UIResponder, UIWindowSceneDelegate { + var window: UIWindow? +} diff --git a/DynamicText/DynamicTextSwift/UIFont+Extension.swift b/DynamicText/DynamicTextSwift/UIFont+Extension.swift new file mode 100644 index 0000000..3174e89 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UIFont+Extension.swift @@ -0,0 +1,36 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +extension UIFont { + static func preferredFont(forTextStyle style: UIFont.TextStyle, scaleFactor: CGFloat) -> UIFont { + let font = UIFont.preferredFont(forTextStyle: style) + return font.withSize(font.pointSize * scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift new file mode 100644 index 0000000..9812038 --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLScaledTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLScaledTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private var title1Label: UILabel! + @IBOutlet private var title2Label: UILabel! + @IBOutlet private var title3Label: UILabel! + @IBOutlet private var headlineLabel: UILabel! + @IBOutlet private var subheadLabel: UILabel! + @IBOutlet private var bodyLabel: UILabel! + @IBOutlet private var calloutLabel: UILabel! + @IBOutlet private var footnoteLabel: UILabel! + @IBOutlet private var caption1Label: UILabel! + @IBOutlet private var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + configureView() + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + + @objc private func updateTextStyles(_ notification: Notification) { + configureView() + } + + private func configureView() { + let scaleFactor: CGFloat = 2.0 + + title1Label.font = UIFont.preferredFont(forTextStyle: .title1, scaleFactor: scaleFactor) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2, scaleFactor: scaleFactor) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3, scaleFactor: scaleFactor) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline, scaleFactor: scaleFactor) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline, scaleFactor: scaleFactor) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body, scaleFactor: scaleFactor) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout, scaleFactor: scaleFactor) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote, scaleFactor: scaleFactor) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1, scaleFactor: scaleFactor) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2, scaleFactor: scaleFactor) + } +} diff --git a/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift new file mode 100644 index 0000000..ecff87a --- /dev/null +++ b/DynamicText/DynamicTextSwift/UYLTextStyleViewController.swift @@ -0,0 +1,68 @@ +// Copyright © 2021 Keith Harrison. All rights reserved. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// 1. Redistributions of source code must retain the above copyright +// notice, this list of conditions and the following disclaimer. +// +// 2. Redistributions in binary form must reproduce the above copyright +// notice, this list of conditions and the following disclaimer in the +// documentation and/or other materials provided with the distribution. +// +// 3. Neither the name of the copyright holder nor the names of its +// contributors may be used to endorse or promote products derived from +// this software without specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE +// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF +// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN +// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +// POSSIBILITY OF SUCH DAMAGE. + +import UIKit + +final class UYLTextStyleViewController: UIViewController { + @IBOutlet private var allLabels: [UILabel]! + @IBOutlet private weak var title1Label: UILabel! + @IBOutlet private weak var title2Label: UILabel! + @IBOutlet private weak var title3Label: UILabel! + @IBOutlet private weak var headlineLabel: UILabel! + @IBOutlet private weak var subheadLabel: UILabel! + @IBOutlet private weak var bodyLabel: UILabel! + @IBOutlet private weak var calloutLabel: UILabel! + @IBOutlet private weak var footnoteLabel: UILabel! + @IBOutlet private weak var caption1Label: UILabel! + @IBOutlet private weak var caption2Label: UILabel! + + override func viewDidLoad() { + super.viewDidLoad() + + if #available(iOS 10, *) { + allLabels.forEach { + $0.adjustsFontForContentSizeCategory = true + } + } else { + NotificationCenter.default.addObserver(self, selector: #selector(updateTextStyles(_:)), name: UIContentSizeCategory.didChangeNotification, object: nil) + } + } + + @objc private func updateTextStyles(_ notification: Notification) { + title1Label.font = UIFont.preferredFont(forTextStyle: .title1) + title2Label.font = UIFont.preferredFont(forTextStyle: .title2) + title3Label.font = UIFont.preferredFont(forTextStyle: .title3) + headlineLabel.font = UIFont.preferredFont(forTextStyle: .headline) + subheadLabel.font = UIFont.preferredFont(forTextStyle: .subheadline) + bodyLabel.font = UIFont.preferredFont(forTextStyle: .body) + calloutLabel.font = UIFont.preferredFont(forTextStyle: .callout) + footnoteLabel.font = UIFont.preferredFont(forTextStyle: .footnote) + caption1Label.font = UIFont.preferredFont(forTextStyle: .caption1) + caption2Label.font = UIFont.preferredFont(forTextStyle: .caption2) + } +} diff --git a/DynamicText/README.md b/DynamicText/README.md index 14c9d11..c1e8637 100644 --- a/DynamicText/README.md +++ b/DynamicText/README.md @@ -5,7 +5,7 @@ This is a example project showing how to respond to the user changing the preferred text size. -**Minimum deployment target is now iOS 9.0 using Xcode 11** +**Minimum deployment target is now iOS 9.0 using Xcode 12** The `UYLTextStyleViewController` shows the standard way to listen for and respond to changes to the users preferred text size using the @@ -22,11 +22,12 @@ category of `UIFont` for this purpose. For further details see the following blog post: -+ [Scaling Synamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ++ [Scaling Dynamic Type With Font Descriptors](https://useyourloaf.com/blog/scaling-dynamic-type-with-font-descriptors/) ## History -Version 1.3 11 January 2020 Updated for Xcode 11 +Version 1.4 19 May 2021 Updated for Xcode 12 and Swift +Version 1.3 11 January 2020 Updated for Xcode 11 Version 1.2 14 August 2017 Updated for Xcode 8 and iOS 10 Version 1.1 30 December 2013 Added UYLScaledTextViewController Version 1.0 06 October 2013 Initial version. From a0a0d2951ef3348857851d84a46dead5fd543245 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 22 Nov 2021 11:16:35 +0000 Subject: [PATCH 09/12] Update ScaledFont for Xcode 13 recommended settings --- ScaledFont/ScaledFont.xcodeproj/project.pbxproj | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj index 0454578..c209d8b 100644 --- a/ScaledFont/ScaledFont.xcodeproj/project.pbxproj +++ b/ScaledFont/ScaledFont.xcodeproj/project.pbxproj @@ -207,7 +207,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 1240; - LastUpgradeCheck = 1240; + LastUpgradeCheck = 1310; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53581E7625F7D6B6000DAD54 = { @@ -314,7 +314,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Sampler/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -337,7 +337,7 @@ CODE_SIGN_STYLE = Automatic; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = Sampler/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -401,7 +401,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -455,7 +455,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 11.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_COMPILATION_MODE = wholemodule; From 85af9ff835f99c4df25cbeefec36f348c1cb8c47 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Wed, 9 Mar 2022 16:42:18 +0000 Subject: [PATCH 10/12] Updated gitignore so now saving more of the workspace files --- .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 6 ++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 10 ++++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../xcshareddata/swiftpm/Package.resolved | 16 ++++++++++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../project.xcworkspace/contents.xcworkspacedata | 7 +++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 112 files changed, 849 insertions(+) create mode 100644 AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved create mode 100644 ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..330b13d --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptType/AdaptType.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..997f1a0 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AdaptivePopover/AdaptivePopover.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..00f2aca --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AlertController/AlertController.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..78219e1 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AllVisible/AllVisible.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..729e605 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AnimatedConstraints/AnimatedConstraints.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ce2a0d9 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AirPrinter/AirPrinter.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5fc5b6e --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/AlertView/AlertView.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..948f33d --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/BUG TableView State Restore/restore.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..05bb496 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Collection/Collection.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2c11c20 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/MasterSlide/MasterSlide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..7c537ff --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,6 @@ + + + + + diff --git a/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/RemindMe/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/StaticTable/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Stepper/Stepper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a339ef4 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/Styles/Styles.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8ac9b61 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/SyncMe/SyncMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..edc712f --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TCNibLoad/TCNibLoad.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ef00988 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TaskTimer/TaskTimer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82063ef --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Archive/TwitterSearch/TwitterSearch.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..ea9b143 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/AutoLayout/AutoLayout.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..dc746e2 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/BlastOff/BlastOff.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..3f19229 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Buttons/Buttons.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-SB/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..d8ef532 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Container/Container-code/Container.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c73bb89 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DarkTheme/DarkTheme.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..31c29ea --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Designable/Designable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v1/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..e92800f --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicContainer/DynamicContainer-v2/DynamicContainer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0f1a28d --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicText/DynamicText.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..df636b7 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/DynamicWebKit/DynamicWebKit.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..cb96726 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Encode/encode.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0540ebe --- /dev/null +++ b/GridView/GridView.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..774407d --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Huckleberry/Huckleberry.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..911133b --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/KeyCommand/KeyCommand.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ListCollection/List.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..82343ea --- /dev/null +++ b/Margins/Margins.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8816e0d --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Motion/Motion.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..2508c96 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/QReader/QReader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..1a89b2a --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Refresh/Refresh.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..502ca7c --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RefreshScroll/RefreshScroll.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..04b85c1 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RemindMe10/RemindMe.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..939427d --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Restorer/Restorer.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..a861032 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/RevealStack/RevealStack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved new file mode 100644 index 0000000..7c6899c --- /dev/null +++ b/ScaledFont/ScaledFont.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -0,0 +1,16 @@ +{ + "object": { + "pins": [ + { + "package": "ScaledFont", + "repositoryURL": "git@github.com:kharrison/ScaledFont.git", + "state": { + "branch": null, + "revision": "1dd4fad0ef73a62141231b604a4b1f2e50f71152", + "version": "1.0.4" + } + } + ] + }, + "version": 1 +} diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c1131c3 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide-IB/ScrollGuide-IB.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fe07a26 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/ScrollGuide/ScrollGuide.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..347c940 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SelfSize/SelfSize.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6e6878a --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/SpeakEasy/SpeakEasy.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..6bfc5e4 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StackMargin/StackMargin.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..8da2040 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Stacks/Stacks.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..0502574 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/StaticTableDynamicType/StaticTable.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..683cb83 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Swiper/Swiper.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..29776e6 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderObjC/TableHeaderObjC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..b52f47c --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/TableHeader/TableHeaderSwift/TableHeader.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ToDoSync/ToDoSync.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..5d56381 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Validate/Validate.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..43c56f3 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Vector/Vector.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..c3a4c72 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/WorldFacts/WorldFacts.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + From 0a88c7e509c6ba88409953ae49197ed11fd83750 Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Fri, 7 Feb 2025 13:07:19 +0000 Subject: [PATCH 11/12] Update minimum target to iOS 12 Update to Xcode 16 recommended settings --- .../AllVisible.xcodeproj/project.pbxproj | 8 ++-- RemindMe10/RemindMe.xcodeproj/project.pbxproj | 44 +++++++++++++------ RemindMe10/RemindMe/AppDelegate.swift | 2 +- 3 files changed, 37 insertions(+), 17 deletions(-) diff --git a/AllVisible/AllVisible.xcodeproj/project.pbxproj b/AllVisible/AllVisible.xcodeproj/project.pbxproj index 6c1007d..68c02d2 100644 --- a/AllVisible/AllVisible.xcodeproj/project.pbxproj +++ b/AllVisible/AllVisible.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1340; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 53AA2EB11DA2A957008EBF84 = { @@ -310,6 +310,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -335,7 +336,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -370,6 +371,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -389,7 +391,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; diff --git a/RemindMe10/RemindMe.xcodeproj/project.pbxproj b/RemindMe10/RemindMe.xcodeproj/project.pbxproj index f91d866..1302899 100644 --- a/RemindMe10/RemindMe.xcodeproj/project.pbxproj +++ b/RemindMe10/RemindMe.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 54; objects = { /* Begin PBXBuildFile section */ @@ -175,8 +175,9 @@ 53BA9AED1DB283D7000BD07D /* Project object */ = { isa = PBXProject; attributes = { + BuildIndependentTargetsInParallel = YES; LastSwiftUpdateCheck = 0800; - LastUpgradeCheck = 1120; + LastUpgradeCheck = 1620; ORGANIZATIONNAME = "Keith Harrison"; TargetAttributes = { 539D5EB81DC4DBF500130F2F = { @@ -302,7 +303,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -314,7 +318,10 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMeObjc/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMeObjc; PRODUCT_NAME = "$(TARGET_NAME)"; }; @@ -345,6 +352,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -356,6 +364,7 @@ DEBUG_INFORMATION_FORMAT = dwarf; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -370,13 +379,13 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -406,6 +415,7 @@ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES; CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; @@ -417,6 +427,7 @@ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_USER_SCRIPT_SANDBOXING = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -425,11 +436,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 12.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 5.0; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + SWIFT_VERSION = 6.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; }; @@ -441,10 +453,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Debug; }; @@ -454,10 +469,13 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; DEVELOPMENT_TEAM = LCC2J94N44; INFOPLIST_FILE = RemindMe/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); PRODUCT_BUNDLE_IDENTIFIER = com.useyourloaf.RemindMe; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 5.0; + SWIFT_VERSION = 6.0; }; name = Release; }; diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index 85e52f5..f0150c2 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -34,7 +34,7 @@ import UIKit import UserNotifications -@UIApplicationMain +@main class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? From 5a2f47fdb4596a3b0850850469931a86b35ba27d Mon Sep 17 00:00:00 2001 From: Keith Harrison Date: Mon, 10 Feb 2025 14:59:38 +0000 Subject: [PATCH 12/12] Remove surplus ; --- RemindMe10/RemindMe/AppDelegate.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/RemindMe10/RemindMe/AppDelegate.swift b/RemindMe10/RemindMe/AppDelegate.swift index f0150c2..1de436b 100644 --- a/RemindMe10/RemindMe/AppDelegate.swift +++ b/RemindMe10/RemindMe/AppDelegate.swift @@ -41,7 +41,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let notificationDelegate = UYLNotificationDelegate() func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool { - let options: UNAuthorizationOptions = [.alert, .sound]; + let options: UNAuthorizationOptions = [.alert, .sound] registerForLocalNotifications(options: options) let center = UNUserNotificationCenter.current() center.delegate = notificationDelegate