From d5fe200b4f39253f6ed9d7ab9546973c9103f361 Mon Sep 17 00:00:00 2001 From: Andreas Ganske Date: Fri, 6 Oct 2017 18:22:40 +0200 Subject: [PATCH 1/3] Migrate to Swift 4.0 --- .swift-version | 2 +- .../project.pbxproj | 31 +++++++++++++++++-- .../xcschemes/PagingMenuController.xcscheme | 15 ++++++--- PagingMenuController/Info.plist | 2 +- Pod/Classes/MenuItemView.swift | 2 +- Pod/Classes/PagingMenuController.swift | 4 +-- 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/.swift-version b/.swift-version index 9f55b2cc..5186d070 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -3.0 +4.0 diff --git a/PagingMenuController.xcodeproj/project.pbxproj b/PagingMenuController.xcodeproj/project.pbxproj index 24d3a90e..a28e7162 100644 --- a/PagingMenuController.xcodeproj/project.pbxproj +++ b/PagingMenuController.xcodeproj/project.pbxproj @@ -132,11 +132,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0640; + LastUpgradeCheck = 0900; ORGANIZATIONNAME = kitasuke; TargetAttributes = { ECE530661B6DEB18001CF201 = { CreatedOnToolsVersion = 6.4; + LastSwiftMigration = 0900; }; }; }; @@ -194,13 +195,21 @@ 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_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_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; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -208,6 +217,7 @@ CURRENT_PROJECT_VERSION = 1; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; @@ -243,13 +253,21 @@ 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_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_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; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -269,6 +287,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; @@ -281,6 +300,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -289,10 +309,12 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.yusuke.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -300,6 +322,7 @@ isa = XCBuildConfiguration; buildSettings = { CLANG_ENABLE_MODULES = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; DEFINES_MODULE = YES; DYLIB_COMPATIBILITY_VERSION = 1; DYLIB_CURRENT_VERSION = 1; @@ -308,9 +331,11 @@ INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.yusuke.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme b/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme index 4a4595cd..cfe746cf 100644 --- a/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme +++ b/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme @@ -1,6 +1,6 @@ + language = "" + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -62,15 +63,19 @@ ReferencedContainer = "container:PagingMenuController.xcodeproj"> + + CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.yusuke.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/Pod/Classes/MenuItemView.swift b/Pod/Classes/MenuItemView.swift index 44e92278..89e6ac3d 100644 --- a/Pod/Classes/MenuItemView.swift +++ b/Pod/Classes/MenuItemView.swift @@ -303,7 +303,7 @@ extension MenuItemView { fileprivate func estimatedLabelSize(_ label: UILabel) -> CGSize { guard let text = label.text else { return .zero } - return NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName: label.font], context: nil).size + return NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: label.font], context: nil).size } fileprivate func calculateLabelSize(_ label: UILabel, maxWidth: CGFloat) -> CGSize { diff --git a/Pod/Classes/PagingMenuController.swift b/Pod/Classes/PagingMenuController.swift index e8344a5f..cbe9b51d 100644 --- a/Pod/Classes/PagingMenuController.swift +++ b/Pod/Classes/PagingMenuController.swift @@ -478,7 +478,7 @@ extension PagingMenuController { menuView?.addGestureRecognizer(rightSwipeGestureRecognizer) } - internal func handleTapGesture(_ recognizer: UITapGestureRecognizer) { + @objc internal func handleTapGesture(_ recognizer: UITapGestureRecognizer) { guard let menuItemView = recognizer.view as? MenuItemView, let menuView = menuView, let page = menuView.menuItemViews.index(of: menuItemView), @@ -503,7 +503,7 @@ extension PagingMenuController { move(toPage: newPage) } - internal func handleSwipeGesture(_ recognizer: UISwipeGestureRecognizer) { + @objc internal func handleSwipeGesture(_ recognizer: UISwipeGestureRecognizer) { guard let menuView = recognizer.view as? MenuView, let menuOptions = menuOptions else { return } From ee28d528ea66b3a83c467956b24fc6ce56e146c8 Mon Sep 17 00:00:00 2001 From: Fabio Tacke Date: Tue, 12 Dec 2017 19:43:01 +0100 Subject: [PATCH 2/3] Add VoiceOver support to MenuView --- Pod/Classes/MenuView.swift | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Pod/Classes/MenuView.swift b/Pod/Classes/MenuView.swift index 6eba4054..be7708cd 100644 --- a/Pod/Classes/MenuView.swift +++ b/Pod/Classes/MenuView.swift @@ -81,6 +81,10 @@ open class MenuView: UIScrollView { internal init(menuOptions: MenuViewCustomizable) { super.init(frame: CGRect(x: 0, y: 0, width: 0, height: menuOptions.height)) + if #available(iOS 10.0, *) { + self.accessibilityTraits = UIAccessibilityTraitTabBar + } + self.menuOptions = menuOptions commonInit({ self.constructMenuItemViews(menuOptions) }) @@ -121,9 +125,12 @@ open class MenuView: UIScrollView { if let previousMenuItemView = previousMenuItemView, page != previousPage { + previousMenuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraitStaticText onMove?(.willMoveItem(to: menuItemView, from: previousMenuItemView)) } + menuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraitSelected + update(currentPage: page) let duration = animated ? menuOptions.animationDuration : 0 From e190738e99ab631387ece48affca4d5f2627e09e Mon Sep 17 00:00:00 2001 From: Andreas Ganske Date: Sun, 18 Nov 2018 13:29:51 +0100 Subject: [PATCH 3/3] Update to Swift 4.2 --- PagingMenuController.xcodeproj/project.pbxproj | 16 ++++++++-------- .../xcschemes/PagingMenuController.xcscheme | 4 +--- Pod/Classes/MenuItemView.swift | 2 +- Pod/Classes/MenuView.swift | 8 ++++---- Pod/Classes/PagingMenuController.swift | 16 ++++++++-------- Pod/Classes/PagingViewController.swift | 16 ++++++++-------- Pod/Classes/Protocols/MenuViewCustomizable.swift | 2 +- 7 files changed, 31 insertions(+), 33 deletions(-) diff --git a/PagingMenuController.xcodeproj/project.pbxproj b/PagingMenuController.xcodeproj/project.pbxproj index a28e7162..2c350513 100644 --- a/PagingMenuController.xcodeproj/project.pbxproj +++ b/PagingMenuController.xcodeproj/project.pbxproj @@ -132,12 +132,12 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0900; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = kitasuke; TargetAttributes = { ECE530661B6DEB18001CF201 = { CreatedOnToolsVersion = 6.4; - LastSwiftMigration = 0900; + LastSwiftMigration = 1010; }; }; }; @@ -199,12 +199,14 @@ 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; @@ -238,7 +240,7 @@ ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -257,12 +259,14 @@ 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; @@ -288,7 +292,7 @@ MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_VERSION = 3.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; @@ -313,8 +317,6 @@ PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -334,8 +336,6 @@ PRODUCT_BUNDLE_IDENTIFIER = "com.yusuke.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; SKIP_INSTALL = YES; - SWIFT_SWIFT3_OBJC_INFERENCE = On; - SWIFT_VERSION = 4.0; }; name = Release; }; diff --git a/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme b/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme index cfe746cf..2a5e1bed 100644 --- a/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme +++ b/PagingMenuController.xcodeproj/xcshareddata/xcschemes/PagingMenuController.xcscheme @@ -1,6 +1,6 @@ CGSize { guard let text = label.text else { return .zero } - return NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedStringKey.font: label.font], context: nil).size + return NSString(string: text).boundingRect(with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: CGFloat.greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: label.font], context: nil).size } fileprivate func calculateLabelSize(_ label: UILabel, maxWidth: CGFloat) -> CGSize { diff --git a/Pod/Classes/MenuView.swift b/Pod/Classes/MenuView.swift index be7708cd..e03b7ced 100644 --- a/Pod/Classes/MenuView.swift +++ b/Pod/Classes/MenuView.swift @@ -82,7 +82,7 @@ open class MenuView: UIScrollView { super.init(frame: CGRect(x: 0, y: 0, width: 0, height: menuOptions.height)) if #available(iOS 10.0, *) { - self.accessibilityTraits = UIAccessibilityTraitTabBar + self.accessibilityTraits = UIAccessibilityTraits.tabBar } self.menuOptions = menuOptions @@ -125,11 +125,11 @@ open class MenuView: UIScrollView { if let previousMenuItemView = previousMenuItemView, page != previousPage { - previousMenuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraitStaticText + previousMenuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraits.staticText onMove?(.willMoveItem(to: menuItemView, from: previousMenuItemView)) } - menuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraitSelected + menuItemView.titleLabel.accessibilityTraits = UIAccessibilityTraits.selected update(currentPage: page) @@ -184,7 +184,7 @@ open class MenuView: UIScrollView { bounces = menuViewBounces isScrollEnabled = menuViewScrollEnabled isDirectionalLockEnabled = true - decelerationRate = menuOptions.deceleratingRate + decelerationRate = UIScrollView.DecelerationRate(rawValue: menuOptions.deceleratingRate) scrollsToTop = false translatesAutoresizingMaskIntoConstraints = false } diff --git a/Pod/Classes/PagingMenuController.swift b/Pod/Classes/PagingMenuController.swift index cbe9b51d..7d98e322 100644 --- a/Pod/Classes/PagingMenuController.swift +++ b/Pod/Classes/PagingMenuController.swift @@ -40,8 +40,8 @@ open class PagingMenuController: UIViewController { pagingViewController.contentScrollView.delegate = self view.addSubview(pagingViewController.view) - addChildViewController(pagingViewController) - pagingViewController.didMove(toParentViewController: self) + addChild(pagingViewController) + pagingViewController.didMove(toParent: self) } } public var onMove: ((MenuMoveState) -> Void)? { @@ -509,13 +509,13 @@ extension PagingMenuController { let newPage: Int switch (recognizer.direction, menuOptions.displayMode) { - case (UISwipeGestureRecognizerDirection.left, .infinite): + case (UISwipeGestureRecognizer.Direction.left, .infinite): newPage = menuView.nextPage - case (UISwipeGestureRecognizerDirection.left, _): + case (UISwipeGestureRecognizer.Direction.left, _): newPage = min(nextPage, menuOptions.itemsOptions.count - 1) - case (UISwipeGestureRecognizerDirection.right, .infinite): + case (UISwipeGestureRecognizer.Direction.right, .infinite): newPage = menuView.previousPage - case (UISwipeGestureRecognizerDirection.right, _): + case (UISwipeGestureRecognizer.Direction.right, _): newPage = max(previousPage, 0) default: return } @@ -533,8 +533,8 @@ extension PagingMenuController { if let pagingViewController = self.pagingViewController { pagingViewController.cleanup() pagingViewController.view.removeFromSuperview() - pagingViewController.removeFromParentViewController() - pagingViewController.willMove(toParentViewController: nil) + pagingViewController.removeFromParent() + pagingViewController.willMove(toParent: nil) } } } diff --git a/Pod/Classes/PagingViewController.swift b/Pod/Classes/PagingViewController.swift index c82a8c3d..3d2a27ba 100644 --- a/Pod/Classes/PagingViewController.swift +++ b/Pod/Classes/PagingViewController.swift @@ -95,9 +95,9 @@ open class PagingViewController: UIViewController { if !shouldLoad(page: index) { // remove unnecessary child view controllers if isVisible(controller: controller) { - controller.willMove(toParentViewController: nil) + controller.willMove(toParent: nil) controller.view!.removeFromSuperview() - controller.removeFromParentViewController() + controller.removeFromParent() let _ = visibleControllers.index(of: controller).flatMap { visibleControllers.remove(at: $0) } } @@ -118,8 +118,8 @@ open class PagingViewController: UIViewController { pagingView.translatesAutoresizingMaskIntoConstraints = false contentScrollView.addSubview(pagingView) - addChildViewController(controller as UIViewController) - controller.didMove(toParentViewController: self) + addChild(controller as UIViewController) + controller.didMove(toParent: self) visibleControllers.append(controller) } @@ -242,10 +242,10 @@ extension PagingViewController { visibleControllers.removeAll(keepingCapacity: true) currentViewController = nil - childViewControllers.forEach { - $0.willMove(toParentViewController: nil) + children.forEach { + $0.willMove(toParent: nil) $0.view.removeFromSuperview() - $0.removeFromParentViewController() + $0.removeFromParent() } contentScrollView.removeFromSuperview() @@ -276,7 +276,7 @@ extension PagingViewController { } fileprivate func isVisible(controller: UIViewController) -> Bool { - return self.childViewControllers.contains(controller) + return self.children.contains(controller) } fileprivate func hideVisibleControllers() { diff --git a/Pod/Classes/Protocols/MenuViewCustomizable.swift b/Pod/Classes/Protocols/MenuViewCustomizable.swift index 376006b0..76b040fa 100644 --- a/Pod/Classes/Protocols/MenuViewCustomizable.swift +++ b/Pod/Classes/Protocols/MenuViewCustomizable.swift @@ -37,7 +37,7 @@ public extension MenuViewCustomizable { return 0.3 } var deceleratingRate: CGFloat { - return UIScrollViewDecelerationRateFast + return UIScrollView.DecelerationRate.fast.rawValue } var selectedItemCenter: Bool { return true