From d8781514a007cbbb1b2c31fc22a304a101a6deb1 Mon Sep 17 00:00:00 2001 From: Eimantas Date: Mon, 6 May 2019 13:08:20 +0300 Subject: [PATCH 1/2] Update project to Swift 5 --- .../project.pbxproj | 30 +++++++++++++++---- .../xcshareddata/IDEWorkspaceChecks.plist | 8 +++++ .../xcschemes/SlideOutable.xcscheme | 2 +- Source/SlideOutable.swift | 13 ++++---- 4 files changed, 41 insertions(+), 12 deletions(-) create mode 100644 Example/SlideOutableExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/Example/SlideOutableExample.xcodeproj/project.pbxproj b/Example/SlideOutableExample.xcodeproj/project.pbxproj index 8316aa1..5d220e3 100644 --- a/Example/SlideOutableExample.xcodeproj/project.pbxproj +++ b/Example/SlideOutableExample.xcodeproj/project.pbxproj @@ -167,7 +167,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0730; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 1020; ORGANIZATIONNAME = Domas; TargetAttributes = { D307A2C31DABD2640072E3FB = { @@ -182,7 +182,7 @@ }; buildConfigurationList = ED00FF8A1CEDCD0500A5BEC9 /* Build configuration list for PBXProject "SlideOutableExample" */; compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; + developmentRegion = en; hasScannedForEncodings = 0; knownRegions = ( en, @@ -281,7 +281,7 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -305,7 +305,7 @@ PRODUCT_BUNDLE_IDENTIFIER = Trafi.SlideOutable; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; @@ -315,19 +315,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -363,19 +372,28 @@ isa = XCBuildConfiguration; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; CLANG_WARN_EMPTY_BODY = YES; CLANG_WARN_ENUM_CONVERSION = YES; CLANG_WARN_INFINITE_RECURSION = YES; CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; @@ -409,7 +427,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = lt.domas.SlideOutable; PRODUCT_NAME = SlideOutableExample; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Debug; }; @@ -421,7 +439,7 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = lt.domas.SlideOutable; PRODUCT_NAME = SlideOutableExample; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 5.0; }; name = Release; }; diff --git a/Example/SlideOutableExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/Example/SlideOutableExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 0000000..18d9810 --- /dev/null +++ b/Example/SlideOutableExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/Example/SlideOutableExample.xcodeproj/xcshareddata/xcschemes/SlideOutable.xcscheme b/Example/SlideOutableExample.xcodeproj/xcshareddata/xcschemes/SlideOutable.xcscheme index e58f2fd..63a84e1 100644 --- a/Example/SlideOutableExample.xcodeproj/xcshareddata/xcschemes/SlideOutable.xcscheme +++ b/Example/SlideOutableExample.xcodeproj/xcshareddata/xcschemes/SlideOutable.xcscheme @@ -1,6 +1,6 @@ minOffset else { return offsets } + guard offset > minOffset else { return offsets } return offsets + [offset] } } @@ -307,7 +307,7 @@ open class SlideOutable: ClearContainerView { switch offset.equatable { case minOffset.equatable: return .settled(.expanded) - case anchorOffset?.equatable ?? minOffset.equatable: // Makes compiler happy, dev sad :( + case anchorOffset.equatable: return .settled(.anchored) case maxOffset.equatable: return .settled(.collapsed) @@ -485,6 +485,8 @@ extension UIScrollView { } extension SlideOutable { + + @objc func didPanScroll(_ pan: UIPanGestureRecognizer) { guard subscrolls.count == 0 || scroll !== pan.view else { return } @@ -518,7 +520,8 @@ extension SlideOutable { let offset = min(maxOffset, max(minOffset, targetOffset)) return (offset, offset - targetOffset) } - + + @objc public func didPanDrag(_ pan: UIPanGestureRecognizer) { let dragOffset = pan.translation(in: pan.view).y var diff = lastDragOffset - dragOffset From 5ce5de6f82284db03b54312a27a16dd8f17ae53c Mon Sep 17 00:00:00 2001 From: Eimantas Date: Mon, 6 May 2019 15:33:33 +0300 Subject: [PATCH 2/2] Sacrifice IBInspectable for optionality --- Source/SlideOutable.swift | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/SlideOutable.swift b/Source/SlideOutable.swift index 9069aa9..68bae75 100644 --- a/Source/SlideOutable.swift +++ b/Source/SlideOutable.swift @@ -128,7 +128,7 @@ open class SlideOutable: ClearContainerView { The default value is `0.4`. */ - @IBInspectable open var anchorFraction: CGFloat = 0.4 { + open var anchorFraction: CGFloat? = 0.4 { didSet { update() } } @@ -236,11 +236,11 @@ open class SlideOutable: ClearContainerView { } } var maxOffset: CGFloat { return max(minOffset, bounds.height - minContentHeight) } - var anchorOffset: CGFloat { return bounds.height * (1 - anchorFraction) } + var anchorOffset: CGFloat? { return anchorFraction.flatMap { bounds.height * (1 - $0) } } var snapOffsets: [CGFloat] { return [maxOffset, anchorOffset].reduce([minOffset]) { offsets, offset in - guard offset > minOffset else { return offsets } + guard let offset = offset, offset > minOffset else { return offsets } return offsets + [offset] } } @@ -307,7 +307,7 @@ open class SlideOutable: ClearContainerView { switch offset.equatable { case minOffset.equatable: return .settled(.expanded) - case anchorOffset.equatable: + case anchorOffset?.equatable ?? minOffset.equatable: // Makes compiler happy, dev sad :( return .settled(.anchored) case maxOffset.equatable: return .settled(.collapsed)