diff --git a/Example-macOS/AppDelegate.swift b/Example-macOS/AppDelegate.swift new file mode 100644 index 00000000..80f37755 --- /dev/null +++ b/Example-macOS/AppDelegate.swift @@ -0,0 +1,30 @@ +// +// AppDelegate.swift +// Example-macOS +// +// Created by JH on 2024/5/26. +// + +import Cocoa + +@main +class AppDelegate: NSObject, NSApplicationDelegate { + + + + + func applicationDidFinishLaunching(_ aNotification: Notification) { + // Insert code here to initialize your application + } + + func applicationWillTerminate(_ aNotification: Notification) { + // Insert code here to tear down your application + } + + func applicationSupportsSecureRestorableState(_ app: NSApplication) -> Bool { + return true + } + + +} + diff --git a/Example-macOS/Assets.xcassets/AccentColor.colorset/Contents.json b/Example-macOS/Assets.xcassets/AccentColor.colorset/Contents.json new file mode 100644 index 00000000..eb878970 --- /dev/null +++ b/Example-macOS/Assets.xcassets/AccentColor.colorset/Contents.json @@ -0,0 +1,11 @@ +{ + "colors" : [ + { + "idiom" : "universal" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json b/Example-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..3f00db43 --- /dev/null +++ b/Example-macOS/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,58 @@ +{ + "images" : [ + { + "idiom" : "mac", + "scale" : "1x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "16x16" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "32x32" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "128x128" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "256x256" + }, + { + "idiom" : "mac", + "scale" : "1x", + "size" : "512x512" + }, + { + "idiom" : "mac", + "scale" : "2x", + "size" : "512x512" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-macOS/Assets.xcassets/Contents.json b/Example-macOS/Assets.xcassets/Contents.json new file mode 100644 index 00000000..73c00596 --- /dev/null +++ b/Example-macOS/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/Example-macOS/Base.lproj/Main.storyboard b/Example-macOS/Base.lproj/Main.storyboard new file mode 100644 index 00000000..b97eaf1e --- /dev/null +++ b/Example-macOS/Base.lproj/Main.storyboard @@ -0,0 +1,757 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + Default + + + + + + + Left to Right + + + + + + + Right to Left + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Example-macOS/Example_macOS.entitlements b/Example-macOS/Example_macOS.entitlements new file mode 100644 index 00000000..18aff0ce --- /dev/null +++ b/Example-macOS/Example_macOS.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.files.user-selected.read-only + + + diff --git a/Example-macOS/ViewController.swift b/Example-macOS/ViewController.swift new file mode 100644 index 00000000..e30a9ca6 --- /dev/null +++ b/Example-macOS/ViewController.swift @@ -0,0 +1,93 @@ +// +// ViewController.swift +// Example-macOS +// +// Created by JH on 2024/5/26. +// + +import Cocoa +import NVActivityIndicatorView + +class ViewController: NSViewController { + @ViewLoading + @IBOutlet var collectionView: NSCollectionView + + override func viewDidLoad() { + super.viewDidLoad() + + collectionView.dataSource = self + collectionView.delegate = self + collectionView.register(CollectionViewItem.self, forItemWithIdentifier: .init(String(describing: CollectionViewItem.self))) + collectionView.enclosingScrollView?.scrollerStyle = .overlay + } + + override var representedObject: Any? { + didSet { + // Update the view, if already loaded. + } + } + + let allTypes = NVActivityIndicatorType.allCases.filter { $0 != .blank } +} + +extension ViewController: NSCollectionViewDataSource, NSCollectionViewDelegate { + func collectionView(_ collectionView: NSCollectionView, numberOfItemsInSection section: Int) -> Int { + allTypes.count + } + + func collectionView(_ collectionView: NSCollectionView, itemForRepresentedObjectAt indexPath: IndexPath) -> NSCollectionViewItem { + let viewItem = collectionView.makeItem(withIdentifier: .init(String(describing: CollectionViewItem.self)), for: indexPath) as! CollectionViewItem + viewItem.type = allTypes[indexPath.item] + return viewItem + } +} + +class CollectionViewItem: NSCollectionViewItem { + lazy var indicatorView: NVActivityIndicatorView = { + let indicatorView = NVActivityIndicatorView(frame: .zero, type: type) + view.addSubview(indicatorView) + indicatorView.translatesAutoresizingMaskIntoConstraints = false + + NSLayoutConstraint.activate([ + indicatorView.topAnchor.constraint(equalTo: view.topAnchor), + indicatorView.leftAnchor.constraint(equalTo: view.leftAnchor), + indicatorView.rightAnchor.constraint(equalTo: view.rightAnchor), + indicatorView.heightAnchor.constraint(equalTo: indicatorView.widthAnchor), + ]) + indicatorView.layoutSubtreeIfNeeded() + indicatorView.startAnimating() + return indicatorView + }() + + lazy var titleLabel: NSTextField = { + let titleLabel = NSTextField(labelWithString: "") + titleLabel.textColor = .labelColor + titleLabel.font = .systemFont(ofSize: 10) + view.addSubview(titleLabel) + titleLabel.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + titleLabel.topAnchor.constraint(equalTo: indicatorView.bottomAnchor, constant: 10), + titleLabel.centerXAnchor.constraint(equalTo: view.centerXAnchor), + ]) + return titleLabel + }() + + var type: NVActivityIndicatorType = .blank { + didSet { + indicatorView.type = type + indicatorView.stopAnimating() + indicatorView.startAnimating() + titleLabel.stringValue = type.animationName + } + } + + override init(nibName nibNameOrNil: NSNib.Name?, bundle nibBundleOrNil: Bundle?) { + super.init(nibName: nil, bundle: nil) + + } + + @available(*, unavailable) + required init?(coder: NSCoder) { + fatalError("init(coder:) has not been implemented") + } +} diff --git a/Example/Example.entitlements b/Example/Example.entitlements new file mode 100644 index 00000000..ee95ab7e --- /dev/null +++ b/Example/Example.entitlements @@ -0,0 +1,10 @@ + + + + + com.apple.security.app-sandbox + + com.apple.security.network.client + + + diff --git a/Example/ViewController.swift b/Example/ViewController.swift index 4bcddb6a..22a5714f 100644 --- a/Example/ViewController.swift +++ b/Example/ViewController.swift @@ -66,13 +66,15 @@ class ViewController: UIViewController, NVActivityIndicatorViewable { type: indicatorType) let animationTypeLabel = UILabel(frame: frame) - animationTypeLabel.text = String(index) + animationTypeLabel.text = indicatorType.animationClassName.replacingOccurrences(of: "NVActivityIndicatorView.NVActivityIndicatorAnimation", with: "") + animationTypeLabel.font = .systemFont(ofSize: 10) animationTypeLabel.sizeToFit() animationTypeLabel.allowsDefaultTighteningForTruncation = true animationTypeLabel.textColor = UIColor.white - animationTypeLabel.frame.origin.x += 5 + animationTypeLabel.frame.origin.x += 0 animationTypeLabel.frame.origin.y += CGFloat(cellHeight) - animationTypeLabel.frame.size.height - + animationTypeLabel.frame.size.width = frame.width + animationTypeLabel.textAlignment = .center activityIndicatorView.padding = 20 if indicatorType == NVActivityIndicatorType.orbit { activityIndicatorView.padding = 0 diff --git a/NVActivityIndicatorView.podspec b/NVActivityIndicatorView.podspec index ef6b9ebf..a96e4a28 100644 --- a/NVActivityIndicatorView.podspec +++ b/NVActivityIndicatorView.podspec @@ -9,6 +9,7 @@ Pod::Spec.new do |s| s.social_media_url = 'http://twitter.com/ninjaprox' s.documentation_url = 'https://nvactivityindicatorview.vinhis.me' + s.osx.deployment_target = '10.13' s.ios.deployment_target = '9.0' s.tvos.deployment_target = '9.0' s.swift_version = '5.0' @@ -25,5 +26,7 @@ Pod::Spec.new do |s| end s.default_subspec = 'Base' - s.frameworks = 'UIKit', 'QuartzCore' + s.ios.frameworks = 'UIKit', 'QuartzCore' + s.tvos.frameworks = 'UIKit', 'QuartzCore' + s.osx.frameworks = 'AppKit', 'QuartzCore' end diff --git a/NVActivityIndicatorView.xcodeproj/project.pbxproj b/NVActivityIndicatorView.xcodeproj/project.pbxproj index e03870a7..1b0d10d8 100644 --- a/NVActivityIndicatorView.xcodeproj/project.pbxproj +++ b/NVActivityIndicatorView.xcodeproj/project.pbxproj @@ -3,7 +3,7 @@ archiveVersion = 1; classes = { }; - objectVersion = 46; + objectVersion = 55; objects = { /* Begin PBXBuildFile section */ @@ -13,12 +13,20 @@ 1F1836E7248CEFC200583430 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E5248CEFC200583430 /* Main.storyboard */; }; 1F1836E9248CEFC300583430 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836E8248CEFC300583430 /* Assets.xcassets */; }; 1F1836EC248CEFC300583430 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1F1836EA248CEFC300583430 /* LaunchScreen.storyboard */; }; - 1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; }; - 1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 1F1836F2248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; platformFilters = (ios, maccatalyst, tvos, watchos, ); }; + 1F1836F3248CF08B00583430 /* NVActivityIndicatorViewExtended.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */; platformFilters = (ios, maccatalyst, tvos, watchos, ); settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; 1F183707248CF29F00583430 /* ActivityDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183706248CF29F00583430 /* ActivityDataTests.swift */; }; 1F18370B248CF31500583430 /* NVActivityIndicatorPresenterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183708248CF31500583430 /* NVActivityIndicatorPresenterTests.swift */; }; 1F18370C248CF31500583430 /* NVActivityIndicatorViewTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */; }; 1F18370D248CF31500583430 /* NVActivityIndicatorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */; }; + E93F49372C03509F00857CBC /* Typealias.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93F49352C03509F00857CBC /* Typealias.swift */; }; + E93F49382C03509F00857CBC /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93F49362C03509F00857CBC /* Extensions.swift */; }; + E93F49412C03516E00857CBC /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93F49402C03516E00857CBC /* AppDelegate.swift */; }; + E93F49432C03516E00857CBC /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E93F49422C03516E00857CBC /* ViewController.swift */; }; + E93F49452C03516F00857CBC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E93F49442C03516F00857CBC /* Assets.xcassets */; }; + E93F494D2C0351BF00857CBC /* NVActivityIndicatorView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */; }; + E93F494E2C0351BF00857CBC /* NVActivityIndicatorView.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + E93F49532C0353CB00857CBC /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E93F49462C03516F00857CBC /* Main.storyboard */; }; OBJ_102 /* NVActivityIndicatorPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_48 /* NVActivityIndicatorPresenter.swift */; }; OBJ_103 /* NVActivityIndicatorViewable.swift in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_49 /* NVActivityIndicatorViewable.swift */; }; OBJ_105 /* NVActivityIndicatorView.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */; }; @@ -84,6 +92,13 @@ remoteGlobalIDString = 1F1836DC248CEFC200583430; remoteInfo = Example; }; + E93F494F2C0351BF00857CBC /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = OBJ_1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = "NVActivityIndicatorView::NVActivityIndicatorView"; + remoteInfo = NVActivityIndicatorView; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -98,6 +113,17 @@ name = "Embed Frameworks"; runOnlyForDeploymentPostprocessing = 0; }; + E93F49512C0351BF00857CBC /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + E93F494E2C0351BF00857CBC /* NVActivityIndicatorView.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ @@ -117,6 +143,15 @@ 1F183709248CF31500583430 /* NVActivityIndicatorViewTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorViewTests.swift; sourceTree = ""; }; 1F18370A248CF31500583430 /* NVActivityIndicatorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorTypeTests.swift; sourceTree = ""; }; 1F73073E2BCFFEC700FBF25A /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; }; + E93F49352C03509F00857CBC /* Typealias.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Typealias.swift; sourceTree = ""; }; + E93F49362C03509F00857CBC /* Extensions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Extensions.swift; sourceTree = ""; }; + E93F49392C0350FE00857CBC /* Example.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Example.entitlements; sourceTree = ""; }; + E93F493E2C03516E00857CBC /* Example-macOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-macOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E93F49402C03516E00857CBC /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E93F49422C03516E00857CBC /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + E93F49442C03516F00857CBC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E93F49472C03516F00857CBC /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E93F49492C03516F00857CBC /* Example_macOS.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = Example_macOS.entitlements; sourceTree = ""; }; "NVActivityIndicatorView::NVActivityIndicatorView::Product" /* NVActivityIndicatorView.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorView.framework; sourceTree = BUILT_PRODUCTS_DIR; }; "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = NVActivityIndicatorViewExtended.framework; sourceTree = BUILT_PRODUCTS_DIR; }; OBJ_10 /* NVActivityIndicatorAnimationAudioEqualizer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NVActivityIndicatorAnimationAudioEqualizer.swift; sourceTree = ""; }; @@ -177,6 +212,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E93F493B2C03516E00857CBC /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + E93F494D2C0351BF00857CBC /* NVActivityIndicatorView.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; OBJ_104 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 0; @@ -198,6 +241,7 @@ 1F1836DE248CEFC200583430 /* Example */ = { isa = PBXGroup; children = ( + E93F49392C0350FE00857CBC /* Example.entitlements */, 1F1836DF248CEFC200583430 /* AppDelegate.swift */, 1F1836E1248CEFC200583430 /* SceneDelegate.swift */, 1F1836E3248CEFC200583430 /* ViewController.swift */, @@ -229,6 +273,18 @@ path = Tests; sourceTree = ""; }; + E93F493F2C03516E00857CBC /* Example-macOS */ = { + isa = PBXGroup; + children = ( + E93F49402C03516E00857CBC /* AppDelegate.swift */, + E93F49422C03516E00857CBC /* ViewController.swift */, + E93F49442C03516F00857CBC /* Assets.xcassets */, + E93F49462C03516F00857CBC /* Main.storyboard */, + E93F49492C03516F00857CBC /* Example_macOS.entitlements */, + ); + path = "Example-macOS"; + sourceTree = ""; + }; OBJ_47 /* NVActivityIndicatorViewExtended */ = { isa = PBXGroup; children = ( @@ -247,6 +303,7 @@ OBJ_7 /* Sources */, 1F1836DE248CEFC200583430 /* Example */, 1F1836FC248CF25600583430 /* Tests */, + E93F493F2C03516E00857CBC /* Example-macOS */, OBJ_51 /* Products */, 1F1836F1248CF08B00583430 /* Frameworks */, ); @@ -259,6 +316,7 @@ "NVActivityIndicatorView::NVActivityIndicatorViewExtended::Product" /* NVActivityIndicatorViewExtended.framework */, 1F1836DD248CEFC200583430 /* Example.app */, 1F1836FB248CF25600583430 /* Tests.xctest */, + E93F493E2C03516E00857CBC /* Example-macOS.app */, ); name = Products; sourceTree = BUILT_PRODUCTS_DIR; @@ -279,6 +337,8 @@ OBJ_44 /* NVActivityIndicatorAnimationDelegate.swift */, OBJ_45 /* NVActivityIndicatorShape.swift */, OBJ_46 /* NVActivityIndicatorView.swift */, + E93F49362C03509F00857CBC /* Extensions.swift */, + E93F49352C03509F00857CBC /* Typealias.swift */, ); name = NVActivityIndicatorView; path = Sources/Base; @@ -365,6 +425,25 @@ productReference = 1F1836FB248CF25600583430 /* Tests.xctest */; productType = "com.apple.product-type.bundle.unit-test"; }; + E93F493D2C03516E00857CBC /* Example-macOS */ = { + isa = PBXNativeTarget; + buildConfigurationList = E93F494A2C03516F00857CBC /* Build configuration list for PBXNativeTarget "Example-macOS" */; + buildPhases = ( + E93F493A2C03516E00857CBC /* Sources */, + E93F493B2C03516E00857CBC /* Frameworks */, + E93F493C2C03516E00857CBC /* Resources */, + E93F49512C0351BF00857CBC /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + E93F49502C0351BF00857CBC /* PBXTargetDependency */, + ); + name = "Example-macOS"; + productName = "Example-macOS"; + productReference = E93F493E2C03516E00857CBC /* Example-macOS.app */; + productType = "com.apple.product-type.application"; + }; "NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */ = { isa = PBXNativeTarget; buildConfigurationList = OBJ_55 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorView" */; @@ -419,7 +498,7 @@ isa = PBXProject; attributes = { LastSwiftMigration = 9999; - LastSwiftUpdateCheck = 1130; + LastSwiftUpdateCheck = 1540; LastUpgradeCheck = 1420; TargetAttributes = { 1F1836DC248CEFC200583430 = { @@ -432,6 +511,9 @@ ProvisioningStyle = Automatic; TestTargetID = 1F1836DC248CEFC200583430; }; + E93F493D2C03516E00857CBC = { + CreatedOnToolsVersion = 15.4; + }; }; }; buildConfigurationList = OBJ_2 /* Build configuration list for PBXProject "NVActivityIndicatorView" */; @@ -451,6 +533,7 @@ "NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */, "NVActivityIndicatorView::SwiftPMPackageDescription" /* NVActivityIndicatorViewPackageDescription */, 1F1836DC248CEFC200583430 /* Example */, + E93F493D2C03516E00857CBC /* Example-macOS */, 1F1836FA248CF25600583430 /* Tests */, ); }; @@ -474,6 +557,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E93F493C2C03516E00857CBC /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E93F49532C0353CB00857CBC /* Main.storyboard in Resources */, + E93F49452C03516F00857CBC /* Assets.xcassets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ @@ -498,6 +590,15 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + E93F493A2C03516E00857CBC /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E93F49432C03516E00857CBC /* ViewController.swift in Sources */, + E93F49412C03516E00857CBC /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; OBJ_101 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 0; @@ -531,6 +632,7 @@ OBJ_68 /* NVActivityIndicatorAnimationBallPulseRise.swift in Sources */, OBJ_69 /* NVActivityIndicatorAnimationBallPulseSync.swift in Sources */, OBJ_70 /* NVActivityIndicatorAnimationBallRotate.swift in Sources */, + E93F49372C03509F00857CBC /* Typealias.swift in Sources */, OBJ_71 /* NVActivityIndicatorAnimationBallRotateChase.swift in Sources */, OBJ_72 /* NVActivityIndicatorAnimationBallScale.swift in Sources */, OBJ_73 /* NVActivityIndicatorAnimationBallScaleMultiple.swift in Sources */, @@ -552,6 +654,7 @@ OBJ_89 /* NVActivityIndicatorAnimationPacman.swift in Sources */, OBJ_90 /* NVActivityIndicatorAnimationSemiCircleSpin.swift in Sources */, OBJ_91 /* NVActivityIndicatorAnimationSquareSpin.swift in Sources */, + E93F49382C03509F00857CBC /* Extensions.swift in Sources */, OBJ_92 /* NVActivityIndicatorAnimationTriangleSkewSpin.swift in Sources */, OBJ_93 /* NVActivityIndicatorAnimationDelegate.swift in Sources */, OBJ_94 /* NVActivityIndicatorShape.swift in Sources */, @@ -564,6 +667,12 @@ /* Begin PBXTargetDependency section */ 1F1836F5248CF08B00583430 /* PBXTargetDependency */ = { isa = PBXTargetDependency; + platformFilters = ( + ios, + maccatalyst, + tvos, + watchos, + ); target = "NVActivityIndicatorView::NVActivityIndicatorViewExtended" /* NVActivityIndicatorViewExtended */; targetProxy = 1F1836F4248CF08B00583430 /* PBXContainerItemProxy */; }; @@ -572,6 +681,11 @@ target = 1F1836DC248CEFC200583430 /* Example */; targetProxy = 1F183700248CF25600583430 /* PBXContainerItemProxy */; }; + E93F49502C0351BF00857CBC /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = "NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */; + targetProxy = E93F494F2C0351BF00857CBC /* PBXContainerItemProxy */; + }; OBJ_106 /* PBXTargetDependency */ = { isa = PBXTargetDependency; target = "NVActivityIndicatorView::NVActivityIndicatorView" /* NVActivityIndicatorView */; @@ -596,6 +710,14 @@ name = LaunchScreen.storyboard; sourceTree = ""; }; + E93F49462C03516F00857CBC /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E93F49472C03516F00857CBC /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; /* End PBXVariantGroup section */ /* Begin XCBuildConfiguration section */ @@ -631,6 +753,8 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = Example/Example.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -649,15 +773,22 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Example/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator watchos watchsimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6,7"; }; name = Debug; }; @@ -693,6 +824,8 @@ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_ENTITLEMENTS = Example/Example.entitlements; + "CODE_SIGN_IDENTITY[sdk=macosx*]" = "-"; CODE_SIGN_STYLE = Automatic; COPY_PHASE_STRIP = NO; ENABLE_NS_ASSERTIONS = NO; @@ -707,14 +840,21 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Example/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; PRODUCT_BUNDLE_IDENTIFIER = me.vinhis.Example; PRODUCT_NAME = "$(TARGET_NAME)"; + SUPPORTED_PLATFORMS = "appletvos appletvsimulator iphoneos iphonesimulator watchos watchsimulator xros xrsimulator"; + SUPPORTS_MACCATALYST = YES; + SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO; + SUPPORTS_XR_DESIGNED_FOR_IPHONE_IPAD = NO; SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; + TARGETED_DEVICE_FAMILY = "1,2,6,7"; VALIDATE_PRODUCT = YES; }; name = Release; @@ -769,7 +909,11 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Tests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; @@ -830,7 +974,11 @@ GCC_WARN_UNUSED_VARIABLE = YES; INFOPLIST_FILE = Tests/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 13.2; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@loader_path/Frameworks", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; @@ -844,6 +992,109 @@ }; name = Release; }; + E93F494B2C03516F00857CBC /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Example-macOS/Example_macOS.entitlements"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_DYNAMIC_NO_PIC = NO; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.5; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.JH.Example-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)"; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + E93F494C2C03516F00857CBC /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES; + ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++20"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_ENTITLEMENTS = "Example-macOS/Example_macOS.entitlements"; + CODE_SIGN_STYLE = Automatic; + COMBINE_HIDPI_IMAGES = YES; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_USER_SCRIPT_SANDBOXING = YES; + GCC_C_LANGUAGE_STANDARD = gnu17; + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GENERATE_INFOPLIST_FILE = YES; + INFOPLIST_KEY_NSHumanReadableCopyright = ""; + INFOPLIST_KEY_NSMainStoryboardFile = Main; + INFOPLIST_KEY_NSPrincipalClass = NSApplication; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/../Frameworks", + ); + LOCALIZATION_PREFERS_STRING_CATALOGS = YES; + MACOSX_DEPLOYMENT_TARGET = 14.5; + MARKETING_VERSION = 1.0; + MTL_ENABLE_DEBUG_INFO = NO; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "com.JH.Example-macOS"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SDKROOT = macosx; + SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx"; + SUPPORTS_MACCATALYST = NO; + SWIFT_EMIT_LOC_STRINGS = YES; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; OBJ_100 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -856,7 +1107,10 @@ HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 5.1.0; OTHER_CFLAGS = "$(inherited)"; @@ -930,7 +1184,6 @@ GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "$(inherited)", - "SWIFT_PACKAGE=1", "DEBUG=1", ); GCC_WARN_64_TO_32_BIT_CONVERSION = YES; @@ -946,7 +1199,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE DEBUG"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; SWIFT_VERSION = 5.0; USE_HEADERMAP = NO; @@ -982,10 +1235,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = s; - GCC_PREPROCESSOR_DEFINITIONS = ( - "$(inherited)", - "SWIFT_PACKAGE=1", - ); + GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)"; GCC_WARN_64_TO_32_BIT_CONVERSION = YES; GCC_WARN_ABOUT_RETURN_TYPE = YES; GCC_WARN_UNDECLARED_SELECTOR = YES; @@ -998,8 +1248,9 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SDKROOT = iphoneos; SUPPORTED_PLATFORMS = "macosx iphoneos iphonesimulator appletvos appletvsimulator watchos watchsimulator"; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) SWIFT_PACKAGE"; - SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited)"; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; SWIFT_VERSION = 5.0; USE_HEADERMAP = NO; }; @@ -1017,7 +1268,10 @@ HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 5.1.0; OTHER_CFLAGS = "$(inherited)"; @@ -1048,7 +1302,10 @@ HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorView_Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 5.1.0; OTHER_CFLAGS = "$(inherited)"; @@ -1079,7 +1336,10 @@ HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = NVActivityIndicatorView.xcodeproj/NVActivityIndicatorViewExtended_Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 12.0; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) $(TOOLCHAIN_DIR)/usr/lib/swift/macosx"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "$(TOOLCHAIN_DIR)/usr/lib/swift/macosx", + ); MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)"; MARKETING_VERSION = 5.1.0; OTHER_CFLAGS = "$(inherited)"; @@ -1119,6 +1379,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + E93F494A2C03516F00857CBC /* Build configuration list for PBXNativeTarget "Example-macOS" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E93F494B2C03516F00857CBC /* Debug */, + E93F494C2C03516F00857CBC /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; OBJ_108 /* Build configuration list for PBXNativeTarget "NVActivityIndicatorViewPackageDescription" */ = { isa = XCConfigurationList; buildConfigurations = ( diff --git a/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example-macOS.xcscheme b/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example-macOS.xcscheme new file mode 100644 index 00000000..afcdef99 --- /dev/null +++ b/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/Example-macOS.xcscheme @@ -0,0 +1,78 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView.xcscheme b/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView.xcscheme new file mode 100644 index 00000000..dd1332f0 --- /dev/null +++ b/NVActivityIndicatorView.xcodeproj/xcshareddata/xcschemes/NVActivityIndicatorView.xcscheme @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Package.swift b/Package.swift index 47357990..f98ae0d8 100644 --- a/Package.swift +++ b/Package.swift @@ -7,7 +7,8 @@ let package = Package( name: "NVActivityIndicatorView", platforms: [ .iOS(.v9), - .tvOS(.v9) + .tvOS(.v9), + .macOS(.v10_13), ], products: [ .library(name: "NVActivityIndicatorView", targets: ["NVActivityIndicatorView"]), diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift index e0fcf05e..fc4bb561 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationAudioEqualizer.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSize = size.width / 9 let x = (layer.bounds.size.width - lineSize * 7) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -49,9 +54,9 @@ class NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDe let heightFactor = values[j] let height = size.height * CGFloat(heightFactor) let point = CGPoint(x: 0, y: size.height - height) - let path = UIBezierPath(rect: CGRect(origin: point, size: CGSize(width: lineSize, height: height))) + let path = NSUIBezierPath(rect: CGRect(origin: point, size: CGSize(width: lineSize, height: height))) - animation.values?.append(path.cgPath) + animation.values?.append(path.asCGPath) } animation.duration = duration[i] animation.repeatCount = HUGE @@ -69,4 +74,3 @@ class NVActivityIndicatorAnimationAudioEqualizer: NVActivityIndicatorAnimationDe } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift index 4b8d647d..8aa184ba 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallBeat.swift @@ -25,12 +25,18 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif + class NVActivityIndicatorAnimationBallBeat: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize = (size.width - circleSpacing * 2) / 3 let x = (layer.bounds.size.width - size.width) / 2 @@ -77,4 +83,3 @@ class NVActivityIndicatorAnimationBallBeat: NVActivityIndicatorAnimationDelegate } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift index 28c57f63..620d15a5 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotate.swift @@ -25,12 +25,19 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif + + class NVActivityIndicatorAnimationBallClipRotate: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 0.75 // Scale animation @@ -66,4 +73,3 @@ class NVActivityIndicatorAnimationBallClipRotate: NVActivityIndicatorAnimationDe layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift index c4b064e7..91beecc9 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotateMultiple.swift @@ -25,29 +25,39 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAnimationDelegate { - - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let bigCircleSize: CGFloat = size.width let smallCircleSize: CGFloat = size.width / 2 let longDuration: CFTimeInterval = 1 let timingFunction = CAMediaTimingFunction(name: .easeInEaseOut) - circleOf(shape: .ringTwoHalfHorizontal, - duration: longDuration, - timingFunction: timingFunction, - layer: layer, - size: bigCircleSize, - color: color, reverse: false) - circleOf(shape: .ringTwoHalfVertical, - duration: longDuration, - timingFunction: timingFunction, - layer: layer, - size: smallCircleSize, - color: color, reverse: true) + circleOf( + shape: .ringTwoHalfHorizontal, + duration: longDuration, + timingFunction: timingFunction, + layer: layer, + size: bigCircleSize, + color: color, + reverse: false + ) + circleOf( + shape: .ringTwoHalfVertical, + duration: longDuration, + timingFunction: timingFunction, + layer: layer, + size: smallCircleSize, + color: color, + reverse: true + ) } func createAnimationIn(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, reverse: Bool) -> CAAnimation { @@ -69,6 +79,7 @@ class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAni } else { rotateAnimation.values = [0, -Double.pi, -2 * Double.pi] } + rotateAnimation.duration = duration // Animation @@ -83,12 +94,14 @@ class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAni } // swiftlint:disable:next function_parameter_count - func circleOf(shape: NVActivityIndicatorShape, duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGFloat, color: UIColor, reverse: Bool) { + func circleOf(shape: NVActivityIndicatorShape, duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGFloat, color: NSUIColor, reverse: Bool) { let circle = shape.layerWith(size: CGSize(width: size, height: size), color: color) - let frame = CGRect(x: (layer.bounds.size.width - size) / 2, - y: (layer.bounds.size.height - size) / 2, - width: size, - height: size) + let frame = CGRect( + x: (layer.bounds.size.width - size) / 2, + y: (layer.bounds.size.height - size) / 2, + width: size, + height: size + ) let animation = createAnimationIn(duration: duration, timingFunction: timingFunction, reverse: reverse) circle.frame = frame @@ -96,4 +109,3 @@ class NVActivityIndicatorAnimationBallClipRotateMultiple: NVActivityIndicatorAni layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift index 52ecf808..1281d4ea 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallClipRotatePulse.swift @@ -25,12 +25,16 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimationDelegate { - - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 1 let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9) @@ -38,7 +42,7 @@ class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimat bigCircleWith(duration: duration, timingFunction: timingFunction, layer: layer, size: size, color: color) } - func smallCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) { + func smallCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: NSUIColor) { // Animation let animation = CAKeyframeAnimation(keyPath: "transform.scale") @@ -52,17 +56,19 @@ class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimat // Draw circle let circleSize = size.width / 2 let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: circleSize, height: circleSize), color: color) - let frame = CGRect(x: (layer.bounds.size.width - circleSize) / 2, - y: (layer.bounds.size.height - circleSize) / 2, - width: circleSize, - height: circleSize) + let frame = CGRect( + x: (layer.bounds.size.width - circleSize) / 2, + y: (layer.bounds.size.height - circleSize) / 2, + width: circleSize, + height: circleSize + ) circle.frame = frame circle.add(animation, forKey: "animation") layer.addSublayer(circle) } - func bigCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: UIColor) { + func bigCircleWith(duration: CFTimeInterval, timingFunction: CAMediaTimingFunction, layer: CALayer, size: CGSize, color: NSUIColor) { // Scale animation let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale") @@ -89,13 +95,14 @@ class NVActivityIndicatorAnimationBallClipRotatePulse: NVActivityIndicatorAnimat // Draw circle let circle = NVActivityIndicatorShape.ringTwoHalfVertical.layerWith(size: size, color: color) - let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2, - y: (layer.bounds.size.height - size.height) / 2, - width: size.width, - height: size.height) + let frame = CGRect( + x: (layer.bounds.size.width - size.width) / 2, + y: (layer.bounds.size.height - size.height) / 2, + width: size.width, + height: size.height + ) circle.frame = frame circle.add(animation, forKey: "animation") layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift index ef81dee8..84d7e27c 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallDoubleBounce.swift @@ -25,18 +25,23 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallDoubleBounce: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { for index in (0...1) { bouncingBall(in: layer, size: size, color: color, startingAt: CACurrentMediaTime() + Double(index)) } } - fileprivate func bouncingBall(in layer: CALayer, size: CGSize, color: UIColor, startingAt: CFTimeInterval) { + fileprivate func bouncingBall(in layer: CALayer, size: CGSize, color: NSUIColor, startingAt: CFTimeInterval) { // Scale animation let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale") scaleAnimation.duration = 2 @@ -60,4 +65,3 @@ class NVActivityIndicatorAnimationBallDoubleBounce: NVActivityIndicatorAnimation layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift index 274882ac..56f7d92c 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridBeat.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallGridBeat: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize = (size.width - circleSpacing * 2) / 3 let x = (layer.bounds.size.width - size.width) / 2 @@ -67,4 +72,3 @@ class NVActivityIndicatorAnimationBallGridBeat: NVActivityIndicatorAnimationDele } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift index 4c3f34c7..776e6e78 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallGridPulse.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallGridPulse: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize = (size.width - circleSpacing * 2) / 3 let x = (layer.bounds.size.width - size.width) / 2 @@ -79,4 +84,3 @@ class NVActivityIndicatorAnimationBallGridPulse: NVActivityIndicatorAnimationDel } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift index c929b902..d4708364 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulse.swift @@ -25,11 +25,16 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallPulse: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize: CGFloat = (size.width - 2 * circleSpacing) / 3 let x: CGFloat = (layer.bounds.size.width - size.width) / 2 @@ -63,4 +68,3 @@ class NVActivityIndicatorAnimationBallPulse: NVActivityIndicatorAnimationDelegat } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift index 88ac1980..33f1de88 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseRise.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallPulseRise: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize = (size.width - 4 * circleSpacing) / 5 let x = (layer.bounds.size.width - size.width) / 2 @@ -113,4 +118,3 @@ class NVActivityIndicatorAnimationBallPulseRise: NVActivityIndicatorAnimationDel return animation } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift index 3b62cb83..d7fba0de 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallPulseSync.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallPulseSync: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = 2 let circleSize = (size.width - circleSpacing * 2) / 3 let x = (layer.bounds.size.width - size.width) / 2 @@ -66,4 +71,3 @@ class NVActivityIndicatorAnimationBallPulseSync: NVActivityIndicatorAnimationDel } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift index ed84678d..496b9127 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotate.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallRotate: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize: CGFloat = size.width / 5 let duration: CFTimeInterval = 1 let timingFunction = CAMediaTimingFunction(controlPoints: 0.7, -0.13, 0.22, 0.86) @@ -81,4 +86,3 @@ class NVActivityIndicatorAnimationBallRotate: NVActivityIndicatorAnimationDelega layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift index bc9a4c41..fa6a2ee9 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallRotateChase.swift @@ -25,12 +25,16 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationDelegate { - - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize = size.width / 5 // Draw circles @@ -62,7 +66,16 @@ class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationD let positionAnimation = CAKeyframeAnimation(keyPath: "position") positionAnimation.duration = duration positionAnimation.repeatCount = HUGE - positionAnimation.path = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: CGFloat(3 * Double.pi * 0.5), endAngle: CGFloat(3 * Double.pi * 0.5 + 2 * Double.pi), clockwise: true).cgPath + + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + let clockwise = false + #endif + + #if canImport(UIKit) + let clockwise = true + #endif + + positionAnimation.path = NSUIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: size.width / 2, startAngle: CGFloat(3 * Double.pi * 0.5), endAngle: CGFloat(3 * Double.pi * 0.5 + 2 * Double.pi), clockwise: clockwise).asCGPath // Aniamtion let animation = CAAnimationGroup() @@ -75,4 +88,3 @@ class NVActivityIndicatorAnimationBallRotateChase: NVActivityIndicatorAnimationD return animation } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift index 2d4218c8..9ceb124c 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScale.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallScale: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 1 // Scale animation @@ -67,4 +72,3 @@ class NVActivityIndicatorAnimationBallScale: NVActivityIndicatorAnimationDelegat layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift index a6123cb3..6d8f7d64 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleMultiple.swift @@ -25,12 +25,16 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimationDelegate { - - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 1 let beginTime = CACurrentMediaTime() let beginTimes = [0, 0.2, 0.4] @@ -61,10 +65,12 @@ class NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimatio // Draw balls for i in 0 ..< 3 { let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color) - let frame = CGRect(x: (layer.bounds.size.width - size.width) / 2, - y: (layer.bounds.size.height - size.height) / 2, - width: size.width, - height: size.height) + let frame = CGRect( + x: (layer.bounds.size.width - size.width) / 2, + y: (layer.bounds.size.height - size.height) / 2, + width: size.width, + height: size.height + ) animation.beginTime = beginTime + beginTimes[i] circle.frame = frame @@ -74,4 +80,3 @@ class NVActivityIndicatorAnimationBallScaleMultiple: NVActivityIndicatorAnimatio } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift index a453a678..afab5677 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRipple.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallScaleRipple: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 1 let timingFunction = CAMediaTimingFunction(controlPoints: 0.21, 0.53, 0.56, 0.8) @@ -70,4 +75,3 @@ class NVActivityIndicatorAnimationBallScaleRipple: NVActivityIndicatorAnimationD layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift index 13426ccc..b818f3ba 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallScaleRippleMultiple.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallScaleRippleMultiple: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 1.25 let beginTime = CACurrentMediaTime() let beginTimes = [0, 0.2, 0.4] @@ -75,4 +80,3 @@ class NVActivityIndicatorAnimationBallScaleRippleMultiple: NVActivityIndicatorAn } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift index 9857330a..3702befb 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallSpinFadeLoader.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSpacing: CGFloat = -2 let circleSize = (size.width - 4 * circleSpacing) / 5 let x = (layer.bounds.size.width - size.width) / 2 @@ -76,7 +81,7 @@ class NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimati } } - func circleAt(angle: CGFloat, size: CGFloat, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer { + func circleAt(angle: CGFloat, size: CGFloat, origin: CGPoint, containerSize: CGSize, color: NSUIColor) -> CALayer { let radius = containerSize.width / 2 - size / 2 let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: size, height: size), color: color) let frame = CGRect( @@ -90,4 +95,3 @@ class NVActivityIndicatorAnimationBallSpinFadeLoader: NVActivityIndicatorAnimati return circle } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift index 69f45489..1fcff0be 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallTrianglePath.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallTrianglePath: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize = size.width / 5 let deltaX = size.width / 2 - circleSize / 2 let deltaY = size.height / 2 - circleSize / 2 @@ -101,4 +106,3 @@ class NVActivityIndicatorAnimationBallTrianglePath: NVActivityIndicatorAnimation return valueMutableString as String } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift index 3aadf395..132a37f3 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZag.swift @@ -25,13 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit -import QuartzCore +#endif class NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize: CGFloat = size.width / 5 let duration: CFTimeInterval = 0.7 let deltaX = size.width / 2 - circleSize / 2 @@ -68,7 +72,7 @@ class NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelega circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation) } - func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) { + func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: NSUIColor, animation: CAAnimation) { let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color) circle.frame = frame @@ -76,4 +80,3 @@ class NVActivityIndicatorAnimationBallZigZag: NVActivityIndicatorAnimationDelega layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift index 0f3fe845..1dc26854 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBallZigZagDeflect.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize: CGFloat = size.width / 5 let duration: CFTimeInterval = 0.75 let deltaX = size.width / 2 - circleSize / 2 @@ -68,7 +73,7 @@ class NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimatio circleAt(frame: frame, layer: layer, size: CGSize(width: circleSize, height: circleSize), color: color, animation: animation) } - func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: UIColor, animation: CAAnimation) { + func circleAt(frame: CGRect, layer: CALayer, size: CGSize, color: NSUIColor, animation: CAAnimation) { let circle = NVActivityIndicatorShape.circle.layerWith(size: size, color: color) circle.frame = frame @@ -76,4 +81,3 @@ class NVActivityIndicatorAnimationBallZigZagDeflect: NVActivityIndicatorAnimatio layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift index 00573763..c92c6f39 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationBlank.swift @@ -25,13 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationBlank: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in _: CALayer, size _: CGSize, color _: UIColor) { + func setUpAnimation(in _: CALayer, size _: CGSize, color _: NSUIColor) { // Do nothing } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift index d18dc834..f79306cf 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationCircleStrokeSpin.swift @@ -25,18 +25,24 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimationDelegate { - - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { - let beginTime: Double = 0.5 - let strokeStartDuration: Double = 1.2 - let strokeEndDuration: Double = 0.7 + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { + let beginTime = 0.5 + let strokeStartDuration = 1.2 + let strokeEndDuration = 0.7 let rotationAnimation = CABasicAnimation(keyPath: "transform.rotation") - rotationAnimation.byValue = Float.pi * 2 + + rotationAnimation.byValue = 2 * Double.pi + rotationAnimation.timingFunction = CAMediaTimingFunction(name: .linear) let strokeEndAnimation = CABasicAnimation(keyPath: "strokeEnd") @@ -46,11 +52,11 @@ class NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimation strokeEndAnimation.toValue = 1 let strokeStartAnimation = CABasicAnimation(keyPath: "strokeStart") + strokeStartAnimation.beginTime = beginTime strokeStartAnimation.duration = strokeStartDuration strokeStartAnimation.timingFunction = CAMediaTimingFunction(controlPoints: 0.4, 0.0, 0.2, 1.0) strokeStartAnimation.fromValue = 0 strokeStartAnimation.toValue = 1 - strokeStartAnimation.beginTime = beginTime let groupAnimation = CAAnimationGroup() groupAnimation.animations = [rotationAnimation, strokeEndAnimation, strokeStartAnimation] @@ -66,10 +72,9 @@ class NVActivityIndicatorAnimationCircleStrokeSpin: NVActivityIndicatorAnimation width: size.width, height: size.height ) - circle.frame = frame circle.add(groupAnimation, forKey: "animation") layer.addSublayer(circle) } } -#endif + diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift index 745aa664..13070942 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationCubeTransition.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationCubeTransition: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let squareSize = size.width / 5 let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -91,4 +96,3 @@ class NVActivityIndicatorAnimationCubeTransition: NVActivityIndicatorAnimationDe } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift index d3ce1aa8..383c57c1 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScale.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationLineScale: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSize = size.width / 9 let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -61,4 +66,3 @@ class NVActivityIndicatorAnimationLineScale: NVActivityIndicatorAnimationDelegat } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift index d1cbe13f..4bf1f776 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScaleParty.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationLineScaleParty: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSize = size.width / 7 let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -60,4 +65,3 @@ class NVActivityIndicatorAnimationLineScaleParty: NVActivityIndicatorAnimationDe } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift index 21192866..ee6aff78 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOut.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationLineScalePulseOut: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSize = size.width / 9 let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -64,4 +69,3 @@ class NVActivityIndicatorAnimationLineScalePulseOut: NVActivityIndicatorAnimatio } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift index 29d3c94b..3ef49be8 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationLineScalePulseOutRapid.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationLineScalePulseOutRapid: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSize = size.width / 9 let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 @@ -65,4 +70,3 @@ class NVActivityIndicatorAnimationLineScalePulseOutRapid: NVActivityIndicatorAni } } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift index c8408dca..70c34c31 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationLineSpinFadeLoader.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationLineSpinFadeLoader: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let lineSpacing: CGFloat = 2 let lineSize = CGSize(width: (size.width - 4 * lineSpacing) / 5, height: (size.height - 2 * lineSpacing) / 3) let x = (layer.bounds.size.width - size.width) / 2 @@ -64,7 +69,7 @@ class NVActivityIndicatorAnimationLineSpinFadeLoader: NVActivityIndicatorAnimati } } - func lineAt(angle: CGFloat, size: CGSize, origin: CGPoint, containerSize: CGSize, color: UIColor) -> CALayer { + func lineAt(angle: CGFloat, size: CGSize, origin: CGPoint, containerSize: CGSize, color: NSUIColor) -> CALayer { let radius = containerSize.width / 2 - max(size.width, size.height) / 2 let lineContainerSize = CGSize(width: max(size.width, size.height), height: max(size.width, size.height)) let lineContainer = CALayer() @@ -88,4 +93,3 @@ class NVActivityIndicatorAnimationLineSpinFadeLoader: NVActivityIndicatorAnimati return lineContainer } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift index 07f86662..1069b839 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationOrbit.swift @@ -25,8 +25,13 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { let duration: CFTimeInterval = 1.9 @@ -36,7 +41,7 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { var coreSize: CGFloat = 0 var satelliteSize: CGFloat = 0 - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { coreSize = size.width / (1 + satelliteCoreRatio + distanceRatio) satelliteSize = coreSize * satelliteCoreRatio @@ -46,7 +51,7 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { satelliteInLayer(layer, size: size, color: color) } - func ring1InLayer(_ layer: CALayer, size _: CGSize, color: UIColor) { + func ring1InLayer(_ layer: CALayer, size _: CGSize, color: NSUIColor) { // Scale animation let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale") @@ -74,17 +79,19 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { // Draw circle let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color) - let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2, - y: (layer.bounds.size.height - coreSize) / 2, - width: coreSize, - height: coreSize) + let frame = CGRect( + x: (layer.bounds.size.width - coreSize) / 2, + y: (layer.bounds.size.height - coreSize) / 2, + width: coreSize, + height: coreSize + ) circle.frame = frame circle.add(animation, forKey: "animation") layer.addSublayer(circle) } - func ring2InLayer(_ layer: CALayer, size _: CGSize, color: UIColor) { + func ring2InLayer(_ layer: CALayer, size _: CGSize, color: NSUIColor) { // Scale animation let scaleAnimation = CAKeyframeAnimation(keyPath: "transform.scale") @@ -112,17 +119,19 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { // Draw circle let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color) - let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2, - y: (layer.bounds.size.height - coreSize) / 2, - width: coreSize, - height: coreSize) + let frame = CGRect( + x: (layer.bounds.size.width - coreSize) / 2, + y: (layer.bounds.size.height - coreSize) / 2, + width: coreSize, + height: coreSize + ) circle.frame = frame circle.add(animation, forKey: "animation") layer.addSublayer(circle) } - func coreInLayer(_ layer: CALayer, size _: CGSize, color: UIColor) { + func coreInLayer(_ layer: CALayer, size _: CGSize, color: NSUIColor) { let inTimingFunction = CAMediaTimingFunction(controlPoints: 0.7, 0, 1, 0.5) let outTimingFunction = CAMediaTimingFunction(controlPoints: 0, 0.7, 0.5, 1) let standByTimingFunction = CAMediaTimingFunction(name: .linear) @@ -139,25 +148,36 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { // Draw circle let circle = NVActivityIndicatorShape.circle.layerWith(size: CGSize(width: coreSize, height: coreSize), color: color) - let frame = CGRect(x: (layer.bounds.size.width - coreSize) / 2, - y: (layer.bounds.size.height - coreSize) / 2, - width: coreSize, - height: coreSize) + let frame = CGRect( + x: (layer.bounds.size.width - coreSize) / 2, + y: (layer.bounds.size.height - coreSize) / 2, + width: coreSize, + height: coreSize + ) circle.frame = frame circle.add(scaleAnimation, forKey: "animation") layer.addSublayer(circle) } - func satelliteInLayer(_ layer: CALayer, size: CGSize, color: UIColor) { + func satelliteInLayer(_ layer: CALayer, size: CGSize, color: NSUIColor) { // Rotate animation let rotateAnimation = CAKeyframeAnimation(keyPath: "position") - - rotateAnimation.path = UIBezierPath(arcCenter: CGPoint(x: layer.bounds.midX, y: layer.bounds.midY), - radius: (size.width - satelliteSize) / 2, - startAngle: CGFloat(Double.pi * 1.5), - endAngle: CGFloat(Double.pi * 1.5 + 4 * Double.pi), - clockwise: true).cgPath + + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + let clockwise = false + #endif + + #if canImport(UIKit) + let clockwise = true + #endif + rotateAnimation.path = NSUIBezierPath( + arcCenter: CGPoint(x: layer.bounds.midX, y: layer.bounds.midY), + radius: (size.width - satelliteSize) / 2, + startAngle: CGFloat(Double.pi * 1.5), + endAngle: CGFloat(Double.pi * 1.5 + 4 * Double.pi), + clockwise: clockwise + ).asCGPath rotateAnimation.duration = duration * 2 rotateAnimation.repeatCount = HUGE rotateAnimation.isRemovedOnCompletion = false @@ -171,4 +191,3 @@ class NVActivityIndicatorAnimationOrbit: NVActivityIndicatorAnimationDelegate { layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift index baa2e42a..e62c6b76 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationPacman.swift @@ -25,17 +25,22 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationPacman: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { circleInLayer(layer, size: size, color: color) pacmanInLayer(layer, size: size, color: color) } - func pacmanInLayer(_ layer: CALayer, size: CGSize, color: UIColor) { + func pacmanInLayer(_ layer: CALayer, size: CGSize, color: NSUIColor) { let pacmanSize = 2 * size.width / 3 let pacmanDuration: CFTimeInterval = 0.5 let timingFunction = CAMediaTimingFunction(name: .default) @@ -78,7 +83,7 @@ class NVActivityIndicatorAnimationPacman: NVActivityIndicatorAnimationDelegate { layer.addSublayer(pacman) } - func circleInLayer(_ layer: CALayer, size: CGSize, color: UIColor) { + func circleInLayer(_ layer: CALayer, size: CGSize, color: NSUIColor) { let circleSize = size.width / 5 let circleDuration: CFTimeInterval = 1 @@ -119,4 +124,3 @@ class NVActivityIndicatorAnimationPacman: NVActivityIndicatorAnimationDelegate { layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift index c83ae5b1..712a9ee6 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationSemiCircleSpin.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationSemiCircleSpin: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 0.6 // Animation @@ -56,4 +61,3 @@ class NVActivityIndicatorAnimationSemiCircleSpin: NVActivityIndicatorAnimationDe layer.addSublayer(circle) } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift index 537e9f65..10f024ac 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationSquareSpin.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationSquareSpin: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let duration: CFTimeInterval = 3 let timingFunction = CAMediaTimingFunction(controlPoints: 0.09, 0.57, 0.49, 0.9) @@ -78,4 +83,3 @@ class NVActivityIndicatorAnimationSquareSpin: NVActivityIndicatorAnimationDelega return transform } } -#endif diff --git a/Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift b/Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift index 319d3aef..57e5c986 100644 --- a/Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift +++ b/Sources/Base/Animations/NVActivityIndicatorAnimationTriangleSkewSpin.swift @@ -25,12 +25,17 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif class NVActivityIndicatorAnimationTriangleSkewSpin: NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) { + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) { let x = (layer.bounds.size.width - size.width) / 2 let y = (layer.bounds.size.height - size.height) / 2 let duration: CFTimeInterval = 3 @@ -76,4 +81,3 @@ class NVActivityIndicatorAnimationTriangleSkewSpin: NVActivityIndicatorAnimation return transform } } -#endif diff --git a/Sources/Base/Extensions.swift b/Sources/Base/Extensions.swift new file mode 100644 index 00000000..b7219eef --- /dev/null +++ b/Sources/Base/Extensions.swift @@ -0,0 +1,130 @@ +import Foundation +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + +#if canImport(UIKit) +import UIKit +#endif + +#if canImport(AppKit) && !targetEnvironment(macCatalyst) + +extension NSCoder { + static func cgPoint(for string: String) -> CGPoint { + NSPointFromString(string) + } +} + +extension NSBezierPath { + @inlinable + func addArc(withCenter center: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool) { + let startDegrees = startAngle * 180 / .pi + let endDegrees = endAngle * 180 / .pi + appendArc(withCenter: center, radius: radius, startAngle: startDegrees, endAngle: endDegrees, clockwise: clockwise) + } + + @inlinable + func addLine(to point: CGPoint) { + line(to: point) + } + + convenience init(roundedRect rect: CGRect, cornerRadius: CGFloat) { + self.init(roundedRect: rect, xRadius: cornerRadius, yRadius: cornerRadius) + } + + convenience init(arcCenter: CGPoint, radius: CGFloat, startAngle: CGFloat, endAngle: CGFloat, clockwise: Bool) { + self.init() + addArc(withCenter: arcCenter, radius: radius, startAngle: startAngle, endAngle: endAngle, clockwise: clockwise) + } + + var asCGPath: CGPath { + if #available(macOS 14.0, *) { + return cgPath + } else { + let path = CGMutablePath() + var points = [CGPoint](repeating: .zero, count: 3) + for i in 0 ..< elementCount { + let type = element(at: i, associatedPoints: &points) + switch type { + case .moveTo: path.move(to: points[0]) + case .lineTo: path.addLine(to: points[0]) + case .curveTo, + .cubicCurveTo: path.addCurve(to: points[2], control1: points[0], control2: points[1]) + case .closePath: path.closeSubpath() + default: + break + } + } + return path + } + } +} + +extension NSView { + var backgroundColor: NSColor? { + set { + setWantsLayer() + layer?.backgroundColor = newValue?.cgColor + } + get { + layer?.backgroundColor.flatMap { .init(cgColor: $0) } + } + } + + static func animate(withDuration duration: TimeInterval = 0.25, timingFunction: CAMediaTimingFunction? = nil, animations: @escaping () -> Void, completion: ((Bool) -> Void)? = nil) { + NSAnimationContext.runAnimationGroup { + context in + context.duration = duration + context.timingFunction = timingFunction ?? context.timingFunction + context.allowsImplicitAnimation = true + context.completionHandler = { + completion?(true) + } + animations() + } + } + + var alpha: CGFloat { + set { alphaValue = newValue } + get { alphaValue } + } + + func setWantsLayer() { + wantsLayer = true + } +} + +extension CGRect { + func inset(by insets: NSEdgeInsets) -> CGRect { + return CGRect( + x: origin.x + insets.left, + y: origin.y + insets.top, + width: width - (insets.left + insets.right), + height: height - (insets.top + insets.bottom) + ) + } +} + +extension NSValue { + convenience init(cgSize: CGSize) { + self.init(size: cgSize) + } +} + +#endif + +#if canImport(UIKit) + +extension UIBezierPath { + var asCGPath: CGPath { + cgPath + } +} + +#endif + +extension NSUIView { + var _layer: CALayer? { + layer + } +} diff --git a/Sources/Base/NVActivityIndicatorAnimationDelegate.swift b/Sources/Base/NVActivityIndicatorAnimationDelegate.swift index 9df681a6..ac729f00 100644 --- a/Sources/Base/NVActivityIndicatorAnimationDelegate.swift +++ b/Sources/Base/NVActivityIndicatorAnimationDelegate.swift @@ -25,11 +25,16 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif // swiftlint:disable:next class_delegate_protocol protocol NVActivityIndicatorAnimationDelegate { - func setUpAnimation(in layer: CALayer, size: CGSize, color: UIColor) + func setUpAnimation(in layer: CALayer, size: CGSize, color: NSUIColor) } -#endif + diff --git a/Sources/Base/NVActivityIndicatorShape.swift b/Sources/Base/NVActivityIndicatorShape.swift index 75ff2c57..e2e5e98d 100644 --- a/Sources/Base/NVActivityIndicatorShape.swift +++ b/Sources/Base/NVActivityIndicatorShape.swift @@ -25,8 +25,13 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif enum NVActivityIndicatorShape { case circle @@ -42,78 +47,173 @@ enum NVActivityIndicatorShape { case stroke // swiftlint:disable:next cyclomatic_complexity function_body_length - func layerWith(size: CGSize, color: UIColor) -> CALayer { - let layer: CAShapeLayer = CAShapeLayer() - var path: UIBezierPath = UIBezierPath() + func layerWith(size: CGSize, color: NSUIColor) -> CALayer { + let layer = CAShapeLayer() + var path = NSUIBezierPath() let lineWidth: CGFloat = 2 switch self { case .circle: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: 0, - endAngle: CGFloat(2 * Double.pi), - clockwise: false) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: 0, + endAngle: CGFloat(2 * Double.pi), + clockwise: false + ) layer.fillColor = color.cgColor case .circleSemi: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(-Double.pi / 6), - endAngle: CGFloat(-5 * Double.pi / 6), - clockwise: false) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(-Double.pi / 6), + endAngle: -CGFloat(-5 * Double.pi / 6), + clockwise: false + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(-Double.pi / 6), + endAngle: CGFloat(-5 * Double.pi / 6), + clockwise: false + ) + #endif path.close() layer.fillColor = color.cgColor case .ring: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: 0, - endAngle: CGFloat(2 * Double.pi), - clockwise: false) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: 0, + endAngle: CGFloat(2 * Double.pi), + clockwise: false + ) layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = lineWidth case .ringTwoHalfVertical: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(-3 * Double.pi / 4), - endAngle: CGFloat(-Double.pi / 4), - clockwise: true) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(-3 * Double.pi / 4), + endAngle: -CGFloat(-Double.pi / 4), + clockwise: true + ) path.move( - to: CGPoint(x: size.width / 2 - size.width / 2 * cos(CGFloat(Double.pi / 4)), - y: size.height / 2 + size.height / 2 * sin(CGFloat(Double.pi / 4))) - ) - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(-5 * Double.pi / 4), - endAngle: CGFloat(-7 * Double.pi / 4), - clockwise: false) + to: CGPoint( + x: size.width / 2 - size.width / 2 * cos(-CGFloat(Double.pi / 4)), + y: size.height / 2 + size.height / 2 * sin(-CGFloat(Double.pi / 4)) + ) + ) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(-5 * Double.pi / 4), + endAngle: -CGFloat(-7 * Double.pi / 4), + clockwise: false + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(-3 * Double.pi / 4), + endAngle: CGFloat(-Double.pi / 4), + clockwise: true + ) + path.move( + to: CGPoint( + x: size.width / 2 - size.width / 2 * cos(CGFloat(Double.pi / 4)), + y: size.height / 2 + size.height / 2 * sin(CGFloat(Double.pi / 4)) + ) + ) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(-5 * Double.pi / 4), + endAngle: CGFloat(-7 * Double.pi / 4), + clockwise: false + ) + #endif + layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = lineWidth case .ringTwoHalfHorizontal: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(3 * Double.pi / 4), - endAngle: CGFloat(5 * Double.pi / 4), - clockwise: true) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(3 * Double.pi / 4), + endAngle: -CGFloat(5 * Double.pi / 4), + clockwise: true + ) path.move( - to: CGPoint(x: size.width / 2 + size.width / 2 * cos(CGFloat(Double.pi / 4)), - y: size.height / 2 - size.height / 2 * sin(CGFloat(Double.pi / 4))) - ) - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(-Double.pi / 4), - endAngle: CGFloat(Double.pi / 4), - clockwise: true) + to: CGPoint( + x: size.width / 2 + size.width / 2 * cos(-CGFloat(Double.pi / 4)), + y: size.height / 2 - size.height / 2 * sin(-CGFloat(Double.pi / 4)) + ) + ) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(-Double.pi / 4), + endAngle: -CGFloat(Double.pi / 4), + clockwise: true + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(3 * Double.pi / 4), + endAngle: CGFloat(5 * Double.pi / 4), + clockwise: true + ) + path.move( + to: CGPoint( + x: size.width / 2 + size.width / 2 * cos(CGFloat(Double.pi / 4)), + y: size.height / 2 - size.height / 2 * sin(CGFloat(Double.pi / 4)) + ) + ) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(-Double.pi / 4), + endAngle: CGFloat(Double.pi / 4), + clockwise: true + ) + #endif layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = lineWidth case .ringThirdFour: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: CGFloat(-3 * Double.pi / 4), - endAngle: CGFloat(-Double.pi / 4), - clockwise: false) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -CGFloat(-3 * Double.pi / 4), + endAngle: -CGFloat(-Double.pi / 4), + clockwise: false + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: CGFloat(-3 * Double.pi / 4), + endAngle: CGFloat(-Double.pi / 4), + clockwise: false + ) + #endif layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = 2 @@ -132,34 +232,63 @@ enum NVActivityIndicatorShape { path.close() layer.fillColor = color.cgColor case .line: - path = UIBezierPath(roundedRect: CGRect(x: 0, y: 0, width: size.width, height: size.height), - cornerRadius: size.width / 2) + path = NSUIBezierPath( + roundedRect: CGRect(x: 0, y: 0, width: size.width, height: size.height), + cornerRadius: size.width / 2 + ) layer.fillColor = color.cgColor case .pacman: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 4, - startAngle: 0, - endAngle: CGFloat(2 * Double.pi), - clockwise: true) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 4, + startAngle: 0, + endAngle: -CGFloat(2 * Double.pi), + clockwise: true + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 4, + startAngle: 0, + endAngle: CGFloat(2 * Double.pi), + clockwise: true + ) + #endif layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = size.width / 2 case .stroke: - path.addArc(withCenter: CGPoint(x: size.width / 2, y: size.height / 2), - radius: size.width / 2, - startAngle: -(.pi / 2), - endAngle: .pi + .pi / 2, - clockwise: true) + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -(.pi / 2), + endAngle: .pi + .pi / 2, + clockwise: false + ) + #endif + + #if canImport(UIKit) + path.addArc( + withCenter: CGPoint(x: size.width / 2, y: size.height / 2), + radius: size.width / 2, + startAngle: -(.pi / 2), + endAngle: .pi + .pi / 2, + clockwise: true + ) + #endif layer.fillColor = nil layer.strokeColor = color.cgColor layer.lineWidth = 2 } layer.backgroundColor = nil - layer.path = path.cgPath + layer.path = path.asCGPath layer.frame = CGRect(x: 0, y: 0, width: size.width, height: size.height) return layer } } -#endif diff --git a/Sources/Base/NVActivityIndicatorView.swift b/Sources/Base/NVActivityIndicatorView.swift index ebd47719..0858261b 100644 --- a/Sources/Base/NVActivityIndicatorView.swift +++ b/Sources/Base/NVActivityIndicatorView.swift @@ -25,251 +25,186 @@ // SOFTWARE. // +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit +#endif + #if canImport(UIKit) import UIKit +#endif -/** - Enum of animation types used for activity indicator view. - - - Blank: Blank animation. - - BallPulse: BallPulse animation. - - BallGridPulse: BallGridPulse animation. - - BallClipRotate: BallClipRotate animation. - - SquareSpin: SquareSpin animation. - - BallClipRotatePulse: BallClipRotatePulse animation. - - BallClipRotateMultiple: BallClipRotateMultiple animation. - - BallPulseRise: BallPulseRise animation. - - BallRotate: BallRotate animation. - - CubeTransition: CubeTransition animation. - - BallZigZag: BallZigZag animation. - - BallZigZagDeflect: BallZigZagDeflect animation. - - BallTrianglePath: BallTrianglePath animation. - - BallScale: BallScale animation. - - LineScale: LineScale animation. - - LineScaleParty: LineScaleParty animation. - - BallScaleMultiple: BallScaleMultiple animation. - - BallPulseSync: BallPulseSync animation. - - BallBeat: BallBeat animation. - - BallDoubleBounce: BallDoubleBounce animation. - - LineScalePulseOut: LineScalePulseOut animation. - - LineScalePulseOutRapid: LineScalePulseOutRapid animation. - - BallScaleRipple: BallScaleRipple animation. - - BallScaleRippleMultiple: BallScaleRippleMultiple animation. - - BallSpinFadeLoader: BallSpinFadeLoader animation. - - LineSpinFadeLoader: LineSpinFadeLoader animation. - - TriangleSkewSpin: TriangleSkewSpin animation. - - Pacman: Pacman animation. - - BallGridBeat: BallGridBeat animation. - - SemiCircleSpin: SemiCircleSpin animation. - - BallRotateChase: BallRotateChase animation. - - Orbit: Orbit animation. - - AudioEqualizer: AudioEqualizer animation. - - CircleStrokeSpin: CircleStrokeSpin animation. - */ +/// Enum of animation types used for activity indicator view. +/// +/// - Blank: Blank animation. +/// - BallPulse: BallPulse animation. +/// - BallGridPulse: BallGridPulse animation. +/// - BallClipRotate: BallClipRotate animation. +/// - SquareSpin: SquareSpin animation. +/// - BallClipRotatePulse: BallClipRotatePulse animation. +/// - BallClipRotateMultiple: BallClipRotateMultiple animation. +/// - BallPulseRise: BallPulseRise animation. +/// - BallRotate: BallRotate animation. +/// - CubeTransition: CubeTransition animation. +/// - BallZigZag: BallZigZag animation. +/// - BallZigZagDeflect: BallZigZagDeflect animation. +/// - BallTrianglePath: BallTrianglePath animation. +/// - BallScale: BallScale animation. +/// - LineScale: LineScale animation. +/// - LineScaleParty: LineScaleParty animation. +/// - BallScaleMultiple: BallScaleMultiple animation. +/// - BallPulseSync: BallPulseSync animation. +/// - BallBeat: BallBeat animation. +/// - BallDoubleBounce: BallDoubleBounce animation. +/// - LineScalePulseOut: LineScalePulseOut animation. +/// - LineScalePulseOutRapid: LineScalePulseOutRapid animation. +/// - BallScaleRipple: BallScaleRipple animation. +/// - BallScaleRippleMultiple: BallScaleRippleMultiple animation. +/// - BallSpinFadeLoader: BallSpinFadeLoader animation. +/// - LineSpinFadeLoader: LineSpinFadeLoader animation. +/// - TriangleSkewSpin: TriangleSkewSpin animation. +/// - Pacman: Pacman animation. +/// - BallGridBeat: BallGridBeat animation. +/// - SemiCircleSpin: SemiCircleSpin animation. +/// - BallRotateChase: BallRotateChase animation. +/// - Orbit: Orbit animation. +/// - AudioEqualizer: AudioEqualizer animation. +/// - CircleStrokeSpin: CircleStrokeSpin animation. public enum NVActivityIndicatorType: CaseIterable { - /** - Blank. - - - returns: Instance of NVActivityIndicatorAnimationBlank. - */ + /// Blank. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBlank. case blank - /** - BallPulse. - - - returns: Instance of NVActivityIndicatorAnimationBallPulse. - */ + /// BallPulse. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallPulse. case ballPulse - /** - BallGridPulse. - - - returns: Instance of NVActivityIndicatorAnimationBallGridPulse. - */ + /// BallGridPulse. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallGridPulse. case ballGridPulse - /** - BallClipRotate. - - - returns: Instance of NVActivityIndicatorAnimationBallClipRotate. - */ + /// BallClipRotate. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallClipRotate. case ballClipRotate - /** - SquareSpin. - - - returns: Instance of NVActivityIndicatorAnimationSquareSpin. - */ + /// SquareSpin. + /// + /// - returns: Instance of NVActivityIndicatorAnimationSquareSpin. case squareSpin - /** - BallClipRotatePulse. - - - returns: Instance of NVActivityIndicatorAnimationBallClipRotatePulse. - */ + /// BallClipRotatePulse. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallClipRotatePulse. case ballClipRotatePulse - /** - BallClipRotateMultiple. - - - returns: Instance of NVActivityIndicatorAnimationBallClipRotateMultiple. - */ + /// BallClipRotateMultiple. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallClipRotateMultiple. case ballClipRotateMultiple - /** - BallPulseRise. - - - returns: Instance of NVActivityIndicatorAnimationBallPulseRise. - */ + /// BallPulseRise. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallPulseRise. case ballPulseRise - /** - BallRotate. - - - returns: Instance of NVActivityIndicatorAnimationBallRotate. - */ + /// BallRotate. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallRotate. case ballRotate - /** - CubeTransition. - - - returns: Instance of NVActivityIndicatorAnimationCubeTransition. - */ + /// CubeTransition. + /// + /// - returns: Instance of NVActivityIndicatorAnimationCubeTransition. case cubeTransition - /** - BallZigZag. - - - returns: Instance of NVActivityIndicatorAnimationBallZigZag. - */ + /// BallZigZag. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallZigZag. case ballZigZag - /** - BallZigZagDeflect - - - returns: Instance of NVActivityIndicatorAnimationBallZigZagDeflect - */ + /// BallZigZagDeflect + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallZigZagDeflect case ballZigZagDeflect - /** - BallTrianglePath. - - - returns: Instance of NVActivityIndicatorAnimationBallTrianglePath. - */ + /// BallTrianglePath. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallTrianglePath. case ballTrianglePath - /** - BallScale. - - - returns: Instance of NVActivityIndicatorAnimationBallScale. - */ + /// BallScale. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallScale. case ballScale - /** - LineScale. - - - returns: Instance of NVActivityIndicatorAnimationLineScale. - */ + /// LineScale. + /// + /// - returns: Instance of NVActivityIndicatorAnimationLineScale. case lineScale - /** - LineScaleParty. - - - returns: Instance of NVActivityIndicatorAnimationLineScaleParty. - */ + /// LineScaleParty. + /// + /// - returns: Instance of NVActivityIndicatorAnimationLineScaleParty. case lineScaleParty - /** - BallScaleMultiple. - - - returns: Instance of NVActivityIndicatorAnimationBallScaleMultiple. - */ + /// BallScaleMultiple. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallScaleMultiple. case ballScaleMultiple - /** - BallPulseSync. - - - returns: Instance of NVActivityIndicatorAnimationBallPulseSync. - */ + /// BallPulseSync. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallPulseSync. case ballPulseSync - /** - BallBeat. - - - returns: Instance of NVActivityIndicatorAnimationBallBeat. - */ + /// BallBeat. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallBeat. case ballBeat - /** - BallDoubleBounce. - - - returns: Instance of NVActivityIndicatorAnimationBallDoubleBounce. - */ + /// BallDoubleBounce. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallDoubleBounce. case ballDoubleBounce - /** - LineScalePulseOut. - - - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOut. - */ + /// LineScalePulseOut. + /// + /// - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOut. case lineScalePulseOut - /** - LineScalePulseOutRapid. - - - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOutRapid. - */ + /// LineScalePulseOutRapid. + /// + /// - returns: Instance of NVActivityIndicatorAnimationLineScalePulseOutRapid. case lineScalePulseOutRapid - /** - BallScaleRipple. - - - returns: Instance of NVActivityIndicatorAnimationBallScaleRipple. - */ + /// BallScaleRipple. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallScaleRipple. case ballScaleRipple - /** - BallScaleRippleMultiple. - - - returns: Instance of NVActivityIndicatorAnimationBallScaleRippleMultiple. - */ + /// BallScaleRippleMultiple. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallScaleRippleMultiple. case ballScaleRippleMultiple - /** - BallSpinFadeLoader. - - - returns: Instance of NVActivityIndicatorAnimationBallSpinFadeLoader. - */ + /// BallSpinFadeLoader. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallSpinFadeLoader. case ballSpinFadeLoader - /** - LineSpinFadeLoader. - - - returns: Instance of NVActivityIndicatorAnimationLineSpinFadeLoader. - */ + /// LineSpinFadeLoader. + /// + /// - returns: Instance of NVActivityIndicatorAnimationLineSpinFadeLoader. case lineSpinFadeLoader - /** - TriangleSkewSpin. - - - returns: Instance of NVActivityIndicatorAnimationTriangleSkewSpin. - */ + /// TriangleSkewSpin. + /// + /// - returns: Instance of NVActivityIndicatorAnimationTriangleSkewSpin. case triangleSkewSpin - /** - Pacman. - - - returns: Instance of NVActivityIndicatorAnimationPacman. - */ + /// Pacman. + /// + /// - returns: Instance of NVActivityIndicatorAnimationPacman. case pacman - /** - BallGridBeat. - - - returns: Instance of NVActivityIndicatorAnimationBallGridBeat. - */ + /// BallGridBeat. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallGridBeat. case ballGridBeat - /** - SemiCircleSpin. - - - returns: Instance of NVActivityIndicatorAnimationSemiCircleSpin. - */ + /// SemiCircleSpin. + /// + /// - returns: Instance of NVActivityIndicatorAnimationSemiCircleSpin. case semiCircleSpin - /** - BallRotateChase. - - - returns: Instance of NVActivityIndicatorAnimationBallRotateChase. - */ + /// BallRotateChase. + /// + /// - returns: Instance of NVActivityIndicatorAnimationBallRotateChase. case ballRotateChase - /** - Orbit. - - - returns: Instance of NVActivityIndicatorAnimationOrbit. - */ + /// Orbit. + /// + /// - returns: Instance of NVActivityIndicatorAnimationOrbit. case orbit - /** - AudioEqualizer. - - - returns: Instance of NVActivityIndicatorAnimationAudioEqualizer. - */ + /// AudioEqualizer. + /// + /// - returns: Instance of NVActivityIndicatorAnimationAudioEqualizer. case audioEqualizer - /** - Stroke. - - - returns: Instance of NVActivityIndicatorAnimationCircleStrokeSpin. - */ + /// Stroke. + /// + /// - returns: Instance of NVActivityIndicatorAnimationCircleStrokeSpin. case circleStrokeSpin // swiftlint:disable:next cyclomatic_complexity function_body_length @@ -345,28 +280,32 @@ public enum NVActivityIndicatorType: CaseIterable { return NVActivityIndicatorAnimationCircleStrokeSpin() } } + + public var animationName: String { + String(describing: animation()).replacingOccurrences(of: "NVActivityIndicatorView.NVActivityIndicatorAnimation", with: "") + } } /// Function that performs fade in/out animation. -public typealias FadeInAnimation = (UIView) -> Void +public typealias FadeInAnimation = (NSUIView) -> Void /// Function that performs fade out animation. /// /// - Note: Must call the second parameter on the animation completion. -public typealias FadeOutAnimation = (UIView, @escaping () -> Void) -> Void +public typealias FadeOutAnimation = (NSUIView, @escaping () -> Void) -> Void // swiftlint:disable file_length /// Activity indicator view with nice animations -public final class NVActivityIndicatorView: UIView { +public final class NVActivityIndicatorView: NSUIView { // swiftlint:disable identifier_name /// Default type. Default value is .BallSpinFadeLoader. public static var DEFAULT_TYPE: NVActivityIndicatorType = .ballSpinFadeLoader /// Default color of activity indicator. Default value is UIColor.white. - public static var DEFAULT_COLOR = UIColor.white + public static var DEFAULT_COLOR = NSUIColor.white /// Default color of text. Default value is UIColor.white. - public static var DEFAULT_TEXT_COLOR = UIColor.white + public static var DEFAULT_TEXT_COLOR = NSUIColor.white /// Default padding. Default value is 0. public static var DEFAULT_PADDING: CGFloat = 0 @@ -393,31 +332,38 @@ public final class NVActivityIndicatorView: UIView { public static var DEFAULT_BLOCKER_MESSAGE_SPACING = CGFloat(8.0) /// Default font of message displayed in UI blocker. Default value is bold system font, size 20. - public static var DEFAULT_BLOCKER_MESSAGE_FONT = UIFont.boldSystemFont(ofSize: 20) + public static var DEFAULT_BLOCKER_MESSAGE_FONT = NSUIFont.boldSystemFont(ofSize: 20) /// Default background color of UI blocker. Default value is UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) - public static var DEFAULT_BLOCKER_BACKGROUND_COLOR = UIColor(red: 0, green: 0, blue: 0, alpha: 0.5) + public static var DEFAULT_BLOCKER_BACKGROUND_COLOR = NSUIColor(red: 0, green: 0, blue: 0, alpha: 0.5) /// Default fade in animation. public static var DEFAULT_FADE_IN_ANIMATION: FadeInAnimation = { view in view.alpha = 0 - UIView.animate(withDuration: 0.25) { + NSUIView.animate(withDuration: 0.25) { view.alpha = 1 } } /// Default fade out animation. - public static var DEFAULT_FADE_OUT_ANIMATION: FadeOutAnimation = { (view, complete) in - UIView.animate(withDuration: 0.25, - animations: { - view.alpha = 0 - }, - completion: { completed in - if completed { - complete() - } - }) + public static var DEFAULT_FADE_OUT_ANIMATION: FadeOutAnimation = { view, complete in + NSUIView.animate( + withDuration: 0.25, + animations: { + view.alpha = 0 + }, + completion: { completed in + if completed { + complete() + } + } + ) } + + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + public override var isFlipped: Bool { true } + #endif + // swiftlint:enable identifier_name /// Animation type. @@ -434,7 +380,7 @@ public final class NVActivityIndicatorView: UIView { } /// Color of activity indicator view. - @IBInspectable public var color: UIColor = NVActivityIndicatorView.DEFAULT_COLOR + @IBInspectable public var color: NSUIColor = NVActivityIndicatorView.DEFAULT_COLOR /// Padding of activity indicator view. @IBInspectable public var padding: CGFloat = NVActivityIndicatorView.DEFAULT_PADDING @@ -444,52 +390,52 @@ public final class NVActivityIndicatorView: UIView { public var animating: Bool { return isAnimating } /// Current status of animation, read-only. - private(set) public var isAnimating: Bool = false - - /** - Returns an object initialized from data in a given unarchiver. - self, initialized using the data in decoder. - - - parameter decoder: an unarchiver object. + public private(set) var isAnimating: Bool = false - - returns: self, initialized using the data in decoder. - */ + /// Returns an object initialized from data in a given unarchiver. + /// self, initialized using the data in decoder. + /// + /// - parameter decoder: an unarchiver object. + /// + /// - returns: self, initialized using the data in decoder. public required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) - backgroundColor = UIColor.clear + backgroundColor = NSUIColor.clear isHidden = true + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + setWantsLayer() + #endif } - /** - Create a activity indicator view. - - Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params. - - - parameter frame: view's frame. - - parameter type: animation type. - - parameter color: color of activity indicator view. - - parameter padding: padding of activity indicator view. - - - returns: The activity indicator view. - */ - public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: UIColor? = nil, padding: CGFloat? = nil) { + /// Create a activity indicator view. + /// + /// Appropriate NVActivityIndicatorView.DEFAULT_* values are used for omitted params. + /// + /// - parameter frame: view's frame. + /// - parameter type: animation type. + /// - parameter color: color of activity indicator view. + /// - parameter padding: padding of activity indicator view. + /// + /// - returns: The activity indicator view. + public init(frame: CGRect, type: NVActivityIndicatorType? = nil, color: NSUIColor? = nil, padding: CGFloat? = nil) { self.type = type ?? NVActivityIndicatorView.DEFAULT_TYPE self.color = color ?? NVActivityIndicatorView.DEFAULT_COLOR self.padding = padding ?? NVActivityIndicatorView.DEFAULT_PADDING super.init(frame: frame) isHidden = true + #if canImport(AppKit) && !targetEnvironment(macCatalyst) + setWantsLayer() + #endif } - // Fix issue #62 - // Intrinsic content size is used in autolayout - // that causes mislayout when using with MBProgressHUD. - /** - Returns the natural size for the receiving view, considering only properties of the view itself. - - A size indicating the natural size for the receiving view based on its intrinsic properties. - - - returns: A size indicating the natural size for the receiving view based on its intrinsic properties. - */ + /// Fix issue #62 + /// Intrinsic content size is used in autolayout + /// that causes mislayout when using with MBProgressHUD. + /// Returns the natural size for the receiving view, considering only properties of the view itself. + /// + /// A size indicating the natural size for the receiving view based on its intrinsic properties. + /// + /// - returns: A size indicating the natural size for the receiving view based on its intrinsic properties. public override var intrinsicContentSize: CGSize { return CGSize(width: bounds.width, height: bounds.height) } @@ -503,29 +449,25 @@ public final class NVActivityIndicatorView: UIView { } } - /** - Start animating. - */ + /// Start animating. public final func startAnimating() { guard !isAnimating else { return } isHidden = false isAnimating = true - layer.speed = 1 + _layer?.speed = 1 setUpAnimation() } - /** - Stop animating. - */ + /// Stop animating. public final func stopAnimating() { guard isAnimating else { return } isHidden = true isAnimating = false - layer.sublayers?.removeAll() + _layer?.sublayers?.removeAll() } // MARK: Internal @@ -548,12 +490,13 @@ public final class NVActivityIndicatorView: UIView { private final func setUpAnimation() { let animation: NVActivityIndicatorAnimationDelegate = type.animation() - var animationRect = frame.inset(by: UIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)) + var animationRect = frame.inset(by: NSUIEdgeInsets(top: padding, left: padding, bottom: padding, right: padding)) let minEdge = min(animationRect.width, animationRect.height) - layer.sublayers = nil + _layer?.sublayers = nil animationRect.size = CGSize(width: minEdge, height: minEdge) - animation.setUpAnimation(in: layer, size: animationRect.size, color: color) + if let layer = _layer { + animation.setUpAnimation(in: layer, size: animationRect.size, color: color) + } } } -#endif diff --git a/Sources/Base/Typealias.swift b/Sources/Base/Typealias.swift new file mode 100644 index 00000000..a1e97a39 --- /dev/null +++ b/Sources/Base/Typealias.swift @@ -0,0 +1,37 @@ +#if canImport(AppKit) && !targetEnvironment(macCatalyst) +import AppKit + +public typealias NSUIView = NSView +public typealias NSUIViewController = NSViewController +public typealias NSUIStoryboard = NSStoryboard +public typealias NSUIStackView = NSStackView +public typealias NSUIStackViewOrientationOrAxis = NSUserInterfaceLayoutOrientation +public typealias NSUILayoutConstraintOrientationOrAxis = NSLayoutConstraint.Orientation +public typealias NSUILayoutPriority = NSLayoutConstraint.Priority +public typealias NSUIStackViewAlignment = NSLayoutConstraint.Attribute +public typealias NSUIStackViewDistribution = NSUIStackView.Distribution +public typealias NSUIEdgeInsets = NSEdgeInsets +public typealias NSUILayoutGuide = NSLayoutGuide +public typealias NSUIColor = NSColor +public typealias NSUIFont = NSFont +public typealias NSUIBezierPath = NSBezierPath +#endif + +#if canImport(UIKit) +import UIKit + +public typealias NSUIView = UIView +public typealias NSUIViewController = UIViewController +public typealias NSUIStoryboard = UIStoryboard +public typealias NSUIStackView = UIStackView +public typealias NSUIStackViewOrientationOrAxis = NSLayoutConstraint.Axis +public typealias NSUIStackViewAlignment = NSUIStackView.Alignment +public typealias NSUIStackViewDistribution = NSUIStackView.Distribution +public typealias NSUILayoutPriority = UILayoutPriority +public typealias NSUILayoutConstraintOrientationOrAxis = NSLayoutConstraint.Axis +public typealias NSUIEdgeInsets = UIEdgeInsets +public typealias NSUILayoutGuide = UILayoutGuide +public typealias NSUIColor = UIColor +public typealias NSUIBezierPath = UIBezierPath +public typealias NSUIFont = UIFont +#endif