From 247430de661978bd0f90d26b3c5d11c20bb3e99a Mon Sep 17 00:00:00 2001 From: kean Date: Fri, 28 Jun 2024 08:27:42 -0400 Subject: [PATCH 1/5] Add Package.swift --- .gitignore | 4 ++-- Package.swift | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 Package.swift diff --git a/.gitignore b/.gitignore index b169669..4a8761f 100644 --- a/.gitignore +++ b/.gitignore @@ -38,12 +38,12 @@ playground.xcworkspace # Add this line if you want to avoid checking in source code from Swift Package Manager dependencies. # Packages/ # Package.pins -# Package.resolved +Package.resolved # *.xcodeproj # # Xcode automatically generates this directory with a .xcworkspacedata file and xcuserdata # hence it is not needed unless you have added a package configuration file to your project -# .swiftpm +.swiftpm .build/ diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..cd3ccda --- /dev/null +++ b/Package.swift @@ -0,0 +1,22 @@ +// swift-tools-version:5.10 + +import Foundation +import PackageDescription + +let package = Package( + name: "MediaEditor", + platforms: [.iOS(.v15)], + products: [ + .library(name: "MediaEditor", targets: ["MediaEditor"]) + ], + dependencies: [ + .package(url: "https://github.com/TimOliver/TOCropViewController", from: "2.5.3") + ], + targets: [ + .target( + name: "MediaEditor", + dependencies: [ + .product(name: "CropViewController", package: "TOCropViewController") + ]) + ] +) From e0c6a623587d99d6e23983466f404340547ef5cc Mon Sep 17 00:00:00 2001 From: kean Date: Fri, 28 Jun 2024 08:37:19 -0400 Subject: [PATCH 2/5] Add resources --- Package.swift | 5 +++-- Sources/Extensions/Bundle+mediaEditor.swift | 6 +++++- .../{ => Resources}/Media.xcassets/Contents.json | 0 .../Media.xcassets/filters.imageset/Contents.json | 0 .../filters.imageset/filters-icon.pdf | Bin .../gridicons-crop.imageset/Contents.json | 0 .../gridicons-crop.imageset/gridicons-crop.pdf | Bin .../gridicons-cross.imageset/Contents.json | 0 .../gridicons-cross.imageset/gridicons-cross.pdf | Bin .../MediaEditorDrawing.storyboard | 0 .../MediaEditorFilters.storyboard | 0 Sources/{ => Resources}/MediaEditorHub.storyboard | 0 12 files changed, 8 insertions(+), 3 deletions(-) rename Sources/{ => Resources}/Media.xcassets/Contents.json (100%) rename Sources/{ => Resources}/Media.xcassets/filters.imageset/Contents.json (100%) rename Sources/{ => Resources}/Media.xcassets/filters.imageset/filters-icon.pdf (100%) rename Sources/{ => Resources}/Media.xcassets/gridicons-crop.imageset/Contents.json (100%) rename Sources/{ => Resources}/Media.xcassets/gridicons-crop.imageset/gridicons-crop.pdf (100%) rename Sources/{ => Resources}/Media.xcassets/gridicons-cross.imageset/Contents.json (100%) rename Sources/{ => Resources}/Media.xcassets/gridicons-cross.imageset/gridicons-cross.pdf (100%) rename Sources/{Capabilities/Drawing => Resources}/MediaEditorDrawing.storyboard (100%) rename Sources/{Capabilities/Filters => Resources}/MediaEditorFilters.storyboard (100%) rename Sources/{ => Resources}/MediaEditorHub.storyboard (100%) diff --git a/Package.swift b/Package.swift index cd3ccda..028d25d 100644 --- a/Package.swift +++ b/Package.swift @@ -14,9 +14,10 @@ let package = Package( ], targets: [ .target( - name: "MediaEditor", + name: "MediaEditor", dependencies: [ .product(name: "CropViewController", package: "TOCropViewController") - ]) + ], + resources: [.process("Resources")]) ] ) diff --git a/Sources/Extensions/Bundle+mediaEditor.swift b/Sources/Extensions/Bundle+mediaEditor.swift index 17adab9..eb824fe 100644 --- a/Sources/Extensions/Bundle+mediaEditor.swift +++ b/Sources/Extensions/Bundle+mediaEditor.swift @@ -2,13 +2,17 @@ import Foundation extension Bundle { @objc public class var mediaEditor: Bundle { +#if SWIFT_PACKAGE + return Bundle.module +#else let defaultBundle = Bundle(for: MediaEditor.self) // If installed with CocoaPods, resources will be in MediaEditor.bundle if let bundleURL = defaultBundle.resourceURL, - let resourceBundle = Bundle(url: bundleURL.appendingPathComponent("MediaEditor.bundle")) { + let resourceBundle = Bundle(url: bundleURL.appendingPathComponent("MediaEditor.bundle")) { return resourceBundle } // Otherwise, the default bundle is used for resources return defaultBundle +#endif } } diff --git a/Sources/Media.xcassets/Contents.json b/Sources/Resources/Media.xcassets/Contents.json similarity index 100% rename from Sources/Media.xcassets/Contents.json rename to Sources/Resources/Media.xcassets/Contents.json diff --git a/Sources/Media.xcassets/filters.imageset/Contents.json b/Sources/Resources/Media.xcassets/filters.imageset/Contents.json similarity index 100% rename from Sources/Media.xcassets/filters.imageset/Contents.json rename to Sources/Resources/Media.xcassets/filters.imageset/Contents.json diff --git a/Sources/Media.xcassets/filters.imageset/filters-icon.pdf b/Sources/Resources/Media.xcassets/filters.imageset/filters-icon.pdf similarity index 100% rename from Sources/Media.xcassets/filters.imageset/filters-icon.pdf rename to Sources/Resources/Media.xcassets/filters.imageset/filters-icon.pdf diff --git a/Sources/Media.xcassets/gridicons-crop.imageset/Contents.json b/Sources/Resources/Media.xcassets/gridicons-crop.imageset/Contents.json similarity index 100% rename from Sources/Media.xcassets/gridicons-crop.imageset/Contents.json rename to Sources/Resources/Media.xcassets/gridicons-crop.imageset/Contents.json diff --git a/Sources/Media.xcassets/gridicons-crop.imageset/gridicons-crop.pdf b/Sources/Resources/Media.xcassets/gridicons-crop.imageset/gridicons-crop.pdf similarity index 100% rename from Sources/Media.xcassets/gridicons-crop.imageset/gridicons-crop.pdf rename to Sources/Resources/Media.xcassets/gridicons-crop.imageset/gridicons-crop.pdf diff --git a/Sources/Media.xcassets/gridicons-cross.imageset/Contents.json b/Sources/Resources/Media.xcassets/gridicons-cross.imageset/Contents.json similarity index 100% rename from Sources/Media.xcassets/gridicons-cross.imageset/Contents.json rename to Sources/Resources/Media.xcassets/gridicons-cross.imageset/Contents.json diff --git a/Sources/Media.xcassets/gridicons-cross.imageset/gridicons-cross.pdf b/Sources/Resources/Media.xcassets/gridicons-cross.imageset/gridicons-cross.pdf similarity index 100% rename from Sources/Media.xcassets/gridicons-cross.imageset/gridicons-cross.pdf rename to Sources/Resources/Media.xcassets/gridicons-cross.imageset/gridicons-cross.pdf diff --git a/Sources/Capabilities/Drawing/MediaEditorDrawing.storyboard b/Sources/Resources/MediaEditorDrawing.storyboard similarity index 100% rename from Sources/Capabilities/Drawing/MediaEditorDrawing.storyboard rename to Sources/Resources/MediaEditorDrawing.storyboard diff --git a/Sources/Capabilities/Filters/MediaEditorFilters.storyboard b/Sources/Resources/MediaEditorFilters.storyboard similarity index 100% rename from Sources/Capabilities/Filters/MediaEditorFilters.storyboard rename to Sources/Resources/MediaEditorFilters.storyboard diff --git a/Sources/MediaEditorHub.storyboard b/Sources/Resources/MediaEditorHub.storyboard similarity index 100% rename from Sources/MediaEditorHub.storyboard rename to Sources/Resources/MediaEditorHub.storyboard From f3d6eba159fe9b1f391c06385a95f2ccb467ad35 Mon Sep 17 00:00:00 2001 From: kean Date: Fri, 28 Jun 2024 08:48:05 -0400 Subject: [PATCH 3/5] Update usage of resources --- Sources/Capabilities/Drawing/MediaEditorDrawing.swift | 2 +- Sources/Capabilities/Filters/MediaEditorFilters.swift | 2 +- Sources/Extensions/Bundle+mediaEditor.swift | 8 ++++++++ Sources/MediaEditorHub.swift | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Sources/Capabilities/Drawing/MediaEditorDrawing.swift b/Sources/Capabilities/Drawing/MediaEditorDrawing.swift index dd5d643..3677b71 100644 --- a/Sources/Capabilities/Drawing/MediaEditorDrawing.swift +++ b/Sources/Capabilities/Drawing/MediaEditorDrawing.swift @@ -20,7 +20,7 @@ class MediaEditorDrawing: UIViewController { static func initialize() -> MediaEditorDrawing { return UIStoryboard( name: "MediaEditorDrawing", - bundle: Bundle(for: MediaEditorDrawing.self) + bundle: .mediaEditorBundle(for: MediaEditorDrawing.self) ).instantiateViewController(withIdentifier: "drawingViewController") as! MediaEditorDrawing } diff --git a/Sources/Capabilities/Filters/MediaEditorFilters.swift b/Sources/Capabilities/Filters/MediaEditorFilters.swift index a0af514..d6f145f 100644 --- a/Sources/Capabilities/Filters/MediaEditorFilters.swift +++ b/Sources/Capabilities/Filters/MediaEditorFilters.swift @@ -120,7 +120,7 @@ class MediaEditorFilters: UIViewController { static func initialize() -> MediaEditorFilters { return UIStoryboard( name: "MediaEditorFilters", - bundle: Bundle(for: MediaEditorFilters.self) + bundle: .mediaEditorBundle(for: MediaEditorFilters.self) ).instantiateViewController(withIdentifier: "filtersViewController") as! MediaEditorFilters } diff --git a/Sources/Extensions/Bundle+mediaEditor.swift b/Sources/Extensions/Bundle+mediaEditor.swift index eb824fe..0b4d1bd 100644 --- a/Sources/Extensions/Bundle+mediaEditor.swift +++ b/Sources/Extensions/Bundle+mediaEditor.swift @@ -13,6 +13,14 @@ extension Bundle { } // Otherwise, the default bundle is used for resources return defaultBundle +#endif + } + + static func mediaEditorBundle(for type: AnyClass) -> Bundle? { +#if SWIFT_PACKAGE + return Bundle.module +#else + return Bundle(for: type) #endif } } diff --git a/Sources/MediaEditorHub.swift b/Sources/MediaEditorHub.swift index a9aed0c..34ccd54 100644 --- a/Sources/MediaEditorHub.swift +++ b/Sources/MediaEditorHub.swift @@ -253,7 +253,7 @@ public class MediaEditorHub: UIViewController { } static func initialize() -> MediaEditorHub { - return UIStoryboard(name: "MediaEditorHub", bundle: Bundle(for: MediaEditorHub.self)).instantiateViewController(withIdentifier: "hubViewController") as! MediaEditorHub + return UIStoryboard(name: "MediaEditorHub", bundle: .mediaEditorBundle(for: MediaEditorHub.self)).instantiateViewController(withIdentifier: "hubViewController") as! MediaEditorHub } private enum Constants { From 4f3fe298a95d1de81099f8c9e5612e0c59c9bf53 Mon Sep 17 00:00:00 2001 From: kean Date: Fri, 28 Jun 2024 09:08:39 -0400 Subject: [PATCH 4/5] Use ObjC for custom classes in storyboards --- .../Drawing/MediaEditorAnnotationView.swift | 1 + .../Drawing/MediaEditorDrawing.swift | 1 + .../Filters/Cells/MediaEditorFilterCell.swift | 1 + .../Filters/MediaEditorFilters.swift | 1 + Sources/MediaEditorCapabilityCell.swift | 1 + Sources/MediaEditorHub.swift | 1 + Sources/MediaEditorImageCell.swift | 1 + Sources/MediaEditorThumbCell.swift | 1 + .../Resources/MediaEditorDrawing.storyboard | 22 ++++++------ .../Resources/MediaEditorFilters.storyboard | 36 ++++++++++--------- Sources/Resources/MediaEditorHub.storyboard | 31 ++++++++-------- 11 files changed, 54 insertions(+), 43 deletions(-) diff --git a/Sources/Capabilities/Drawing/MediaEditorAnnotationView.swift b/Sources/Capabilities/Drawing/MediaEditorAnnotationView.swift index 0cd4530..b79dca4 100644 --- a/Sources/Capabilities/Drawing/MediaEditorAnnotationView.swift +++ b/Sources/Capabilities/Drawing/MediaEditorAnnotationView.swift @@ -11,6 +11,7 @@ protocol MediaEditorAnnotationViewUndoObserver: NSObject { /// Wrapper view that contains an image view and a PencilKit canvas to allow /// drawing on top of the image. /// +@objc(WPMediaEditorAnnotationView) @available(iOS 13.0, *) class MediaEditorAnnotationView: UIView { diff --git a/Sources/Capabilities/Drawing/MediaEditorDrawing.swift b/Sources/Capabilities/Drawing/MediaEditorDrawing.swift index 3677b71..9e674a7 100644 --- a/Sources/Capabilities/Drawing/MediaEditorDrawing.swift +++ b/Sources/Capabilities/Drawing/MediaEditorDrawing.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorDrawingViewController) @available(iOS 13.0, *) class MediaEditorDrawing: UIViewController { diff --git a/Sources/Capabilities/Filters/Cells/MediaEditorFilterCell.swift b/Sources/Capabilities/Filters/Cells/MediaEditorFilterCell.swift index 5bcc540..9be6516 100644 --- a/Sources/Capabilities/Filters/Cells/MediaEditorFilterCell.swift +++ b/Sources/Capabilities/Filters/Cells/MediaEditorFilterCell.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorFilterCell) class MediaEditorFilterCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var title: UILabel! diff --git a/Sources/Capabilities/Filters/MediaEditorFilters.swift b/Sources/Capabilities/Filters/MediaEditorFilters.swift index d6f145f..c6e6a60 100644 --- a/Sources/Capabilities/Filters/MediaEditorFilters.swift +++ b/Sources/Capabilities/Filters/MediaEditorFilters.swift @@ -5,6 +5,7 @@ struct MediaEditorFilter { let ciFilterName: String } +@objc(WPMediaEditorFiltersViewController) class MediaEditorFilters: UIViewController { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var filtersCollectionView: UICollectionView! diff --git a/Sources/MediaEditorCapabilityCell.swift b/Sources/MediaEditorCapabilityCell.swift index 3886f1f..12f536a 100644 --- a/Sources/MediaEditorCapabilityCell.swift +++ b/Sources/MediaEditorCapabilityCell.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorCapabilityCell) class MediaEditorCapabilityCell: UICollectionViewCell { @IBOutlet weak var iconButton: UIButton! diff --git a/Sources/MediaEditorHub.swift b/Sources/MediaEditorHub.swift index 34ccd54..09863b7 100644 --- a/Sources/MediaEditorHub.swift +++ b/Sources/MediaEditorHub.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorHubViewController) public class MediaEditorHub: UIViewController { @IBOutlet public weak var doneButton: UIButton! diff --git a/Sources/MediaEditorImageCell.swift b/Sources/MediaEditorImageCell.swift index e9c9740..a6f739c 100644 --- a/Sources/MediaEditorImageCell.swift +++ b/Sources/MediaEditorImageCell.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorImageCell) class MediaEditorImageCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var errorView: UIView! diff --git a/Sources/MediaEditorThumbCell.swift b/Sources/MediaEditorThumbCell.swift index 9fc11a5..65927ff 100644 --- a/Sources/MediaEditorThumbCell.swift +++ b/Sources/MediaEditorThumbCell.swift @@ -1,5 +1,6 @@ import UIKit +@objc(WPMediaEditorThumbCell) class MediaEditorThumbCell: UICollectionViewCell { @IBOutlet weak var thumbImageView: UIImageView! diff --git a/Sources/Resources/MediaEditorDrawing.storyboard b/Sources/Resources/MediaEditorDrawing.storyboard index b881ad9..c989619 100644 --- a/Sources/Resources/MediaEditorDrawing.storyboard +++ b/Sources/Resources/MediaEditorDrawing.storyboard @@ -1,28 +1,28 @@ - + - + - + - + - + - - - + -