From 8577da7b5f527e9cc34ad366f228f9622d22b9c3 Mon Sep 17 00:00:00 2001 From: Josh Guffey Date: Wed, 29 Aug 2018 21:24:05 -0700 Subject: [PATCH 1/3] Fix Main Thread issue SNFilter is subclass of UIImageView, which can only be init'd from the main thread. You'd have to not be a UIView if you want to do background threading. Now, changing to generate filters on the main thread, has no perceivable impact on filter generation on my iPhoneX, nor iPhone6. --- SnapSliderFilters/Classes/SNFilter.swift | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/SnapSliderFilters/Classes/SNFilter.swift b/SnapSliderFilters/Classes/SNFilter.swift index 364e3d3..bd9eb9d 100644 --- a/SnapSliderFilters/Classes/SNFilter.swift +++ b/SnapSliderFilters/Classes/SNFilter.swift @@ -109,16 +109,9 @@ open class SNFilter: UIImageView { var finalFilters = [SNFilter]() - let queue = DispatchQueue.global(priority: DispatchQueue.GlobalQueuePriority.high) - let syncQueue = DispatchQueue(label: "com.snapsliderfilters.app", attributes: .concurrent) - - // Each filter can be generated on a different thread - DispatchQueue.concurrentPerform(iterations: filters.count) { iteration in - let filterComputed = originalImage.applyFilter(filterNamed: filters[iteration]) - syncQueue.sync { - finalFilters.append(filterComputed) - return - } + for filter in filters { + let filterComputed = originalImage.applyFilter(filterNamed: filter) + finalFilters.append(filterComputed) } return finalFilters From 83a8febe32f48dbefca876b0704cfe194d82286b Mon Sep 17 00:00:00 2001 From: Josh Guffey Date: Sun, 25 Aug 2019 20:15:35 -0700 Subject: [PATCH 2/3] Adds Swift5 and iOS 12.4 support --- Example/Pods/Pods.xcodeproj/project.pbxproj | 31 ++++++++++--------- .../xcshareddata/IDEWorkspaceChecks.plist | 8 +++++ SnapSliderFilters/Classes/SNButton.swift | 10 +++--- SnapSliderFilters/Classes/SNFilter.swift | 6 ++-- SnapSliderFilters/Classes/SNSticker.swift | 2 +- SnapSliderFilters/Classes/SNTextField.swift | 12 +++---- SnapSliderFilters/Classes/SNUtils.swift | 4 +-- 7 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 Example/Pods/Pods.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index cf8fa95..a5fcc64 100644 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -358,6 +358,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 7DB346D0F39D3F0E887471402A8071AB; @@ -450,8 +451,9 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; VALIDATE_PRODUCT = YES; }; @@ -471,7 +473,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; INFOPLIST_FILE = "Target Support Files/Pods-SnapSliderFilters_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-SnapSliderFilters_Example/Pods-SnapSliderFilters_Example.modulemap"; @@ -482,7 +484,7 @@ PRODUCT_NAME = Pods_SnapSliderFilters_Example; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -503,7 +505,7 @@ GCC_PREFIX_HEADER = "Target Support Files/SnapSliderFilters/SnapSliderFilters-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SnapSliderFilters/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SnapSliderFilters/SnapSliderFilters.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; @@ -511,7 +513,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -550,9 +552,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; ONLY_ACTIVE_ARCH = YES; STRIP_INSTALLED_PRODUCT = NO; + SWIFT_VERSION = 5.0; SYMROOT = "${SRCROOT}/../build"; }; name = Debug; @@ -571,7 +574,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; INFOPLIST_FILE = "Target Support Files/Pods-SnapSliderFilters_Example/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-SnapSliderFilters_Example/Pods-SnapSliderFilters_Example.modulemap"; @@ -583,7 +586,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -603,7 +606,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; INFOPLIST_FILE = "Target Support Files/Pods-SnapSliderFilters_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-SnapSliderFilters_Tests/Pods-SnapSliderFilters_Tests.modulemap"; @@ -615,7 +618,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -636,14 +639,14 @@ GCC_PREFIX_HEADER = "Target Support Files/SnapSliderFilters/SnapSliderFilters-prefix.pch"; INFOPLIST_FILE = "Target Support Files/SnapSliderFilters/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MODULEMAP_FILE = "Target Support Files/SnapSliderFilters/SnapSliderFilters.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_NAME = SnapSliderFilters; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -663,7 +666,7 @@ ENABLE_STRICT_OBJC_MSGSEND = YES; INFOPLIST_FILE = "Target Support Files/Pods-SnapSliderFilters_Tests/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MACH_O_TYPE = staticlib; MODULEMAP_FILE = "Target Support Files/Pods-SnapSliderFilters_Tests/Pods-SnapSliderFilters_Tests.modulemap"; @@ -674,7 +677,7 @@ PRODUCT_NAME = Pods_SnapSliderFilters_Tests; SDKROOT = iphoneos; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/Example/Pods/Pods.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/Pods/Pods.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/Pods/Pods.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/SnapSliderFilters/Classes/SNButton.swift b/SnapSliderFilters/Classes/SNButton.swift index 1b75f68..ad97e0d 100644 --- a/SnapSliderFilters/Classes/SNButton.swift +++ b/SnapSliderFilters/Classes/SNButton.swift @@ -94,8 +94,8 @@ open class SNButton: UIButton { self.layer.zPosition = 1000 self.adjustsImageWhenHighlighted = false - self.setImage(UIImage(named: name), for: UIControlState()) - self.imageEdgeInsets = UIEdgeInsetsMake(10, 10, 10, 10) + self.setImage(UIImage(named: name), for: UIControl.State()) + self.imageEdgeInsets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10) self.addTarget(self, action: #selector(buttonTouchUpInside), for: .touchUpInside) self.addTarget(self, action: #selector(buttonPressed), for: .touchDown) @@ -114,16 +114,16 @@ open class SNButton: UIButton { self.action = actionClosure } - func buttonTouchUpInside() { + @objc func buttonTouchUpInside() { shouldRunAction=true buttonReleased() } - func buttonPressed() { + @objc func buttonPressed() { buttonState = .bigButton } - func buttonReleased() { + @objc func buttonReleased() { buttonState = .smallButton } } diff --git a/SnapSliderFilters/Classes/SNFilter.swift b/SnapSliderFilters/Classes/SNFilter.swift index bd9eb9d..1d1719d 100644 --- a/SnapSliderFilters/Classes/SNFilter.swift +++ b/SnapSliderFilters/Classes/SNFilter.swift @@ -11,7 +11,7 @@ import UIKit open class SNFilter: UIImageView { // Full list of filters available here : https://developer.apple.com/library/tvos/documentation/GraphicsImaging/Reference/CoreImageFilterReference/index.html - open static let filterNameList = ["No Filter" , "CIPhotoEffectFade", "CIPhotoEffectChrome", "CIPhotoEffectTransfer", "CIPhotoEffectInstant", "CIPhotoEffectMono", "CIPhotoEffectNoir", "CIPhotoEffectProcess", "CIPhotoEffectTonal"] + public static let filterNameList = ["No Filter" , "CIPhotoEffectFade", "CIPhotoEffectChrome", "CIPhotoEffectTransfer", "CIPhotoEffectInstant", "CIPhotoEffectMono", "CIPhotoEffectNoir", "CIPhotoEffectProcess", "CIPhotoEffectTonal"] open var name:String? var stickers = [SNSticker]() @@ -19,7 +19,7 @@ open class SNFilter: UIImageView { super.init(frame: frame) } - public init(frame: CGRect, withImage image:UIImage, withContentMode mode:UIViewContentMode = .scaleAspectFill) { + public init(frame: CGRect, withImage image:UIImage, withContentMode mode:UIView.ContentMode = .scaleAspectFill) { super.init(frame: frame) self.contentMode = mode self.clipsToBounds = true @@ -105,7 +105,7 @@ open class SNFilter: UIImageView { self.stickers.append(sticker) } - open static func generateFilters(_ originalImage: SNFilter, filters:[String]) -> [SNFilter] { + public static func generateFilters(_ originalImage: SNFilter, filters:[String]) -> [SNFilter] { var finalFilters = [SNFilter]() diff --git a/SnapSliderFilters/Classes/SNSticker.swift b/SnapSliderFilters/Classes/SNSticker.swift index 9d2b86e..88fa995 100644 --- a/SnapSliderFilters/Classes/SNSticker.swift +++ b/SnapSliderFilters/Classes/SNSticker.swift @@ -10,7 +10,7 @@ import UIKit open class SNSticker: UIImageView { - public init(frame: CGRect, image:UIImage, withContentMode mode: UIViewContentMode = .scaleAspectFit, atZPosition zIndex:CGFloat? = nil) { + public init(frame: CGRect, image:UIImage, withContentMode mode: UIView.ContentMode = .scaleAspectFit, atZPosition zIndex:CGFloat? = nil) { super.init(frame: frame) self.contentMode = mode diff --git a/SnapSliderFilters/Classes/SNTextField.swift b/SnapSliderFilters/Classes/SNTextField.swift index 7a501e4..564f454 100644 --- a/SnapSliderFilters/Classes/SNTextField.swift +++ b/SnapSliderFilters/Classes/SNTextField.swift @@ -26,12 +26,12 @@ open class SNTextField: UITextField { self.textColor = UIColor.white self.placeholder = "" self.font = UIFont.systemFont(ofSize: 16) - self.borderStyle = UITextBorderStyle.none + self.borderStyle = UITextField.BorderStyle.none self.autocorrectionType = UITextAutocorrectionType.no self.keyboardType = UIKeyboardType.default self.returnKeyType = UIReturnKeyType.done - self.clearButtonMode = UITextFieldViewMode.never; - self.contentVerticalAlignment = UIControlContentVerticalAlignment.center + self.clearButtonMode = UITextField.ViewMode.never; + self.contentVerticalAlignment = UIControl.ContentVerticalAlignment.center self.textAlignment = .center self.contentHorizontalAlignment = .center self.delegate = self @@ -88,7 +88,7 @@ extension SNTextField: UITextFieldDelegate { // Limit the text size to the screen width public func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { let text:NSString = (self.text! as NSString).replacingCharacters(in: range, with: string) as NSString - let contentWidth = text.size(attributes: [NSFontAttributeName: UIFont.systemFont(ofSize: 16.0)]).width + let contentWidth = text.size(withAttributes: [NSAttributedString.Key.font: UIFont.systemFont(ofSize: 16.0)]).width return contentWidth <= (self.frame.width - 20) } @@ -113,7 +113,7 @@ extension SNTextField: UIGestureRecognizerDelegate { } } - func handlePan(_ recognizer:UIPanGestureRecognizer) { + @objc func handlePan(_ recognizer:UIPanGestureRecognizer) { if self.isFirstResponder == true { return } @@ -152,7 +152,7 @@ public extension SNTextField { } func updatePosition(_ notification: Notification) { - if let keyboardSize = ((notification as NSNotification).userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { + if let keyboardSize = ((notification as NSNotification).userInfo?[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue { self.frame.origin.y = self.heightOfScreen - keyboardSize.height - self.frame.size.height } } diff --git a/SnapSliderFilters/Classes/SNUtils.swift b/SnapSliderFilters/Classes/SNUtils.swift index a3a46a6..d5179bf 100644 --- a/SnapSliderFilters/Classes/SNUtils.swift +++ b/SnapSliderFilters/Classes/SNUtils.swift @@ -10,10 +10,10 @@ import UIKit open class SNUtils { - open static let screenSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) + public static let screenSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height) // Allow you to take a screenshot of the screen - open static func screenShot(_ view: UIView?) -> UIImage? { + public static func screenShot(_ view: UIView?) -> UIImage? { guard let imageView = view else { return nil } From 1bc431e3595118232d6bc0094ec4c809e88d5a01 Mon Sep 17 00:00:00 2001 From: Josh Guffey Date: Sun, 25 Aug 2019 20:55:11 -0700 Subject: [PATCH 3/3] change target to swift5, ios12.4 --- Example/SnapSliderFilters.xcodeproj/project.pbxproj | 11 +++++++---- .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ .../xcshareddata/IDEWorkspaceChecks.plist | 8 ++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 Example/SnapSliderFilters.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist create mode 100644 Example/SnapSliderFilters.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/SnapSliderFilters.xcodeproj/project.pbxproj b/Example/SnapSliderFilters.xcodeproj/project.pbxproj index 8718af7..3f027b2 100644 --- a/Example/SnapSliderFilters.xcodeproj/project.pbxproj +++ b/Example/SnapSliderFilters.xcodeproj/project.pbxproj @@ -180,6 +180,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -329,11 +330,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -367,9 +369,10 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.3; + IPHONEOS_DEPLOYMENT_TARGET = 12.4; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_VERSION = 5.0; VALIDATE_PRODUCT = YES; }; name = Release; @@ -388,7 +391,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -406,7 +409,7 @@ PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; PROVISIONING_PROFILE = ""; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Example/SnapSliderFilters.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/SnapSliderFilters.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/SnapSliderFilters.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/SnapSliderFilters.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/SnapSliderFilters.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/SnapSliderFilters.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + +