From 01b88675419a2b081b27bff10d423ef417a1e485 Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Fri, 12 Jan 2018 10:33:35 +0500 Subject: [PATCH 1/8] Updated to swift 4 Added public method to get view at index for views managed by scrollView --- ScrollPager.xcodeproj/project.pbxproj | 30 ++++++++++++++----- .../xcschemes/ScrollPager.xcscheme | 4 ++- .../xcschemes/ScrollPagerTests.xcscheme | 4 ++- ScrollPager/Source/ScrollPager.swift | 11 +++++-- 4 files changed, 38 insertions(+), 11 deletions(-) diff --git a/ScrollPager.xcodeproj/project.pbxproj b/ScrollPager.xcodeproj/project.pbxproj index 384c7f3..eec24e8 100644 --- a/ScrollPager.xcodeproj/project.pbxproj +++ b/ScrollPager.xcodeproj/project.pbxproj @@ -169,17 +169,17 @@ attributes = { LastSwiftMigration = 0700; LastSwiftUpdateCheck = 0700; - LastUpgradeCheck = 0800; + LastUpgradeCheck = 0920; ORGANIZATIONNAME = "Aryan Ghassemi"; TargetAttributes = { 15F9717A1A9A86E400169B7E = { CreatedOnToolsVersion = 6.1.1; DevelopmentTeam = 24FGDP9KJW; - LastSwiftMigration = 0800; + LastSwiftMigration = 0920; }; 15F9718F1A9A86E400169B7E = { CreatedOnToolsVersion = 6.1.1; - LastSwiftMigration = 0800; + LastSwiftMigration = 0920; TestTargetID = 15F9717A1A9A86E400169B7E; }; }; @@ -280,14 +280,20 @@ 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; @@ -327,14 +333,20 @@ 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; @@ -368,7 +380,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.aryaxt.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Debug; }; @@ -381,7 +394,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.aryaxt.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; }; name = Release; }; @@ -401,7 +415,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.aryaxt.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollPager.app/ScrollPager"; }; name = Debug; @@ -418,7 +433,8 @@ LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; PRODUCT_BUNDLE_IDENTIFIER = "com.aryaxt.$(PRODUCT_NAME:rfc1034identifier)"; PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_VERSION = 3.0; + SWIFT_SWIFT3_OBJC_INFERENCE = On; + SWIFT_VERSION = 4.0; TEST_HOST = "$(BUILT_PRODUCTS_DIR)/ScrollPager.app/ScrollPager"; }; name = Release; diff --git a/ScrollPager.xcodeproj/xcshareddata/xcschemes/ScrollPager.xcscheme b/ScrollPager.xcodeproj/xcshareddata/xcschemes/ScrollPager.xcscheme index 19cd6ca..805e77e 100644 --- a/ScrollPager.xcodeproj/xcshareddata/xcschemes/ScrollPager.xcscheme +++ b/ScrollPager.xcodeproj/xcshareddata/xcschemes/ScrollPager.xcscheme @@ -1,6 +1,6 @@ UIView? { + guard index < views.count else { + return nil + } + return views[index] + } // MARK: - Private - @@ -213,7 +220,7 @@ import UIKit if strongSelf.indicatorSizeMatchesTitle { guard let string = button.titleLabel?.text else { fatalError("missing title on button, title is required for width calculation") } guard let font = button.titleLabel?.font else { fatalError("missing dont on button, title is required for width calculation") } - let size = string.size(attributes: [NSFontAttributeName: font]) + let size = string.size(withAttributes: [NSAttributedStringKey.font: font]) let x = width * CGFloat(index) + ((width - size.width) / CGFloat(2)) strongSelf.indicatorView.frame = CGRect(x: x, y: indicatorY, width: size.width, height: strongSelf.indicatorHeight) } @@ -266,7 +273,7 @@ import UIKit } } - internal func buttonSelected(sender: UIButton) { + @objc internal func buttonSelected(sender: UIButton) { if sender.tag == selectedIndex { return } From d996b5faf67f6d8556c7a610ead64b47eb3656e7 Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Fri, 12 Jan 2018 10:37:30 +0500 Subject: [PATCH 2/8] Changed delegate method name to make it more in line with swift naming convention --- ScrollPager/Source/ScrollPager.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index e9ed2bc..f444355 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -29,7 +29,7 @@ import UIKit @objc public protocol ScrollPagerDelegate: NSObjectProtocol { - @objc optional func scrollPager(scrollPager: ScrollPager, changedIndex: Int) + @objc optional func scrollPager(_ scrollPager: ScrollPager, changedIndex: Int) } @IBDesignable public class ScrollPager: UIView, UIScrollViewDelegate{ @@ -278,7 +278,7 @@ import UIKit return } - delegate?.scrollPager?(scrollPager: self, changedIndex: sender.tag) + delegate?.scrollPager?(self, changedIndex: sender.tag) setSelectedIndex(index: sender.tag, animated: true, moveScrollView: true) } @@ -295,7 +295,7 @@ import UIKit if Int(page) != selectedIndex { setSelectedIndex(index: Int(page), animated: true, moveScrollView: false) - delegate?.scrollPager?(scrollPager: self, changedIndex: Int(page)) + delegate?.scrollPager?(self, changedIndex: Int(page)) } } } From 7132a629611074d24031b253b56ff7468035b173 Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Fri, 12 Jan 2018 11:46:07 +0500 Subject: [PATCH 3/8] renamed methods more in line with swift naming convention --- ScrollPager/Source/ScrollPager.swift | 48 ++++++++++++++-------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index f444355..613bce0 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -120,34 +120,34 @@ import UIKit // MARK: - Public Methods - - public func addSegmentsWithTitlesAndViews(segments: [(title: String, view: UIView)]) { + public func addSegments(with segments: [(title: String, view: UIView)]) { - addButtons(titleOrImages: segments.map { $0.title as AnyObject }) - addViews(segmentViews: segments.map { $0.view }) + addButtons(segments.map { $0.title as AnyObject }) + addViews(segments.map { $0.view }) redrawComponents() } - public func addSegmentsWithImagesAndViews(segments: [(image: UIImage, view: UIView)]) { + public func addSegments(with segments: [(image: UIImage, view: UIView)]) { - addButtons(titleOrImages: segments.map { $0.image }) - addViews(segmentViews: segments.map { $0.view }) + addButtons(segments.map { $0.image }) + addViews(segments.map { $0.view }) redrawComponents() } - - public func addSegmentsWithTitles(segmentTitles: [String]) { - addButtons(titleOrImages: segmentTitles as [AnyObject]) + @objc(addSegmentsWithTitles:) + public func addSegments(with segmentTitles: [String]) { + addButtons(segmentTitles as [AnyObject]) redrawComponents() } - - public func addSegmentsWithImages(segmentImages: [UIImage]) { - addButtons(titleOrImages: segmentImages) + @objc(addSegmentsWithImages:) + public func addSegments(with segmentImages: [UIImage]) { + addButtons(segmentImages) redrawComponents() } - public func setSelectedIndex(index: Int, animated: Bool) { - setSelectedIndex(index: index, animated: animated, moveScrollView: true) + public func setSelectedIndex(_ index: Int, animated: Bool) { + setSelectedIndex(index, animated: animated, moveScrollView: true) } public func viewForItem(at index: Int) -> UIView? { @@ -159,13 +159,13 @@ import UIKit // MARK: - Private - - private func setSelectedIndex(index: Int, animated: Bool, moveScrollView: Bool) { + private func setSelectedIndex(_ index: Int, animated: Bool, moveScrollView: Bool) { selectedIndex = index - moveToIndex(index: index, animated: animated, moveScrollView: moveScrollView) + move(to: index, animated: animated, moveScrollView: moveScrollView) } - private func addViews(segmentViews: [UIView]) { + private func addViews(_ segmentViews: [UIView]) { guard let scrollView = scrollView else { fatalError("trying to add views but the scrollView is nil") } for view in scrollView.subviews { @@ -179,7 +179,7 @@ import UIKit } } - private func addButtons(titleOrImages: [AnyObject]) { + private func addButtons(_ titleOrImages: [AnyObject]) { for button in buttons { button.removeFromSuperview() } @@ -189,7 +189,7 @@ import UIKit for i in 0.. 0 { - moveToIndex(index: selectedIndex, animated: false, moveScrollView: false) + move(to: selectedIndex, animated: false, moveScrollView: false) } if let scrollView = scrollView { @@ -273,14 +273,14 @@ import UIKit } } - @objc internal func buttonSelected(sender: UIButton) { + @objc internal func buttonSelected(_ sender: UIButton) { if sender.tag == selectedIndex { return } delegate?.scrollPager?(self, changedIndex: sender.tag) - setSelectedIndex(index: sender.tag, animated: true, moveScrollView: true) + setSelectedIndex(sender.tag, animated: true, moveScrollView: true) } // MARK: - UIScrollView Delegate - @@ -294,7 +294,7 @@ import UIKit } if Int(page) != selectedIndex { - setSelectedIndex(index: Int(page), animated: true, moveScrollView: false) + setSelectedIndex(Int(page), animated: true, moveScrollView: false) delegate?.scrollPager?(self, changedIndex: Int(page)) } } From dddc4780c9cf371561cb63dc5728bc02220f1536 Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Fri, 12 Jan 2018 11:46:57 +0500 Subject: [PATCH 4/8] Fixed interface builder method --- ScrollPager/Source/ScrollPager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index 613bce0..b8d7996 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -105,7 +105,7 @@ import UIKit private func initialize() { #if TARGET_INTERFACE_BUILDER - addSegmentsWithTitles(["One", "Two", "Three", "Four"]) + addSegments(with: ["One", "Two", "Three", "Four"]) #endif } From 2e0684d5b8754f8fabe21c60901636d5e0052bfc Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Fri, 12 Jan 2018 11:47:58 +0500 Subject: [PATCH 5/8] Fixed test app --- ScrollPager/ViewController.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ScrollPager/ViewController.swift b/ScrollPager/ViewController.swift index 910c006..10f75ae 100644 --- a/ScrollPager/ViewController.swift +++ b/ScrollPager/ViewController.swift @@ -37,14 +37,14 @@ class ViewController: UIViewController, ScrollPagerDelegate { fourthView.textAlignment = .center scrollPager.delegate = self - scrollPager.addSegmentsWithTitlesAndViews(segments: [ + scrollPager.addSegments(with: [ ("Home", firstView), ("Public Feed", secondView), ("Profile", thirdView), ("One More", fourthView) ]) - secondScrollPager.addSegmentsWithImages(segmentImages: [ + secondScrollPager.addSegments(with: [ UIImage(named: "envelope")!, UIImage(named: "home")!, UIImage(named: "like")!, From 067d24c81ea1353067972c0af79b8b479cef786c Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Thu, 15 Mar 2018 18:53:46 +0500 Subject: [PATCH 6/8] Made selectedIndex accessible Selected index should be publicly gettable --- .../UserInterfaceState.xcuserstate | Bin 0 -> 50835 bytes ScrollPager/Source/ScrollPager.swift | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 ScrollPager.xcodeproj/project.xcworkspace/xcuserdata/datainventsystems.xcuserdatad/UserInterfaceState.xcuserstate diff --git a/ScrollPager.xcodeproj/project.xcworkspace/xcuserdata/datainventsystems.xcuserdatad/UserInterfaceState.xcuserstate b/ScrollPager.xcodeproj/project.xcworkspace/xcuserdata/datainventsystems.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..4d71435cda8ff2a799bc6c2fb4d224c30043e99a GIT binary patch literal 50835 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%0D|{|kfkl)1TY_qIc&fs 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 S*xCKxIsL-_t03Qu-ufShsml-m literal 0 HcmV?d00001 diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index b8d7996..3d6b820 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -34,7 +34,7 @@ import UIKit @IBDesignable public class ScrollPager: UIView, UIScrollViewDelegate{ - private var selectedIndex = 0 + private(set) var selectedIndex = 0 private let indicatorView = UIView() private var buttons = [UIButton]() private var views = [UIView]() From fc15f45ab13122857caeeb940764d11b8335cd5b Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Thu, 15 Mar 2018 19:00:18 +0500 Subject: [PATCH 7/8] Minor issue fix --- ScrollPager/Source/ScrollPager.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index 3d6b820..c74007a 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -34,7 +34,7 @@ import UIKit @IBDesignable public class ScrollPager: UIView, UIScrollViewDelegate{ - private(set) var selectedIndex = 0 + public private(set) var selectedIndex = 0 private let indicatorView = UIView() private var buttons = [UIButton]() private var views = [UIView]() From 2a1a145cfed13132e2014def60c52c3292257f37 Mon Sep 17 00:00:00 2001 From: Mahmood Tahir Date: Thu, 15 Mar 2018 19:08:22 +0500 Subject: [PATCH 8/8] Fixed selected index updating after delegate is called --- ScrollPager/Source/ScrollPager.swift | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/ScrollPager/Source/ScrollPager.swift b/ScrollPager/Source/ScrollPager.swift index c74007a..35f630a 100644 --- a/ScrollPager/Source/ScrollPager.swift +++ b/ScrollPager/Source/ScrollPager.swift @@ -277,10 +277,11 @@ import UIKit if sender.tag == selectedIndex { return } - + // change the selected index + setSelectedIndex(sender.tag, animated: true, moveScrollView: true) + // notify the delegate that index has changed delegate?.scrollPager?(self, changedIndex: sender.tag) - setSelectedIndex(sender.tag, animated: true, moveScrollView: true) } // MARK: - UIScrollView Delegate -