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/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..690255d 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,21 @@ 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 - - + 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 +113,7 @@ class SJSegmentView: UIScrollView { NotificationCenter.default.removeObserver(self, name:NSNotification.Name("DidChangeSegmentIndex"), - object: nil) + object: segmentedViewController) } @objc func didChangeSegmentIndex(_ notification: Notification) { @@ -125,7 +124,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 +280,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..9f707b6 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 { @@ -128,7 +130,7 @@ class SJSegmentedScrollView: UIScrollView { translatesAutoresizingMaskIntoConstraints = false showsHorizontalScrollIndicator = sjShowsHorizontalScrollIndicator showsVerticalScrollIndicator = sjShowsVerticalScrollIndicator - decelerationRate = UIScrollViewDecelerationRateFast + decelerationRate = UIScrollView.DecelerationRate.fast bounces = false addObserver(self, forKeyPath: "contentOffset", @@ -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..4ce8da2 100755 --- a/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift +++ b/SJSegmentedScrollView/Classes/SJSegmentedViewController.swift @@ -282,7 +282,22 @@ import UIKit } open weak var delegate:SJSegmentedViewControllerDelegate? - var segmentedScrollView = SJSegmentedScrollView(frame: CGRect.zero) + + 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 + return sv + }() + var segmentScrollViewTopConstraint: NSLayoutConstraint? @@ -350,8 +365,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]) } } @@ -427,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) } /** @@ -443,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 } }