From 73d53b602990a3b9b28974a435a94e61601f7ece Mon Sep 17 00:00:00 2001 From: guruguruman Date: Sun, 24 Feb 2019 16:03:26 +0900 Subject: [PATCH] Adopted to Swift 4.2 with deployment target iOS 10.0 --- .../project.pbxproj | 29 +++++++++- ScrollTabPageViewController/AppDelegate.swift | 3 +- .../Classes/ContentsView.swift | 39 +++++++------ .../Classes/ContentsView.xib | 37 ++++++------ .../Classes/ScrollTabPageViewController.swift | 57 +++++++++---------- .../Classes/ViewController.swift | 16 ++++-- 6 files changed, 105 insertions(+), 76 deletions(-) diff --git a/ScrollTabPageViewController.xcodeproj/project.pbxproj b/ScrollTabPageViewController.xcodeproj/project.pbxproj index af4e8f2..372e3a8 100644 --- a/ScrollTabPageViewController.xcodeproj/project.pbxproj +++ b/ScrollTabPageViewController.xcodeproj/project.pbxproj @@ -119,7 +119,7 @@ isa = PBXProject; attributes = { LastSwiftUpdateCheck = 0710; - LastUpgradeCheck = 0710; + LastUpgradeCheck = 1010; ORGANIZATIONNAME = EndouMari; TargetAttributes = { 4C8C50C81C11B617008A69C9 = { @@ -194,13 +194,23 @@ 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; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -222,11 +232,12 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 4.2; }; name = Debug; }; @@ -238,13 +249,23 @@ 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; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; @@ -260,9 +281,11 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 9.1; + IPHONEOS_DEPLOYMENT_TARGET = 10.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_VERSION = 4.2; VALIDATE_PRODUCT = YES; }; name = Release; diff --git a/ScrollTabPageViewController/AppDelegate.swift b/ScrollTabPageViewController/AppDelegate.swift index 39b3b44..1395122 100644 --- a/ScrollTabPageViewController/AppDelegate.swift +++ b/ScrollTabPageViewController/AppDelegate.swift @@ -13,9 +13,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? - func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { + private func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. return true } + } diff --git a/ScrollTabPageViewController/Classes/ContentsView.swift b/ScrollTabPageViewController/Classes/ContentsView.swift index 23f9ecd..d6d0d83 100644 --- a/ScrollTabPageViewController/Classes/ContentsView.swift +++ b/ScrollTabPageViewController/Classes/ContentsView.swift @@ -11,8 +11,8 @@ import UIKit class ContentsView: UIView { var currentIndex: Int = 0 - var tabButtonPressedBlock: ((index: Int) -> Void)? - var scrollDidChangedBlock: ((scroll: CGFloat, shouldScroll: Bool) -> Void)? + var tabButtonPressedBlock: ((_ index: Int) -> Void)? + var scrollDidChangedBlock: ((_ scroll: CGFloat, _ shouldScroll: Bool) -> Void)? private var scrollStart: CGFloat = 0.0 @@ -34,7 +34,7 @@ class ContentsView: UIView { } private func sharedInit() { - NSBundle.mainBundle().loadNibNamed("ContentsView", owner: self, options: nil) + Bundle.main.loadNibNamed("ContentsView", owner: self, options: nil) addSubview(contentView) setupConstraints() @@ -42,6 +42,7 @@ class ContentsView: UIView { scrollView.delegate = self scrollView.scrollsToTop = false } + } @@ -50,13 +51,13 @@ class ContentsView: UIView { extension ContentsView { private func setupConstraints() { - let topConstraint = NSLayoutConstraint(item: contentView, attribute: .Top, relatedBy: .Equal, toItem: self, attribute: .Top, multiplier: 1.0, constant: 0.0) + let topConstraint = NSLayoutConstraint(item: contentView, attribute: .top, relatedBy: .equal, toItem: self, attribute: .top, multiplier: 1.0, constant: 0.0) - let bottomConstraint = NSLayoutConstraint(item: contentView, attribute: .Bottom, relatedBy: .Equal, toItem: self, attribute: .Bottom, multiplier: 1.0, constant: 0.0) + let bottomConstraint = NSLayoutConstraint(item: contentView, attribute: .bottom, relatedBy: .equal, toItem: self, attribute: .bottom, multiplier: 1.0, constant: 0.0) - let leftConstraint = NSLayoutConstraint(item: contentView, attribute: .Left, relatedBy: .Equal, toItem: self, attribute: .Left, multiplier: 1.0, constant: 0.0) + let leftConstraint = NSLayoutConstraint(item: contentView, attribute: .left, relatedBy: .equal, toItem: self, attribute: .left, multiplier: 1.0, constant: 0.0) - let rightConstraint = NSLayoutConstraint(item: contentView, attribute: .Right, relatedBy: .Equal, toItem: self, attribute: .Right, multiplier: 1.0, constant: 0.0) + let rightConstraint = NSLayoutConstraint(item: contentView, attribute: .right, relatedBy: .equal, toItem: self, attribute: .right, multiplier: 1.0, constant: 0.0) let constraints = [topConstraint, bottomConstraint, leftConstraint, rightConstraint] @@ -65,17 +66,19 @@ extension ContentsView { } private func randomColor() -> UIColor { - let red = Float(arc4random_uniform(255)) / 255.0 - let green = Float(arc4random_uniform(255)) / 255.0 - let blue = Float(arc4random_uniform(255)) / 255.0 - return UIColor(colorLiteralRed: red, green: green, blue: blue, alpha: 1.0) + let red = CGFloat(arc4random_uniform(255)) / 255.0 + let green = CGFloat(arc4random_uniform(255)) / 255.0 + let blue = CGFloat(arc4random_uniform(255)) / 255.0 + + return UIColor(displayP3Red: red, green: green, blue: blue, alpha: 1.0) } func updateCurrentIndex(index: Int, animated: Bool) { - tabButtons[currentIndex].backgroundColor = UIColor.whiteColor() + tabButtons[currentIndex].backgroundColor = UIColor.white tabButtons[index].backgroundColor = UIColor(red: 0.88, green: 1.0, blue: 0.87, alpha: 1.0) currentIndex = index } + } @@ -83,16 +86,17 @@ extension ContentsView { extension ContentsView: UIScrollViewDelegate { - func scrollViewDidScroll(scrollView: UIScrollView) { + func scrollViewDidScroll(_ scrollView: UIScrollView) { if scrollView.contentOffset.y > 0.0 || frame.minY < 0.0 { - scrollDidChangedBlock?(scroll: scrollView.contentOffset.y, shouldScroll: true) + scrollDidChangedBlock?(scrollView.contentOffset.y, true) scrollView.contentOffset.y = 0.0 } else { let scroll = scrollView.contentOffset.y - scrollStart - scrollDidChangedBlock?(scroll: scroll, shouldScroll: false) + scrollDidChangedBlock?(scroll, false) scrollStart = scrollView.contentOffset.y } } + } @@ -105,7 +109,8 @@ extension ContentsView { } @IBAction private func tabButtonTouchUpInside(button: UIButton) { - tabButtonPressedBlock?(index: button.tag) - updateCurrentIndex(button.tag, animated: true) + tabButtonPressedBlock?(button.tag) + updateCurrentIndex(index: button.tag, animated: true) } + } diff --git a/ScrollTabPageViewController/Classes/ContentsView.xib b/ScrollTabPageViewController/Classes/ContentsView.xib index 928a32a..d430b21 100644 --- a/ScrollTabPageViewController/Classes/ContentsView.xib +++ b/ScrollTabPageViewController/Classes/ContentsView.xib @@ -1,8 +1,12 @@ - - + + + + + - + + @@ -27,15 +31,13 @@ - - + @@ -48,32 +50,29 @@ - - + @@ -87,8 +86,7 @@ - - + @@ -101,7 +99,6 @@ - @@ -112,7 +109,7 @@ - + diff --git a/ScrollTabPageViewController/Classes/ScrollTabPageViewController.swift b/ScrollTabPageViewController/Classes/ScrollTabPageViewController.swift index b72d846..8b123e3 100644 --- a/ScrollTabPageViewController/Classes/ScrollTabPageViewController.swift +++ b/ScrollTabPageViewController/Classes/ScrollTabPageViewController.swift @@ -17,14 +17,14 @@ class ScrollTabPageViewController: UIPageViewController { private let contentViewHeihgt: CGFloat = 280.0 private let tabViewHeight: CGFloat = 44.0 - private var pageViewControllers: [UIViewController] = [] + private var pageViewControllers = [UIViewController]() private var contentsView: ContentsView! private var scrollContentOffsetY: CGFloat = 0.0 private var shouldScrollFrame: Bool = true private var shouldUpdateLayout: Bool = false private var updateIndex: Int = 0 private var currentIndex: Int? { - guard let viewController = viewControllers?.first, index = pageViewControllers.indexOf(viewController) else { + guard let viewController = viewControllers?.first, let index = pageViewControllers.index(of: viewController) else { return nil } return index @@ -50,10 +50,10 @@ extension ScrollTabPageViewController { private func setupViewControllers() { let sb1 = UIStoryboard(name: "ViewController", bundle: nil) - let vc1 = sb1.instantiateViewControllerWithIdentifier("ViewController") + let vc1 = sb1.instantiateViewController(withIdentifier: "ViewController") let sb2 = UIStoryboard(name: "ViewController", bundle: nil) - let vc2 = sb2.instantiateViewControllerWithIdentifier("ViewController") + let vc2 = sb2.instantiateViewController(withIdentifier: "ViewController") pageViewControllers = [vc1, vc2] } @@ -63,7 +63,7 @@ extension ScrollTabPageViewController { delegate = self setViewControllers([pageViewControllers[0]], - direction: .Forward, + direction: .forward, animated: false, completion: { [weak self] (completed: Bool) in self?.setupContentInset() @@ -71,7 +71,7 @@ extension ScrollTabPageViewController { } private func setupContentsView() { - contentsView = ContentsView(frame: CGRectMake(0.0, 0.0, view.frame.width, contentViewHeihgt)) + contentsView = ContentsView(frame: CGRect(x: 0.0, y: 0.0, width: view.frame.width, height: contentViewHeihgt)) contentsView.tabButtonPressedBlock = { [weak self] (index: Int) in guard let uself = self else { return @@ -79,7 +79,7 @@ extension ScrollTabPageViewController { uself.shouldUpdateLayout = true uself.updateIndex = index - let direction: UIPageViewControllerNavigationDirection = (uself.currentIndex < index) ? .Forward : .Reverse + let direction: UIPageViewController.NavigationDirection = (uself.currentIndex ?? 0 < index) ? .forward : .reverse uself.setViewControllers([uself.pageViewControllers[index]], direction: direction, animated: true, @@ -88,7 +88,7 @@ extension ScrollTabPageViewController { return } if uself.shouldUpdateLayout { - uself.setupContentOffsetY(index, scroll: -uself.scrollContentOffsetY) + uself.setupContentOffsetY(index: index, scroll: -uself.scrollContentOffsetY) uself.shouldUpdateLayout = false } }) @@ -96,7 +96,7 @@ extension ScrollTabPageViewController { contentsView.scrollDidChangedBlock = { [weak self] (scroll: CGFloat, shouldScrollFrame: Bool) in self?.shouldScrollFrame = shouldScrollFrame - self?.updateContentOffsetY(scroll) + self?.updateContentOffsetY(scroll: scroll) } view.addSubview(contentsView) } @@ -108,11 +108,11 @@ extension ScrollTabPageViewController { extension ScrollTabPageViewController { private func setupContentInset() { - guard let currentIndex = currentIndex, vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol else { + guard let currentIndex = currentIndex, let vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol else { return } - let inset = UIEdgeInsetsMake(contentViewHeihgt, 0.0, 0.0, 0.0) + let inset = UIEdgeInsets(top: contentViewHeihgt, left: 0.0, bottom: 0.0, right: 0.0) vc.scrollView.contentInset = inset vc.scrollView.scrollIndicatorInsets = inset } @@ -138,23 +138,23 @@ extension ScrollTabPageViewController { } private func updateContentOffsetY(scroll: CGFloat) { - if let currentIndex = currentIndex, vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol { + if let currentIndex = currentIndex, let vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol { vc.scrollView.contentOffset.y += scroll } } func updateContentViewFrame() { - guard let currentIndex = currentIndex, vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol else { + guard let currentIndex = currentIndex, let vc = pageViewControllers[currentIndex] as? ScrollTabPageViewControllerProtocol else { return } if vc.scrollView.contentOffset.y >= -tabViewHeight { let scroll = contentViewHeihgt - tabViewHeight - updateContentView(-scroll) + updateContentView(scroll: -scroll) vc.scrollView.scrollIndicatorInsets.top = tabViewHeight } else { let scroll = contentViewHeihgt + vc.scrollView.contentOffset.y - updateContentView(-scroll) + updateContentView(scroll: -scroll) vc.scrollView.scrollIndicatorInsets.top = -vc.scrollView.contentOffset.y } } @@ -166,7 +166,7 @@ extension ScrollTabPageViewController { let scroll = scrollContentOffsetY setupContentInset() - setupContentOffsetY(updateIndex, scroll: -scroll) + setupContentOffsetY(index: updateIndex, scroll: -scroll) shouldUpdateLayout = shouldSetupContentOffsetY } } @@ -177,13 +177,12 @@ extension ScrollTabPageViewController { extension ScrollTabPageViewController: UIPageViewControllerDataSource { - func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { - - guard var index = pageViewControllers.indexOf(viewController) else { + func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { + guard var index = pageViewControllers.index(of: viewController) else { return nil } - index++ + index = index + 1 if index >= 0 && index < pageViewControllers.count { return pageViewControllers[index] @@ -191,13 +190,13 @@ extension ScrollTabPageViewController: UIPageViewControllerDataSource { return nil } - func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { + func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { - guard var index = pageViewControllers.indexOf(viewController) else { + guard var index = pageViewControllers.index(of: viewController) else { return nil } - index-- + index = index - 1 if index >= 0 && index < pageViewControllers.count { return pageViewControllers[index] @@ -211,26 +210,26 @@ extension ScrollTabPageViewController: UIPageViewControllerDataSource { extension ScrollTabPageViewController: UIPageViewControllerDelegate { - func pageViewController(pageViewController: UIPageViewController, willTransitionToViewControllers pendingViewControllers: [UIViewController]) { - if let vc = pendingViewControllers.first, index = pageViewControllers.indexOf(vc) { + func pageViewController(_ pageViewController: UIPageViewController, willTransitionTo pendingViewControllers: [UIViewController]) { + if let vc = pendingViewControllers.first, let index = pageViewControllers.index(of: vc) { shouldUpdateLayout = true updateIndex = index } } - func pageViewController(pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { - guard let _ = previousViewControllers.first, currentIndex = currentIndex else { + func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) { + guard let _ = previousViewControllers.first, let currentIndex = currentIndex else { return } if shouldUpdateLayout { setupContentInset() - setupContentOffsetY(currentIndex, scroll: -scrollContentOffsetY) + setupContentOffsetY(index: currentIndex, scroll: -scrollContentOffsetY) } if currentIndex >= 0 && currentIndex < contentsView.tabButtons.count { - contentsView.updateCurrentIndex(currentIndex, animated: false) + contentsView.updateCurrentIndex(index: currentIndex, animated: false) } } } diff --git a/ScrollTabPageViewController/Classes/ViewController.swift b/ScrollTabPageViewController/Classes/ViewController.swift index 082a3c8..83ed8c2 100644 --- a/ScrollTabPageViewController/Classes/ViewController.swift +++ b/ScrollTabPageViewController/Classes/ViewController.swift @@ -20,11 +20,12 @@ class ViewController: UIViewController { } - override func viewWillAppear(animated: Bool) { + override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) scrollTabPageViewController.updateLayoutIfNeeded() } + } @@ -32,15 +33,16 @@ class ViewController: UIViewController { extension ViewController: UITableViewDataSource { - func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 100 } - func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { - let cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "Cell") + func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = UITableViewCell(style: .subtitle, reuseIdentifier: "Cell") cell.textLabel?.text = String(indexPath.row) return cell } + } @@ -48,9 +50,10 @@ extension ViewController: UITableViewDataSource { extension ViewController: UITableViewDelegate { - func scrollViewDidScroll(scrollView: UIScrollView) { + func scrollViewDidScroll(_ scrollView: UIScrollView) { scrollTabPageViewController.updateContentViewFrame() } + } @@ -59,10 +62,11 @@ extension ViewController: UITableViewDelegate { extension ViewController: ScrollTabPageViewControllerProtocol { var scrollTabPageViewController: ScrollTabPageViewController { - return parentViewController as! ScrollTabPageViewController + return parent as! ScrollTabPageViewController } var scrollView: UIScrollView { return tableView } + }