From 2e9fda3fca37832ee53feda9afa4a6174f26d156 Mon Sep 17 00:00:00 2001 From: vitkuzmenko Date: Thu, 7 Jun 2018 15:09:09 +0300 Subject: [PATCH 1/3] support multiple segmented view controllers --- .../Classes/SJContentView.swift | 5 +++- .../Classes/SJSegmentTab.swift | 10 +++++--- .../Classes/SJSegmentView.swift | 24 ++++++++++--------- .../Classes/SJSegmentedScrollView.swift | 5 +++- .../Classes/SJSegmentedViewController.swift | 11 ++++++--- 5 files changed, 36 insertions(+), 19 deletions(-) diff --git a/SJSegmentedScrollView/Classes/SJContentView.swift b/SJSegmentedScrollView/Classes/SJContentView.swift index f3238ce..e9cda64 100755 --- a/SJSegmentedScrollView/Classes/SJContentView.swift +++ b/SJSegmentedScrollView/Classes/SJContentView.swift @@ -24,6 +24,8 @@ import UIKit class SJContentView: UIScrollView { + weak var segmentedViewController: SJSegmentedViewController? + var pageIndex = 0 var contentViews = [UIView]() var contentView: UIView! @@ -147,6 +149,7 @@ extension SJContentView: UIScrollViewDelegate { pageIndex = Int(contentOffset.x / bounds.size.width) didSelectSegmentAtIndex?(nil, pageIndex, true) NotificationCenter.default.post(name: Notification.Name(rawValue: "DidChangeSegmentIndex"), - object: pageIndex) + object: segmentedViewController, + userInfo: ["index": pageIndex]) } } diff --git a/SJSegmentedScrollView/Classes/SJSegmentTab.swift b/SJSegmentedScrollView/Classes/SJSegmentTab.swift index c0acb0e..f47cf48 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentTab.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentTab.swift @@ -28,7 +28,9 @@ open class SJSegmentTab: UIView { let kSegmentViewTagOffset = 100 let button = UIButton(type: .custom) - + + weak var segmentedViewController: SJSegmentedViewController? + var didSelectSegmentAtIndex: DidSelectSegmentAtIndex? var isSelected = false { didSet { @@ -102,8 +104,10 @@ open class SJSegmentTab: UIView { @objc func onSegmentButtonPress(_ sender: AnyObject) { let index = tag - kSegmentViewTagOffset - NotificationCenter.default.post(name: Notification.Name(rawValue: "DidChangeSegmentIndex"), - object: index) + + NotificationCenter.default.post(name: Notification.Name(rawValue: "DidChangeSegmentIndex"), + object: segmentedViewController, + userInfo: ["index": index]) if didSelectSegmentAtIndex != nil { didSelectSegmentAtIndex!(self, index, true) diff --git a/SJSegmentedScrollView/Classes/SJSegmentView.swift b/SJSegmentedScrollView/Classes/SJSegmentView.swift index 4364191..1b58244 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentView.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentView.swift @@ -24,6 +24,8 @@ import UIKit class SJSegmentView: UIScrollView { + weak var segmentedViewController: SJSegmentedViewController? + var selectedSegmentViewColor: UIColor? { didSet { selectedSegmentView?.backgroundColor = selectedSegmentViewColor @@ -89,24 +91,23 @@ class SJSegmentView: UIScrollView { } } - required override init(frame: CGRect) { - super.init(frame: frame) - + convenience init(frame: CGRect, segmentedViewController: SJSegmentedViewController?) { + self.init(frame: frame) + + self.segmentedViewController = segmentedViewController + showsHorizontalScrollIndicator = false showsVerticalScrollIndicator = false bounces = false - + + print(segmentedViewController) NotificationCenter.default.addObserver(self, selector: #selector(SJSegmentView.didChangeSegmentIndex(_:)), name: NSNotification.Name("DidChangeSegmentIndex"), - object: nil) + object: segmentedViewController) } - required init?(coder aDecoder: NSCoder) { - fatalError("init(coder:) has not been implemented") - } - deinit { contentView!.removeObserver(self, forKeyPath: "contentOffset", @@ -114,7 +115,7 @@ class SJSegmentView: UIScrollView { NotificationCenter.default.removeObserver(self, name:NSNotification.Name("DidChangeSegmentIndex"), - object: nil) + object: segmentedViewController) } @objc func didChangeSegmentIndex(_ notification: Notification) { @@ -125,7 +126,7 @@ class SJSegmentView: UIScrollView { } // select current button - let index = notification.object as? Int + let index = notification.userInfo?["index"] as? Int if index! < segments.count { let button = segments[index!] @@ -281,6 +282,7 @@ class SJSegmentView: UIScrollView { } segmentTab?.didSelectSegmentAtIndex = didSelectSegmentAtIndex + segmentTab?.segmentedViewController = segmentedViewController return segmentTab! } diff --git a/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift b/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift index 49583a3..1dbb419 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift @@ -24,6 +24,8 @@ import UIKit class SJSegmentedScrollView: UIScrollView { + weak var segmentedViewController: SJSegmentedViewController? + var segmentView: SJSegmentView? var headerViewHeight: CGFloat! = 0 { @@ -259,7 +261,7 @@ class SJSegmentedScrollView: UIScrollView { if controllers.count > 1 { - segmentView = SJSegmentView(frame: CGRect.zero) + segmentView = SJSegmentView(frame: CGRect.zero, segmentedViewController: segmentedViewController) segmentView?.controllers = controllers segmentView?.selectedSegmentViewColor = selectedSegmentViewColor segmentView?.selectedSegmentViewHeight = selectedSegmentViewHeight! @@ -321,6 +323,7 @@ class SJSegmentedScrollView: UIScrollView { contentView.isScrollEnabled = !sjDisableScrollOnContentView contentView.translatesAutoresizingMaskIntoConstraints = false contentView.bounces = segmentBounces + contentView.segmentedViewController = segmentedViewController scrollContentView.addSubview(contentView) let horizontalConstraints = NSLayoutConstraint.constraints(withVisualFormat: "H:|-0-[contentView]-0-|", diff --git a/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift b/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift index 0f84a35..1d767ca 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift @@ -282,7 +282,12 @@ import UIKit } open weak var delegate:SJSegmentedViewControllerDelegate? - var segmentedScrollView = SJSegmentedScrollView(frame: CGRect.zero) + lazy var segmentedScrollView: SJSegmentedScrollView = { + let sv = SJSegmentedScrollView(frame: CGRect.zero) + sv.segmentedViewController = self + return sv + }() + var segmentScrollViewTopConstraint: NSLayoutConstraint? @@ -350,8 +355,8 @@ import UIKit segmentedScrollView.segmentView?.didSelectSegmentAtIndex!(segments[index], index, animated) - NotificationCenter.default.post(name: Notification.Name(rawValue: "DidChangeSegmentIndex"), - object: index) + NotificationCenter.default.post(name: Notification.Name(rawValue: "DidChangeSegmentIndex"), + object: self, userInfo: ["index": index]) } } From 85b2512936d3d7a19fcf7ada0bcc417ccfa506ae Mon Sep 17 00:00:00 2001 From: vitkuzmenko Date: Fri, 8 Jun 2018 12:42:59 +0300 Subject: [PATCH 2/3] print --- SJSegmentedScrollView/Classes/SJSegmentView.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/SJSegmentedScrollView/Classes/SJSegmentView.swift b/SJSegmentedScrollView/Classes/SJSegmentView.swift index 1b58244..690255d 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentView.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentView.swift @@ -100,8 +100,6 @@ class SJSegmentView: UIScrollView { showsVerticalScrollIndicator = false bounces = false - print(segmentedViewController) - NotificationCenter.default.addObserver(self, selector: #selector(SJSegmentView.didChangeSegmentIndex(_:)), name: NSNotification.Name("DidChangeSegmentIndex"), From f95df2b240231b4b105a78698c2003c43de5fb91 Mon Sep 17 00:00:00 2001 From: vitkuzmenko Date: Fri, 21 Sep 2018 09:41:42 +0300 Subject: [PATCH 3/3] swift 4.2 --- Example/Pods/Pods.xcodeproj/project.pbxproj | 8 +++----- .../project.pbxproj | 8 +++----- .../FirstTableViewController.swift | 2 +- .../Classes/SJSegmentedScrollView.swift | 2 +- .../Classes/SJSegmentedViewController.swift | 18 ++++++++++++++---- SJSegmentedScrollView/Classes/SJUtil.swift | 4 ++-- 6 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Example/Pods/Pods.xcodeproj/project.pbxproj b/Example/Pods/Pods.xcodeproj/project.pbxproj index aec61fa..661e941 100755 --- a/Example/Pods/Pods.xcodeproj/project.pbxproj +++ b/Example/Pods/Pods.xcodeproj/project.pbxproj @@ -269,7 +269,7 @@ LastUpgradeCheck = 0900; TargetAttributes = { 33F3826C7F86DF5250ACD6ABEDD18C3F = { - LastSwiftMigration = 0900; + LastSwiftMigration = 1000; }; }; }; @@ -354,8 +354,7 @@ SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; @@ -523,8 +522,7 @@ SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; diff --git a/Example/SJSegmentedScrollViewDemo.xcodeproj/project.pbxproj b/Example/SJSegmentedScrollViewDemo.xcodeproj/project.pbxproj index de35771..36c234f 100755 --- a/Example/SJSegmentedScrollViewDemo.xcodeproj/project.pbxproj +++ b/Example/SJSegmentedScrollViewDemo.xcodeproj/project.pbxproj @@ -179,7 +179,7 @@ 607FACCF1AFB9204008FA782 = { CreatedOnToolsVersion = 6.3.1; DevelopmentTeam = 5DYFD9UMYF; - LastSwiftMigration = 0900; + LastSwiftMigration = 1000; }; }; }; @@ -415,8 +415,7 @@ PRODUCT_BUNDLE_IDENTIFIER = com.qburst.SJSegmentedScrollViewDemo; PRODUCT_NAME = SJSegmentedScrollViewDemo; PROVISIONING_PROFILE = ""; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Debug; @@ -436,8 +435,7 @@ PRODUCT_NAME = SJSegmentedScrollViewDemo; PROVISIONING_PROFILE = ""; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; - SWIFT_SWIFT3_OBJC_INFERENCE = Default; - SWIFT_VERSION = 4.0; + SWIFT_VERSION = 4.2; TARGETED_DEVICE_FAMILY = "1,2"; }; name = Release; diff --git a/Example/SJSegmentedScrollViewDemo/ViewControllers/FirstTableViewController.swift b/Example/SJSegmentedScrollViewDemo/ViewControllers/FirstTableViewController.swift index 17a5061..35c2f57 100755 --- a/Example/SJSegmentedScrollViewDemo/ViewControllers/FirstTableViewController.swift +++ b/Example/SJSegmentedScrollViewDemo/ViewControllers/FirstTableViewController.swift @@ -17,7 +17,7 @@ class FirstTableViewController: UITableViewController { refreshControl?.addTarget(self, action: #selector(handleRefresh(_:)), - for: UIControlEvents.valueChanged) + for: UIControl.Event.valueChanged) } @objc func handleRefresh(_ refreshControl: UIRefreshControl) { diff --git a/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift b/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift index 1dbb419..9f707b6 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentedScrollView.swift @@ -130,7 +130,7 @@ class SJSegmentedScrollView: UIScrollView { translatesAutoresizingMaskIntoConstraints = false showsHorizontalScrollIndicator = sjShowsHorizontalScrollIndicator showsVerticalScrollIndicator = sjShowsVerticalScrollIndicator - decelerationRate = UIScrollViewDecelerationRateFast + decelerationRate = UIScrollView.DecelerationRate.fast bounces = false addObserver(self, forKeyPath: "contentOffset", diff --git a/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift b/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift index 1d767ca..4ce8da2 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift @@ -282,6 +282,16 @@ import UIKit } open weak var delegate:SJSegmentedViewControllerDelegate? + + open weak var segmentedScrollViewDelegate: UIScrollViewDelegate? { + get { + return segmentedScrollView.delegate + } + set { + segmentedScrollView.delegate = newValue + } + } + lazy var segmentedScrollView: SJSegmentedScrollView = { let sv = SJSegmentedScrollView(frame: CGRect.zero) sv.segmentedViewController = self @@ -432,9 +442,9 @@ import UIKit */ func addHeaderViewController(_ headerViewController: UIViewController) { - addChildViewController(headerViewController) + addChild(headerViewController) segmentedScrollView.addHeaderView(headerViewController.view) - headerViewController.didMove(toParentViewController: self) + headerViewController.didMove(toParent: self) } /** @@ -448,9 +458,9 @@ import UIKit var index = 0 for controller in contentControllers { - addChildViewController(controller) + addChild(controller) segmentedScrollView.addContentView(controller.view, frame: view.bounds) - controller.didMove(toParentViewController: self) + controller.didMove(toParent: self) let delegate = controller as? SJSegmentedViewControllerViewSource var observeView = controller.view diff --git a/SJSegmentedScrollView/Classes/SJUtil.swift b/SJSegmentedScrollView/Classes/SJUtil.swift index 8eb7d23..42f52fb 100755 --- a/SJSegmentedScrollView/Classes/SJUtil.swift +++ b/SJSegmentedScrollView/Classes/SJUtil.swift @@ -38,7 +38,7 @@ class SJUtil { var topSpacing: CGFloat = 0.0 let navigationController = viewController.navigationController - if navigationController?.childViewControllers.last == viewController { + if navigationController?.children.last == viewController { if navigationController?.isNavigationBarHidden == false { topSpacing = UIApplication.shared.statusBarFrame.height @@ -77,7 +77,7 @@ extension String { let constraintRect = CGSize(width: width, height: .greatestFiniteMagnitude) let boundingBox = self.boundingRect(with: constraintRect, options: .usesLineFragmentOrigin, - attributes: [NSAttributedStringKey.font: font], context: nil) + attributes: [NSAttributedString.Key.font: font], context: nil) return boundingBox.width } }