From 26879fc5beef9c9c807cfada1728e15af8c2fc7f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 2 Nov 2015 10:56:10 +0800 Subject: [PATCH 1/5] basic logic of change tabs --- Podfile.lock | 2 +- Yep.xcodeproj/project.pbxproj | 4 ++ Yep/Extensions/UITableView+Yep.swift | 26 ++++++++++ .../TabBar/YepTabBarController.swift | 51 +++++++++++++++++++ 4 files changed, 82 insertions(+), 1 deletion(-) create mode 100644 Yep/Extensions/UITableView+Yep.swift diff --git a/Podfile.lock b/Podfile.lock index 1bddf648..2c4987f5 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -52,7 +52,7 @@ DEPENDENCIES: EXTERNAL SOURCES: MZFayeClient: - :path: "../CatchLib-iOS/MZFayeClient/" + :path: ../CatchLib-iOS/MZFayeClient/ SPEC CHECKSUMS: 1PasswordExtension: 676a216461ffa9189db66541b5a2465e10ae4743 diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 367a6953..a4e44cfc 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -246,6 +246,7 @@ 50DEE0321BE339B000015741 /* LoadMoreTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50DEE0301BE339B000015741 /* LoadMoreTableViewCell.xib */; }; 50DEE0361BE3720F00015741 /* LoadMoreCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE0341BE3720F00015741 /* LoadMoreCollectionViewCell.swift */; }; 50DEE0371BE3720F00015741 /* LoadMoreCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50DEE0351BE3720F00015741 /* LoadMoreCollectionViewCell.xib */; }; + 50DEE0391BE7020900015741 /* UITableView+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE0381BE7020900015741 /* UITableView+Yep.swift */; }; 50E114F41ABBF9CC00F13000 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F31ABBF9CC00F13000 /* Models.swift */; }; 50E114F91ABC137A00F13000 /* YepServiceSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F81ABC137A00F13000 /* YepServiceSync.swift */; }; 50E114FC1ABC549300F13000 /* ContactsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114FA1ABC549300F13000 /* ContactsCell.swift */; }; @@ -563,6 +564,7 @@ 50DEE0301BE339B000015741 /* LoadMoreTableViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoadMoreTableViewCell.xib; path = Views/Cells/LoadMore/LoadMoreTableViewCell.xib; sourceTree = ""; }; 50DEE0341BE3720F00015741 /* LoadMoreCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoadMoreCollectionViewCell.swift; path = Views/Cells/LoadMore/LoadMoreCollectionViewCell.swift; sourceTree = ""; }; 50DEE0351BE3720F00015741 /* LoadMoreCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoadMoreCollectionViewCell.xib; path = Views/Cells/LoadMore/LoadMoreCollectionViewCell.xib; sourceTree = ""; }; + 50DEE0381BE7020900015741 /* UITableView+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UITableView+Yep.swift"; path = "Extensions/UITableView+Yep.swift"; sourceTree = ""; }; 50E114F31ABBF9CC00F13000 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Realm/Models.swift; sourceTree = ""; }; 50E114F81ABC137A00F13000 /* YepServiceSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepServiceSync.swift; path = Services/YepServiceSync.swift; sourceTree = ""; }; 50E114FA1ABC549300F13000 /* ContactsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContactsCell.swift; path = Views/Cells/Contacts/ContactsCell.swift; sourceTree = ""; }; @@ -987,6 +989,7 @@ 5080EB1E1B93F932006F3C2D /* NSBundle+Yep.swift */, 50A820231B969B0F007CD30E /* NSTimeZone+Yep.swift */, 504F5E6E1B9F1F13006CE418 /* NSURLRequest+cURL.swift */, + 50DEE0381BE7020900015741 /* UITableView+Yep.swift */, ); name = Extensions; sourceTree = ""; @@ -2371,6 +2374,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 50DEE0391BE7020900015741 /* UITableView+Yep.swift in Sources */, 50894CFE1AEA5A78000981AF /* EditProfileViewController.swift in Sources */, 50CDBE421ACA9B4200459CE0 /* ChatRightImageCell.swift in Sources */, 5099B9C41AB9510D002F940B /* RankView.swift in Sources */, diff --git a/Yep/Extensions/UITableView+Yep.swift b/Yep/Extensions/UITableView+Yep.swift new file mode 100644 index 00000000..b10b7e9a --- /dev/null +++ b/Yep/Extensions/UITableView+Yep.swift @@ -0,0 +1,26 @@ +// +// UITableView+Yep.swift +// Yep +// +// Created by nixzhu on 15/11/2. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +extension UITableView { + + func tryScrollsToTop() { + + println("tryScrollsToTop: \(numberOfSections), \(numberOfRowsInSection(0))") + +// if numberOfSections > 0 && numberOfRowsInSection(0) > 0 { +// let topIndexPath = NSIndexPath(forRow: 0, inSection: 0) +// scrollToRowAtIndexPath(topIndexPath, atScrollPosition: .Top, animated: true) +// } + + let topPoint = CGPoint(x: 0, y: -contentInset.top) + setContentOffset(topPoint, animated: true) + } +} + diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index 56213ee2..d8c4c78d 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -10,6 +10,8 @@ import UIKit class YepTabBarController: UITabBarController { + var previousTab = Tab.Conversations + struct Listener { static let lauchStyle = "YepTabBarController.lauchStyle" } @@ -65,10 +67,59 @@ class YepTabBarController: UITabBarController { } } +// MARK: - UITabBarControllerDelegate + extension YepTabBarController: UITabBarControllerDelegate { + enum Tab: Int { + + case Conversations + case Contacts + case Feeds + case Discover + case Profile + } + func tabBarController(tabBarController: UITabBarController, didSelectViewController viewController: UIViewController) { + guard + let tab = Tab(rawValue: selectedIndex), + let nvc = viewController as? UINavigationController else { + return + } + + if tab != previousTab { + previousTab = tab + return + } + + switch tab { + + case .Conversations: + let vc = nvc.topViewController as? ConversationsViewController + + case .Contacts: + let vc = nvc.topViewController as? ContactsViewController + + case .Feeds: + if let vc = nvc.topViewController as? FeedsViewController { + + println("vc.feedsTableView.contentOffset.y: \(vc.feedsTableView.contentOffset.y)") + if vc.feedsTableView.contentOffset.y != 0 { + vc.feedsTableView.tryScrollsToTop() + } + } + + case .Discover: + let vc = nvc.topViewController as? DiscoverViewController + + case .Profile: + let vc = nvc.topViewController as? ProfileViewController + + } + + previousTab = tab + /* if selectedIndex == 1 { if let nvc = viewController as? UINavigationController, vc = nvc.topViewController as? ContactsViewController { From 3251158819a165fde4f353ea76f81de8046d09e4 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 2 Nov 2015 11:04:10 +0800 Subject: [PATCH 2/5] better logic --- Yep/Extensions/UITableView+Yep.swift | 14 ++++++-------- .../TabBar/YepTabBarController.swift | 10 ++++------ 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/Yep/Extensions/UITableView+Yep.swift b/Yep/Extensions/UITableView+Yep.swift index b10b7e9a..4bfc1a37 100644 --- a/Yep/Extensions/UITableView+Yep.swift +++ b/Yep/Extensions/UITableView+Yep.swift @@ -9,15 +9,13 @@ import UIKit extension UITableView { + + var yep_isAtTop: Bool { + println("contentOffset.y: \(contentOffset.y), -contentInset.top: \(-contentInset.top)") + return contentOffset.y == -contentInset.top + } - func tryScrollsToTop() { - - println("tryScrollsToTop: \(numberOfSections), \(numberOfRowsInSection(0))") - -// if numberOfSections > 0 && numberOfRowsInSection(0) > 0 { -// let topIndexPath = NSIndexPath(forRow: 0, inSection: 0) -// scrollToRowAtIndexPath(topIndexPath, atScrollPosition: .Top, animated: true) -// } + func yep_scrollsToTop() { let topPoint = CGPoint(x: 0, y: -contentInset.top) setContentOffset(topPoint, animated: true) diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index d8c4c78d..fe5671b2 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -88,6 +88,8 @@ extension YepTabBarController: UITabBarControllerDelegate { return } + // 不相等才继续,确保第一次 tap 不做事 + if tab != previousTab { previousTab = tab return @@ -103,10 +105,8 @@ extension YepTabBarController: UITabBarControllerDelegate { case .Feeds: if let vc = nvc.topViewController as? FeedsViewController { - - println("vc.feedsTableView.contentOffset.y: \(vc.feedsTableView.contentOffset.y)") - if vc.feedsTableView.contentOffset.y != 0 { - vc.feedsTableView.tryScrollsToTop() + if !vc.feedsTableView.yep_isAtTop { + vc.feedsTableView.yep_scrollsToTop() } } @@ -118,8 +118,6 @@ extension YepTabBarController: UITabBarControllerDelegate { } - previousTab = tab - /* if selectedIndex == 1 { if let nvc = viewController as? UINavigationController, vc = nvc.topViewController as? ContactsViewController { From 70d40d736f994ecc351dbeb401cd900bd7ec9282 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 2 Nov 2015 11:08:30 +0800 Subject: [PATCH 3/5] do Conversations & Contacts --- Yep/Extensions/UITableView+Yep.swift | 2 +- Yep/ViewControllers/TabBar/YepTabBarController.swift | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Yep/Extensions/UITableView+Yep.swift b/Yep/Extensions/UITableView+Yep.swift index 4bfc1a37..9bedc1e4 100644 --- a/Yep/Extensions/UITableView+Yep.swift +++ b/Yep/Extensions/UITableView+Yep.swift @@ -11,7 +11,7 @@ import UIKit extension UITableView { var yep_isAtTop: Bool { - println("contentOffset.y: \(contentOffset.y), -contentInset.top: \(-contentInset.top)") + return contentOffset.y == -contentInset.top } diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index fe5671b2..8246ae0e 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -98,10 +98,18 @@ extension YepTabBarController: UITabBarControllerDelegate { switch tab { case .Conversations: - let vc = nvc.topViewController as? ConversationsViewController + if let vc = nvc.topViewController as? ConversationsViewController { + if !vc.conversationsTableView.yep_isAtTop { + vc.conversationsTableView.yep_scrollsToTop() + } + } case .Contacts: - let vc = nvc.topViewController as? ContactsViewController + if let vc = nvc.topViewController as? ContactsViewController { + if !vc.contactsTableView.yep_isAtTop { + vc.contactsTableView.yep_scrollsToTop() + } + } case .Feeds: if let vc = nvc.topViewController as? FeedsViewController { From 2b7fa8ecdf51db176ff002fd6db3f989311ce47f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 2 Nov 2015 11:11:57 +0800 Subject: [PATCH 4/5] do Discover & Profile (UICollectionView) --- Yep.xcodeproj/project.pbxproj | 4 ++++ Yep/Extensions/UICollectionView+Yep.swift | 23 +++++++++++++++++++ .../TabBar/YepTabBarController.swift | 13 ++++++++--- 3 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 Yep/Extensions/UICollectionView+Yep.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index a4e44cfc..85c4a6d0 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -247,6 +247,7 @@ 50DEE0361BE3720F00015741 /* LoadMoreCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE0341BE3720F00015741 /* LoadMoreCollectionViewCell.swift */; }; 50DEE0371BE3720F00015741 /* LoadMoreCollectionViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50DEE0351BE3720F00015741 /* LoadMoreCollectionViewCell.xib */; }; 50DEE0391BE7020900015741 /* UITableView+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE0381BE7020900015741 /* UITableView+Yep.swift */; }; + 50DEE03B1BE70B5100015741 /* UICollectionView+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50DEE03A1BE70B5100015741 /* UICollectionView+Yep.swift */; }; 50E114F41ABBF9CC00F13000 /* Models.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F31ABBF9CC00F13000 /* Models.swift */; }; 50E114F91ABC137A00F13000 /* YepServiceSync.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114F81ABC137A00F13000 /* YepServiceSync.swift */; }; 50E114FC1ABC549300F13000 /* ContactsCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E114FA1ABC549300F13000 /* ContactsCell.swift */; }; @@ -565,6 +566,7 @@ 50DEE0341BE3720F00015741 /* LoadMoreCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoadMoreCollectionViewCell.swift; path = Views/Cells/LoadMore/LoadMoreCollectionViewCell.swift; sourceTree = ""; }; 50DEE0351BE3720F00015741 /* LoadMoreCollectionViewCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = LoadMoreCollectionViewCell.xib; path = Views/Cells/LoadMore/LoadMoreCollectionViewCell.xib; sourceTree = ""; }; 50DEE0381BE7020900015741 /* UITableView+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UITableView+Yep.swift"; path = "Extensions/UITableView+Yep.swift"; sourceTree = ""; }; + 50DEE03A1BE70B5100015741 /* UICollectionView+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UICollectionView+Yep.swift"; path = "Extensions/UICollectionView+Yep.swift"; sourceTree = ""; }; 50E114F31ABBF9CC00F13000 /* Models.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = Models.swift; path = Realm/Models.swift; sourceTree = ""; }; 50E114F81ABC137A00F13000 /* YepServiceSync.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepServiceSync.swift; path = Services/YepServiceSync.swift; sourceTree = ""; }; 50E114FA1ABC549300F13000 /* ContactsCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ContactsCell.swift; path = Views/Cells/Contacts/ContactsCell.swift; sourceTree = ""; }; @@ -990,6 +992,7 @@ 50A820231B969B0F007CD30E /* NSTimeZone+Yep.swift */, 504F5E6E1B9F1F13006CE418 /* NSURLRequest+cURL.swift */, 50DEE0381BE7020900015741 /* UITableView+Yep.swift */, + 50DEE03A1BE70B5100015741 /* UICollectionView+Yep.swift */, ); name = Extensions; sourceTree = ""; @@ -2414,6 +2417,7 @@ 502AE53D1AB87C0D005BD199 /* YepUserDefaults.swift in Sources */, 50F5AF881BBBB2AE0033C9BC /* HorizontalLineView.swift in Sources */, 50EB8CC41AE89F12001AC1EE /* ChatRightVideoCell.swift in Sources */, + 50DEE03B1BE70B5100015741 /* UICollectionView+Yep.swift in Sources */, 50AACECF1BB93336004DD54B /* FeedMediaView.swift in Sources */, 50DEE02C1BE209FF00015741 /* DeletedFeedConversationCell.swift in Sources */, 50D4D0DB1AFA825B005AEB6F /* MediaControlView.swift in Sources */, diff --git a/Yep/Extensions/UICollectionView+Yep.swift b/Yep/Extensions/UICollectionView+Yep.swift new file mode 100644 index 00000000..36eb613f --- /dev/null +++ b/Yep/Extensions/UICollectionView+Yep.swift @@ -0,0 +1,23 @@ +// +// UICollectionView+Yep.swift +// Yep +// +// Created by nixzhu on 15/11/2. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +extension UICollectionView { + + var yep_isAtTop: Bool { + + return contentOffset.y == -contentInset.top + } + + func yep_scrollsToTop() { + + let topPoint = CGPoint(x: 0, y: -contentInset.top) + setContentOffset(topPoint, animated: true) + } +} diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index 8246ae0e..12c81c22 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -119,11 +119,18 @@ extension YepTabBarController: UITabBarControllerDelegate { } case .Discover: - let vc = nvc.topViewController as? DiscoverViewController + if let vc = nvc.topViewController as? DiscoverViewController { + if !vc.discoveredUsersCollectionView.yep_isAtTop { + vc.discoveredUsersCollectionView.yep_scrollsToTop() + } + } case .Profile: - let vc = nvc.topViewController as? ProfileViewController - + if let vc = nvc.topViewController as? ProfileViewController { + if !vc.profileCollectionView.yep_isAtTop { + vc.profileCollectionView.yep_scrollsToTop() + } + } } /* From a1cb547d845afc4e4b9e36a3d2b2667b6a59194e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 2 Nov 2015 11:18:45 +0800 Subject: [PATCH 5/5] Set Titles --- .../TabBar/YepTabBarController.swift | 47 +++++++++++-------- 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index 12c81c22..1369fb90 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -10,6 +10,31 @@ import UIKit class YepTabBarController: UITabBarController { + enum Tab: Int { + + case Conversations + case Contacts + case Feeds + case Discover + case Profile + + var title: String { + + switch self { + case .Conversations: + return NSLocalizedString("Chats", comment: "") + case .Contacts: + return NSLocalizedString("Contacts", comment: "") + case .Feeds: + return NSLocalizedString("Feeds", comment: "") + case .Discover: + return NSLocalizedString("Discover", comment: "") + case .Profile: + return NSLocalizedString("Profile", comment: "") + } + } + } + var previousTab = Tab.Conversations struct Listener { @@ -39,19 +64,12 @@ class YepTabBarController: UITabBarController { } */ + // Set Titles + if let items = tabBar.items { - - let titles = [ - NSLocalizedString("Chats", comment: ""), - NSLocalizedString("Contacts", comment: ""), - NSLocalizedString("Feeds", comment: ""), - NSLocalizedString("Discover", comment: ""), - NSLocalizedString("Profile", comment: ""), - ] - for i in 0..