From 8702c36427eea879e7d389f4ca831bf9fadb02e3 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 11:19:03 +0800 Subject: [PATCH 01/58] add FeedsViewController --- Yep.xcodeproj/project.pbxproj | 12 ++++++ Yep/Base.lproj/Main.storyboard | 39 +++++++++++++++++++ .../Feeds/FeedsViewController.swift | 23 +++++++++++ .../TabBar/YepTabBarController.swift | 1 + 4 files changed, 75 insertions(+) create mode 100644 Yep/ViewControllers/Feeds/FeedsViewController.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 8b923953..45b90bca 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -197,6 +197,7 @@ 50AFBF491BB2830E007D19DA /* EdgeBorderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4E1BB3A594007D19DA /* bub3.caf in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF4D1BB3A594007D19DA /* bub3.caf */; settings = {ASSET_TAGS = (); }; }; + 50AFBF5F1BB4F332007D19DA /* FeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */; settings = {ASSET_TAGS = (); }; }; 50B38FB71B69CD960064C132 /* Array+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FB61B69CD960064C132 /* Array+Yep.swift */; }; 50B38FCC1B6B37F00064C132 /* FeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */; }; 50B8E6161B40F9E700C17EA1 /* YepDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */; }; @@ -459,6 +460,7 @@ 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EdgeBorderButton.swift; path = Views/Buttons/EdgeBorderButton.swift; sourceTree = ""; }; 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; 50AFBF4D1BB3A594007D19DA /* bub3.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = bub3.caf; path = Sounds/bub3.caf; sourceTree = ""; }; + 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedsViewController.swift; path = ViewControllers/Feeds/FeedsViewController.swift; sourceTree = ""; }; 50B38FB61B69CD960064C132 /* Array+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Yep.swift"; path = "Extensions/Array+Yep.swift"; sourceTree = ""; }; 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedbackViewController.swift; path = ViewControllers/Feedback/FeedbackViewController.swift; sourceTree = ""; }; 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepDownloader.swift; path = Services/YepDownloader.swift; sourceTree = ""; }; @@ -789,6 +791,7 @@ 0A943A7C1B0F8EB10022DD67 /* Base */, 0AB8F79B1B15D1DF00F4AF09 /* Nav */, 848806B71B7B4F58000C5424 /* Show */, + 50AFBF601BB4F33A007D19DA /* Feeds */, ); name = ViewControllers; sourceTree = ""; @@ -1523,6 +1526,14 @@ name = Sounds; sourceTree = ""; }; + 50AFBF601BB4F33A007D19DA /* Feeds */ = { + isa = PBXGroup; + children = ( + 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */, + ); + name = Feeds; + sourceTree = ""; + }; 50B38FCD1B6B37F90064C132 /* Feedback */ = { isa = PBXGroup; children = ( @@ -2037,6 +2048,7 @@ 505EC81C1ADFBE1B001D27E0 /* SkillSelectionCell.swift in Sources */, 5023DE591AB6DBC100B3EE96 /* UIImage+Yep.swift in Sources */, 508F8FD41B01E3D100461B0B /* SocialWorkDribbbleViewController.swift in Sources */, + 50AFBF5F1BB4F332007D19DA /* FeedsViewController.swift in Sources */, 50EB8CBF1AE89ED8001AC1EE /* ChatLeftVideoCell.swift in Sources */, 502AE5331AB86020005BD199 /* RegisterVerifyMobileViewController.swift in Sources */, 5064F6541B0B0E160089FAD4 /* AddFriendSearchCell.swift in Sources */, diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index cfe74530..ecbe4c09 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1556,12 +1556,32 @@ + + + + + + + + + + + + + + + + + + + + @@ -1957,6 +1977,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift new file mode 100644 index 00000000..35e1a45a --- /dev/null +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -0,0 +1,23 @@ +// +// FeedsViewController.swift +// Yep +// +// Created by nixzhu on 15/9/25. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class FeedsViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + title = NSLocalizedString("Feeds", comment: "") + } + + // MARK: - Navigation + + override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + } +} diff --git a/Yep/ViewControllers/TabBar/YepTabBarController.swift b/Yep/ViewControllers/TabBar/YepTabBarController.swift index b5446b70..7d1a174e 100644 --- a/Yep/ViewControllers/TabBar/YepTabBarController.swift +++ b/Yep/ViewControllers/TabBar/YepTabBarController.swift @@ -44,6 +44,7 @@ class YepTabBarController: UITabBarController { NSLocalizedString("Contacts", comment: ""), NSLocalizedString("Discover", comment: ""), NSLocalizedString("Profile", comment: ""), + NSLocalizedString("Feeds", comment: ""), ] for i in 0.. Date: Fri, 25 Sep 2015 11:49:48 +0800 Subject: [PATCH 02/58] feedsCollectionView --- Yep/Base.lproj/Main.storyboard | 25 +++++++++++++ .../Feeds/FeedsViewController.swift | 35 +++++++++++++++++++ 2 files changed, 60 insertions(+) diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index ecbe4c09..dbcf98c7 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1574,9 +1574,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 35e1a45a..dd9590f6 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -10,10 +10,18 @@ import UIKit class FeedsViewController: UIViewController { + @IBOutlet weak var feedsCollectionView: UICollectionView! + + lazy var collectionViewWidth: CGFloat = { + return CGRectGetWidth(self.feedsCollectionView.bounds) + }() + override func viewDidLoad() { super.viewDidLoad() title = NSLocalizedString("Feeds", comment: "") + + feedsCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") } // MARK: - Navigation @@ -21,3 +29,30 @@ class FeedsViewController: UIViewController { override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { } } + +extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDelegate { + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 15 + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) + cell.backgroundColor = UIColor.redColor() + return cell + } + + func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { + + return CGSize(width: collectionViewWidth, height: 200) + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) + } +} + From 5285675279dfaea9632698408e69d0caa0f55803 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 14:38:32 +0800 Subject: [PATCH 03/58] add FeedCell --- Yep.xcodeproj/project.pbxproj | 16 +++ .../icon_discussion.imageset/Contents.json | 12 ++ .../icon_discussion.pdf | Bin 0 -> 4226 bytes .../Feeds/FeedsViewController.swift | 8 +- Yep/Views/Cells/Feed/FeedCell.swift | 40 +++++++ Yep/Views/Cells/Feed/FeedCell.xib | 109 ++++++++++++++++++ 6 files changed, 182 insertions(+), 3 deletions(-) create mode 100644 Yep/Images.xcassets/icon_discussion.imageset/Contents.json create mode 100644 Yep/Images.xcassets/icon_discussion.imageset/icon_discussion.pdf create mode 100644 Yep/Views/Cells/Feed/FeedCell.swift create mode 100644 Yep/Views/Cells/Feed/FeedCell.xib diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 45b90bca..57618862 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -198,6 +198,8 @@ 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4E1BB3A594007D19DA /* bub3.caf in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF4D1BB3A594007D19DA /* bub3.caf */; settings = {ASSET_TAGS = (); }; }; 50AFBF5F1BB4F332007D19DA /* FeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 50AFBF631BB4FC30007D19DA /* FeedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF611BB4FC30007D19DA /* FeedCell.swift */; settings = {ASSET_TAGS = (); }; }; + 50AFBF641BB4FC30007D19DA /* FeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF621BB4FC30007D19DA /* FeedCell.xib */; settings = {ASSET_TAGS = (); }; }; 50B38FB71B69CD960064C132 /* Array+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FB61B69CD960064C132 /* Array+Yep.swift */; }; 50B38FCC1B6B37F00064C132 /* FeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */; }; 50B8E6161B40F9E700C17EA1 /* YepDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */; }; @@ -461,6 +463,8 @@ 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; 50AFBF4D1BB3A594007D19DA /* bub3.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = bub3.caf; path = Sounds/bub3.caf; sourceTree = ""; }; 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedsViewController.swift; path = ViewControllers/Feeds/FeedsViewController.swift; sourceTree = ""; }; + 50AFBF611BB4FC30007D19DA /* FeedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedCell.swift; path = Views/Cells/Feed/FeedCell.swift; sourceTree = ""; }; + 50AFBF621BB4FC30007D19DA /* FeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedCell.xib; path = Views/Cells/Feed/FeedCell.xib; sourceTree = ""; }; 50B38FB61B69CD960064C132 /* Array+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Yep.swift"; path = "Extensions/Array+Yep.swift"; sourceTree = ""; }; 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedbackViewController.swift; path = ViewControllers/Feedback/FeedbackViewController.swift; sourceTree = ""; }; 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepDownloader.swift; path = Services/YepDownloader.swift; sourceTree = ""; }; @@ -926,6 +930,7 @@ 5064F6561B0B0E1B0089FAD4 /* AddFriendSearch */, 5064F65B1B0B14470089FAD4 /* AddFriendMore */, 50E348941B9063AD00A8E699 /* About */, + 50AFBF651BB4FC37007D19DA /* Feed */, ); name = Cells; sourceTree = ""; @@ -1534,6 +1539,15 @@ name = Feeds; sourceTree = ""; }; + 50AFBF651BB4FC37007D19DA /* Feed */ = { + isa = PBXGroup; + children = ( + 50AFBF611BB4FC30007D19DA /* FeedCell.swift */, + 50AFBF621BB4FC30007D19DA /* FeedCell.xib */, + ); + name = Feed; + sourceTree = ""; + }; 50B38FCD1B6B37F90064C132 /* Feedback */ = { isa = PBXGroup; children = ( @@ -1871,6 +1885,7 @@ 508D17481ACCF4710092D666 /* ChatLeftAudioCell.xib in Resources */, 0A8F54B61AB67D11004AD60E /* Main.storyboard in Resources */, 5033159D1AC101C80008A209 /* ChatRightTextCell.xib in Resources */, + 50AFBF641BB4FC30007D19DA /* FeedCell.xib in Resources */, 84385C461B8594E80071130D /* Show.xcassets in Resources */, 50894CFB1AEA54BA000981AF /* SettingsMoreCell.xib in Resources */, 505EC8181ADF8151001D27E0 /* SkillCategoryCell.xib in Resources */, @@ -2076,6 +2091,7 @@ 5019F6311B39BFE00000D993 /* ConversationMoreView.swift in Sources */, 506BB7F51AE4E0A500C1A2A0 /* SkillAnnotationHeader.swift in Sources */, 5023DE301AB6861500B3EE96 /* ProfileViewController.swift in Sources */, + 50AFBF631BB4FC30007D19DA /* FeedCell.swift in Sources */, 5023DE261AB6856300B3EE96 /* ConversationsViewController.swift in Sources */, 50A9D4511ACD383E000B2599 /* NSDate+Extension.swift in Sources */, 506EC20A1AC95BFC00CE42B3 /* UIFont+Yep.swift in Sources */, diff --git a/Yep/Images.xcassets/icon_discussion.imageset/Contents.json b/Yep/Images.xcassets/icon_discussion.imageset/Contents.json new file mode 100644 index 00000000..4f4318a1 --- /dev/null +++ b/Yep/Images.xcassets/icon_discussion.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_discussion.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Yep/Images.xcassets/icon_discussion.imageset/icon_discussion.pdf b/Yep/Images.xcassets/icon_discussion.imageset/icon_discussion.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6173d31fc02303933cbf4e2590cf6d73ea7d4a87 GIT binary patch literal 4226 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 IGuH?I2RH38`~Uy| literal 0 HcmV?d00001 diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index dd9590f6..f83b84b1 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -16,12 +16,15 @@ class FeedsViewController: UIViewController { return CGRectGetWidth(self.feedsCollectionView.bounds) }() + let feedCellID = "FeedCell" + override func viewDidLoad() { super.viewDidLoad() title = NSLocalizedString("Feeds", comment: "") - feedsCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") + feedsCollectionView.backgroundColor = UIColor.whiteColor() + feedsCollectionView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellWithReuseIdentifier: feedCellID) } // MARK: - Navigation @@ -41,8 +44,7 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) - cell.backgroundColor = UIColor.redColor() + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedCellID, forIndexPath: indexPath) as! FeedCell return cell } diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift new file mode 100644 index 00000000..752bf9d0 --- /dev/null +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -0,0 +1,40 @@ +// +// FeedCell.swift +// Yep +// +// Created by nixzhu on 15/9/25. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class FeedCell: UICollectionViewCell { + + @IBOutlet weak var avatarImageView: UIImageView! + + @IBOutlet weak var nicknameLabel: UILabel! + + @IBOutlet weak var distanceLabel: UILabel! + + @IBOutlet weak var messageLabel: UILabel! + + @IBOutlet weak var mediaCollectionView: UICollectionView! + + @IBOutlet weak var timeLabel: UILabel! + + @IBOutlet weak var messageCountLabel: UILabel! + + + override func awakeFromNib() { + super.awakeFromNib() + + avatarImageView.backgroundColor = UIColor.redColor() + nicknameLabel.backgroundColor = UIColor.redColor() + distanceLabel.backgroundColor = UIColor.redColor() + messageLabel.backgroundColor = UIColor.redColor() + mediaCollectionView.backgroundColor = UIColor.redColor() + timeLabel.backgroundColor = UIColor.redColor() + messageCountLabel.backgroundColor = UIColor.redColor() + } +} + diff --git a/Yep/Views/Cells/Feed/FeedCell.xib b/Yep/Views/Cells/Feed/FeedCell.xib new file mode 100644 index 00000000..7bb7816b --- /dev/null +++ b/Yep/Views/Cells/Feed/FeedCell.xib @@ -0,0 +1,109 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3136a0de7ed7678a0e9cc1cb62f7553727da73eb Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 14:57:30 +0800 Subject: [PATCH 04/58] Feeds icon & trans --- Yep/Base.lproj/Main.storyboard | 22 ++++++++++-------- .../icon_feeds.imageset/Contents.json | 15 ++++++++++++ .../icon_feeds.imageset/icon_feeds.pdf | Bin 0 -> 4316 bytes .../icon_feeds_active.imageset/Contents.json | 15 ++++++++++++ .../icon_feeds_active.pdf | Bin 0 -> 4703 bytes .../TabBar/YepTabBarController.swift | 2 +- Yep/en.lproj/Localizable.strings | 3 +++ Yep/zh-Hans.lproj/Localizable.strings | 3 +++ 8 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 Yep/Images.xcassets/icon_feeds.imageset/Contents.json create mode 100644 Yep/Images.xcassets/icon_feeds.imageset/icon_feeds.pdf create mode 100644 Yep/Images.xcassets/icon_feeds_active.imageset/Contents.json create mode 100644 Yep/Images.xcassets/icon_feeds_active.imageset/icon_feeds_active.pdf diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index dbcf98c7..2410b966 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -291,13 +291,13 @@ - + - + @@ -1021,7 +1021,7 @@ - - - + @@ -1248,14 +1248,14 @@ - - + @@ -83,7 +84,6 @@ - @@ -96,6 +96,7 @@ + From 7f5352eb4693e524c0a2b6b3531f18876f72314f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 17:04:38 +0800 Subject: [PATCH 08/58] rename timeLabelTopConstraint --- Yep/Views/Feed/FeedView.swift | 45 ++++++++++++++ Yep/Views/Feed/FeedView.xib | 107 ++++++++++++++++++++++++++++++++++ 2 files changed, 152 insertions(+) create mode 100644 Yep/Views/Feed/FeedView.swift create mode 100644 Yep/Views/Feed/FeedView.xib diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift new file mode 100644 index 00000000..bb29f372 --- /dev/null +++ b/Yep/Views/Feed/FeedView.swift @@ -0,0 +1,45 @@ +// +// FeedView.swift +// Yep +// +// Created by nixzhu on 15/9/25. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class FeedView: UIView { + + @IBOutlet weak var avatarImageView: UIImageView! + @IBOutlet weak var nicknameLabel: UILabel! + @IBOutlet weak var distanceLabel: UILabel! + + @IBOutlet weak var messageLabel: UILabel! + + @IBOutlet weak var mediaCollectionView: UICollectionView! + + @IBOutlet weak var timeLabel: UILabel! + @IBOutlet weak var timeLabelTopConstraint: NSLayoutConstraint! + + @IBOutlet weak var messageCountLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + avatarImageView.backgroundColor = UIColor.redColor() + nicknameLabel.backgroundColor = UIColor.redColor() + distanceLabel.backgroundColor = UIColor.redColor() + messageLabel.backgroundColor = UIColor.redColor() + mediaCollectionView.backgroundColor = UIColor.redColor() + timeLabel.backgroundColor = UIColor.redColor() + messageCountLabel.backgroundColor = UIColor.redColor() + + messageLabel.font = UIFont.feedMessageFont() + + //mediaCollectionView.dataSource = self + //mediaCollectionView.delegate = self + + //mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") + } +} + diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib new file mode 100644 index 00000000..3c5054fa --- /dev/null +++ b/Yep/Views/Feed/FeedView.xib @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a4aa35ad876e4f26549c3166ce928b4f77ddc609 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 19:19:58 +0800 Subject: [PATCH 09/58] makeFeedView --- Yep.xcodeproj/project.pbxproj | 16 ++++++++++ .../ConversationViewController.swift | 32 +++++++++++++++++-- Yep/Views/Cells/Feed/FeedCell.swift | 5 +-- Yep/Views/Cells/Feed/FeedCell.xib | 2 +- Yep/Views/Feed/FeedView.swift | 6 ++++ 5 files changed, 56 insertions(+), 5 deletions(-) diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 57618862..b5b4cbd6 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -193,6 +193,8 @@ 50A9D44E1ACD382B000B2599 /* NSDateTimeAgo.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 50A9D44C1ACD382B000B2599 /* NSDateTimeAgo.bundle */; }; 50A9D4511ACD383E000B2599 /* NSDate+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A9D4501ACD383E000B2599 /* NSDate+Extension.swift */; }; 50A9D4571ACD393A000B2599 /* YepWaverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A9D4541ACD393A000B2599 /* YepWaverView.swift */; }; + 50AACEC81BB54128004DD54B /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AACEC71BB54128004DD54B /* FeedView.swift */; settings = {ASSET_TAGS = (); }; }; + 50AACECD1BB5419A004DD54B /* FeedView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50AACECC1BB5419A004DD54B /* FeedView.xib */; settings = {ASSET_TAGS = (); }; }; 50AFBF461BB25F40007D19DA /* ActivityIndicatorTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF451BB25F40007D19DA /* ActivityIndicatorTitleView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF491BB2830E007D19DA /* EdgeBorderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; settings = {ASSET_TAGS = (); }; }; @@ -458,6 +460,8 @@ 50A9D44C1ACD382B000B2599 /* NSDateTimeAgo.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; name = NSDateTimeAgo.bundle; path = Extensions/NSDateTimeAgo.bundle; sourceTree = ""; }; 50A9D4501ACD383E000B2599 /* NSDate+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "NSDate+Extension.swift"; path = "Extensions/NSDate+Extension.swift"; sourceTree = ""; }; 50A9D4541ACD393A000B2599 /* YepWaverView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepWaverView.swift; path = Views/AudioWaves/YepWaverView.swift; sourceTree = ""; }; + 50AACEC71BB54128004DD54B /* FeedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedView.swift; path = Views/Feed/FeedView.swift; sourceTree = ""; }; + 50AACECC1BB5419A004DD54B /* FeedView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedView.xib; path = Views/Feed/FeedView.xib; sourceTree = ""; }; 50AFBF451BB25F40007D19DA /* ActivityIndicatorTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ActivityIndicatorTitleView.swift; path = Views/TitleViews/ActivityIndicatorTitleView.swift; sourceTree = ""; }; 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EdgeBorderButton.swift; path = Views/Buttons/EdgeBorderButton.swift; sourceTree = ""; }; 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; @@ -884,6 +888,7 @@ 8409137E1B7DB178001C89D6 /* FriendRequest */, 50AFBF471BB25F81007D19DA /* TitleViews */, 50AFBF4C1BB2A453007D19DA /* InfoView */, + 50AACEC91BB54132004DD54B /* Feed */, ); name = Views; sourceTree = ""; @@ -1507,6 +1512,15 @@ name = AudioWaves; sourceTree = ""; }; + 50AACEC91BB54132004DD54B /* Feed */ = { + isa = PBXGroup; + children = ( + 50AACEC71BB54128004DD54B /* FeedView.swift */, + 50AACECC1BB5419A004DD54B /* FeedView.xib */, + ); + name = Feed; + sourceTree = ""; + }; 50AFBF471BB25F81007D19DA /* TitleViews */ = { isa = PBXGroup; children = ( @@ -1860,6 +1874,7 @@ files = ( 5023DE381AB6979600B3EE96 /* ConversationCell.xib in Resources */, 505C338B1BAA92CA00E044E2 /* InfoPlist.strings in Resources */, + 50AACECD1BB5419A004DD54B /* FeedView.xib in Resources */, 50C090A11ADE391600CC6389 /* AddSkillsReusableView.xib in Resources */, 504F415B1AD5028200FBB19A /* SkillCell.xib in Resources */, 50E348931B9063A700A8E699 /* AboutCell.xib in Resources */, @@ -2074,6 +2089,7 @@ 84385C4A1B85BE200071130D /* ShowStepMeetViewController.swift in Sources */, 5023DE2D1AB685ED00B3EE96 /* DiscoverViewController.swift in Sources */, 0A1CAC701AFA481600826B45 /* SkillHomeHeaderView.swift in Sources */, + 50AACEC81BB54128004DD54B /* FeedView.swift in Sources */, 0AB8F79A1B15D1DC00F4AF09 /* YepNavigationController.swift in Sources */, 502AE53A1AB871C1005BD199 /* YepAlert.swift in Sources */, 5039594E1B05E6E000797A3E /* ProfileSocialAccountGithubCell.swift in Sources */, diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 15ff25d3..228e2128 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -120,7 +120,9 @@ class ConversationViewController: BaseViewController { }() var samplesCount = 0 let samplingInterval = 6 - + + var feedView: FeedView? + @IBOutlet weak var conversationCollectionView: UICollectionView! let conversationCollectionViewContentInsetYOffset: CGFloat = 10 @@ -337,6 +339,9 @@ class ConversationViewController: BaseViewController { if isFirstAppear { + // test + makeFeedView() + // 为记录草稿准备 messageToolbar.conversation = conversation @@ -1024,6 +1029,27 @@ class ConversationViewController: BaseViewController { } } + private func makeFeedView() { + + let feedView = FeedView.instanceFromNib() + feedView.backgroundColor = UIColor.orangeColor() + feedView.translatesAutoresizingMaskIntoConstraints = false + + view.addSubview(feedView) + + let views = [ + "feedView": feedView + ] + + let constraintsH = NSLayoutConstraint.constraintsWithVisualFormat("H:|[feedView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) + let constraintsV = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[feedView(==height)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: ["height": FeedView.normalHeight], views: views) + + NSLayoutConstraint.activateConstraints(constraintsH) + NSLayoutConstraint.activateConstraints(constraintsV) + + self.feedView = feedView + } + // MARK: Private private func setConversaitonCollectionViewContentInsetBottom(bottom: CGFloat) { @@ -1034,7 +1060,9 @@ class ConversationViewController: BaseViewController { private func setConversaitonCollectionViewOriginalContentInset() { - conversationCollectionView.contentInset.top = 64 + conversationCollectionViewContentInsetYOffset + let feedViewHeight: CGFloat = (feedView == nil) ? 0 : FeedView.normalHeight + + conversationCollectionView.contentInset.top = 64 + feedViewHeight + conversationCollectionViewContentInsetYOffset setConversaitonCollectionViewContentInsetBottom(CGRectGetHeight(messageToolbar.bounds) + sectionInsetBottom) } diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index 6b363862..4019278f 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -15,11 +15,12 @@ class FeedCell: UICollectionViewCell { @IBOutlet weak var distanceLabel: UILabel! @IBOutlet weak var messageLabel: UILabel! - @IBOutlet weak var messageLabelTopConstraint: NSLayoutConstraint! @IBOutlet weak var mediaCollectionView: UICollectionView! @IBOutlet weak var timeLabel: UILabel! + @IBOutlet weak var timeLabelTopConstraint: NSLayoutConstraint! + @IBOutlet weak var messageCountLabel: UILabel! static let messageLabelMaxWidth: CGFloat = { @@ -50,7 +51,7 @@ class FeedCell: UICollectionViewCell { messageLabel.text = feed.message let hasMedia = feed.mediaCount > 0 - messageLabelTopConstraint.constant = hasMedia ? 100 : 10 + timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true } } diff --git a/Yep/Views/Cells/Feed/FeedCell.xib b/Yep/Views/Cells/Feed/FeedCell.xib index d555c402..aeff822d 100644 --- a/Yep/Views/Cells/Feed/FeedCell.xib +++ b/Yep/Views/Cells/Feed/FeedCell.xib @@ -96,9 +96,9 @@ - + diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index bb29f372..5e9fa5b7 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -10,6 +10,12 @@ import UIKit class FeedView: UIView { + static let normalHeight: CGFloat = 200 + + class func instanceFromNib() -> FeedView { + return UINib(nibName: "FeedView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! FeedView + } + @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var distanceLabel: UILabel! From 8998637f163acdbf0821223b1ca74d19b0a1e616 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 25 Sep 2015 22:03:00 +0800 Subject: [PATCH 10/58] foldProgress --- .../ConversationViewController.swift | 28 ++++++++++++++++-- Yep/Views/Feed/FeedView.swift | 29 +++++++++++++++++++ Yep/Views/Feed/FeedView.xib | 4 ++- 3 files changed, 58 insertions(+), 3 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 228e2128..a2fd54af 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -122,6 +122,7 @@ class ConversationViewController: BaseViewController { let samplingInterval = 6 var feedView: FeedView? + var dragBeginLocation: CGPoint? @IBOutlet weak var conversationCollectionView: UICollectionView! let conversationCollectionViewContentInsetYOffset: CGFloat = 10 @@ -1042,10 +1043,16 @@ class ConversationViewController: BaseViewController { ] let constraintsH = NSLayoutConstraint.constraintsWithVisualFormat("H:|[feedView]|", options: NSLayoutFormatOptions(rawValue: 0), metrics: nil, views: views) - let constraintsV = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[feedView(==height)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: ["height": FeedView.normalHeight], views: views) + //let constraintsV = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[feedView(==height)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: ["height": FeedView.normalHeight], views: views) + + let top = NSLayoutConstraint(item: feedView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 64) + let height = NSLayoutConstraint(item: feedView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: FeedView.normalHeight) NSLayoutConstraint.activateConstraints(constraintsH) - NSLayoutConstraint.activateConstraints(constraintsV) + //NSLayoutConstraint.activateConstraints(constraintsV) + NSLayoutConstraint.activateConstraints([top, height]) + + feedView.heightConstraint = height self.feedView = feedView } @@ -2491,9 +2498,26 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi // MARK: UIScrollViewDelegate + func scrollViewWillBeginDragging(scrollView: UIScrollView) { + + let location = scrollView.panGestureRecognizer.locationInView(view) + dragBeginLocation = location + } + func scrollViewDidScroll(scrollView: UIScrollView) { pullToRefreshView.scrollViewDidScroll(scrollView) + + if let dragBeginLocation = dragBeginLocation { + let location = scrollView.panGestureRecognizer.locationInView(view) + let deltaY = location.y - dragBeginLocation.y + println(deltaY) + + let fullDeltaHeight = FeedView.normalHeight - FeedView.foldHeight + let currentHeight = max(min(FeedView.normalHeight + deltaY, FeedView.normalHeight), FeedView.foldHeight) + //feedView?.frame.size.height = currentHeight + feedView?.foldProgress = (FeedView.normalHeight - currentHeight) / fullDeltaHeight + } } func scrollViewWillEndDragging(scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 5e9fa5b7..856a67df 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -11,16 +11,42 @@ import UIKit class FeedView: UIView { static let normalHeight: CGFloat = 200 + static let foldHeight: CGFloat = 60 + + weak var heightConstraint: NSLayoutConstraint? class func instanceFromNib() -> FeedView { return UINib(nibName: "FeedView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as! FeedView } + var foldProgress: CGFloat = 0 { + willSet { + println(newValue) + if newValue >= 0 && newValue <= 1 { + nicknameLabelCenterYConstraint.constant = -10 * newValue + messageLabelTopConstraint.constant = -25 * newValue + 4 + + heightConstraint?.constant = FeedView.foldHeight + (FeedView.normalHeight - FeedView.foldHeight) * (1 - newValue) + + layoutIfNeeded() + + let foldingAlpha = (1 - newValue) + distanceLabel.alpha = foldingAlpha + mediaCollectionView.alpha = foldingAlpha + timeLabel.alpha = foldingAlpha + messageCountLabel.alpha = foldingAlpha + messageCountImageView.alpha = foldingAlpha + } + } + } + @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var nicknameLabel: UILabel! + @IBOutlet weak var nicknameLabelCenterYConstraint: NSLayoutConstraint! @IBOutlet weak var distanceLabel: UILabel! @IBOutlet weak var messageLabel: UILabel! + @IBOutlet weak var messageLabelTopConstraint: NSLayoutConstraint! @IBOutlet weak var mediaCollectionView: UICollectionView! @@ -28,10 +54,13 @@ class FeedView: UIView { @IBOutlet weak var timeLabelTopConstraint: NSLayoutConstraint! @IBOutlet weak var messageCountLabel: UILabel! + @IBOutlet weak var messageCountImageView: UIImageView! override func awakeFromNib() { super.awakeFromNib() + clipsToBounds = true + avatarImageView.backgroundColor = UIColor.redColor() nicknameLabel.backgroundColor = UIColor.redColor() distanceLabel.backgroundColor = UIColor.redColor() diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib index 3c5054fa..60aca2cb 100644 --- a/Yep/Views/Feed/FeedView.xib +++ b/Yep/Views/Feed/FeedView.xib @@ -15,7 +15,6 @@ - @@ -92,9 +91,12 @@ + + + From 4d0752e5a48323b088c5a6779c4162ada7c98088 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 12:17:52 +0800 Subject: [PATCH 11/58] configureWithFeed; new fold animation --- .../ConversationViewController.swift | 20 ++++++-- .../Feeds/FeedsViewController.swift | 9 ++-- Yep/Views/Cells/Feed/FeedCell.swift | 2 +- Yep/Views/Feed/FeedView.swift | 50 +++++++++++++++---- Yep/Views/Feed/FeedView.xib | 16 +++--- 5 files changed, 70 insertions(+), 27 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index a2fd54af..0f64bfe0 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -341,7 +341,8 @@ class ConversationViewController: BaseViewController { if isFirstAppear { // test - makeFeedView() + let feed = FakeFeed(mediaCount: 2, message: "My name is NIX.\nHow are you?\nWhould you like to go to China buy iPhone?") + makeFeedViewWithFeed(feed) // 为记录草稿准备 @@ -1030,9 +1031,12 @@ class ConversationViewController: BaseViewController { } } - private func makeFeedView() { + private func makeFeedViewWithFeed(feed: FakeFeed) { let feedView = FeedView.instanceFromNib() + + feedView.configureWithFeed(feed) + feedView.backgroundColor = UIColor.orangeColor() feedView.translatesAutoresizingMaskIntoConstraints = false @@ -1046,7 +1050,7 @@ class ConversationViewController: BaseViewController { //let constraintsV = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[feedView(==height)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: ["height": FeedView.normalHeight], views: views) let top = NSLayoutConstraint(item: feedView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 64) - let height = NSLayoutConstraint(item: feedView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: FeedView.normalHeight) + let height = NSLayoutConstraint(item: feedView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: FeedView.normalHeightOfFeed(feed)) NSLayoutConstraint.activateConstraints(constraintsH) //NSLayoutConstraint.activateConstraints(constraintsV) @@ -2513,10 +2517,20 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi let deltaY = location.y - dragBeginLocation.y println(deltaY) + if deltaY < -30 { + if let feedView = feedView { + if feedView.foldProgress != 1.0 { + feedView.foldProgress = 1.0 + } + } + } + + /* let fullDeltaHeight = FeedView.normalHeight - FeedView.foldHeight let currentHeight = max(min(FeedView.normalHeight + deltaY, FeedView.normalHeight), FeedView.foldHeight) //feedView?.frame.size.height = currentHeight feedView?.foldProgress = (FeedView.normalHeight - currentHeight) / fullDeltaHeight + */ } } diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 8dfa21fc..a802ed0b 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -8,6 +8,11 @@ import UIKit +struct FakeFeed { + let mediaCount: Int + let message: String +} + class FeedsViewController: UIViewController { @IBOutlet weak var feedsCollectionView: UICollectionView! @@ -18,10 +23,6 @@ class FeedsViewController: UIViewController { let feedCellID = "FeedCell" - struct FakeFeed { - let mediaCount: Int - let message: String - } let fakeFeeds: [FakeFeed] = [ FakeFeed(mediaCount: 1, message: "My name is NIX."), FakeFeed(mediaCount: 0, message: "My name is NIX.\nHow are you?"), diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index 4019278f..a0b929a9 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -47,7 +47,7 @@ class FeedCell: UICollectionViewCell { mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") } - func configureWithFeed(feed: FeedsViewController.FakeFeed) { + func configureWithFeed(feed: FakeFeed) { messageLabel.text = feed.message let hasMedia = feed.mediaCount > 0 diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 856a67df..b3c3c387 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -21,21 +21,27 @@ class FeedView: UIView { var foldProgress: CGFloat = 0 { willSet { - println(newValue) if newValue >= 0 && newValue <= 1 { - nicknameLabelCenterYConstraint.constant = -10 * newValue - messageLabelTopConstraint.constant = -25 * newValue + 4 - heightConstraint?.constant = FeedView.foldHeight + (FeedView.normalHeight - FeedView.foldHeight) * (1 - newValue) + UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.8, options: UIViewAnimationOptions(rawValue: 0), animations: { [weak self] in - layoutIfNeeded() + self?.nicknameLabelCenterYConstraint.constant = -10 * newValue + self?.messageLabelTopConstraint.constant = -25 * newValue + 4 - let foldingAlpha = (1 - newValue) - distanceLabel.alpha = foldingAlpha - mediaCollectionView.alpha = foldingAlpha - timeLabel.alpha = foldingAlpha - messageCountLabel.alpha = foldingAlpha - messageCountImageView.alpha = foldingAlpha + self?.heightConstraint?.constant = FeedView.foldHeight + (FeedView.normalHeight - FeedView.foldHeight) * (1 - newValue) + + self?.layoutIfNeeded() + + self?.messageLabel.numberOfLines = 1 + + let foldingAlpha = (1 - newValue) + self?.distanceLabel.alpha = foldingAlpha + self?.mediaCollectionView.alpha = foldingAlpha + self?.timeLabel.alpha = foldingAlpha + self?.messageCountLabel.alpha = foldingAlpha + self?.messageCountImageView.alpha = foldingAlpha + + }, completion: nil) } } } @@ -76,5 +82,27 @@ class FeedView: UIView { //mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") } + + class func normalHeightOfFeed(feed: FakeFeed) -> CGFloat { + + let rect = feed.message.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) + + let height: CGFloat + if feed.mediaCount > 0 { + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 + } else { + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 20.5 + 10 + } + + return ceil(height) + } + + func configureWithFeed(feed: FakeFeed) { + messageLabel.text = feed.message + + let hasMedia = feed.mediaCount > 0 + timeLabelTopConstraint.constant = hasMedia ? 100 : 10 + mediaCollectionView.hidden = hasMedia ? false : true + } } diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib index 60aca2cb..3d5296b6 100644 --- a/Yep/Views/Feed/FeedView.xib +++ b/Yep/Views/Feed/FeedView.xib @@ -9,7 +9,7 @@ - + @@ -30,14 +30,14 @@ - From 2907759790b0f4ca910816004006cfabe8edfaa1 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 12:37:21 +0800 Subject: [PATCH 12/58] handle conversationCollectionView.contentInset.top when fold --- .../ConversationViewController.swift | 9 ++++---- Yep/Views/Feed/FeedView.swift | 23 +++++++++++++++---- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 0f64bfe0..128b3907 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1035,7 +1035,7 @@ class ConversationViewController: BaseViewController { let feedView = FeedView.instanceFromNib() - feedView.configureWithFeed(feed) + feedView.feed = feed feedView.backgroundColor = UIColor.orangeColor() feedView.translatesAutoresizingMaskIntoConstraints = false @@ -1050,7 +1050,7 @@ class ConversationViewController: BaseViewController { //let constraintsV = NSLayoutConstraint.constraintsWithVisualFormat("V:|-64-[feedView(==height)]", options: NSLayoutFormatOptions(rawValue: 0), metrics: ["height": FeedView.normalHeight], views: views) let top = NSLayoutConstraint(item: feedView, attribute: .Top, relatedBy: .Equal, toItem: view, attribute: .Top, multiplier: 1.0, constant: 64) - let height = NSLayoutConstraint(item: feedView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: FeedView.normalHeightOfFeed(feed)) + let height = NSLayoutConstraint(item: feedView, attribute: .Height, relatedBy: .Equal, toItem: nil, attribute: .NotAnAttribute, multiplier: 1.0, constant: feedView.normalHeight) NSLayoutConstraint.activateConstraints(constraintsH) //NSLayoutConstraint.activateConstraints(constraintsV) @@ -1071,8 +1071,7 @@ class ConversationViewController: BaseViewController { private func setConversaitonCollectionViewOriginalContentInset() { - let feedViewHeight: CGFloat = (feedView == nil) ? 0 : FeedView.normalHeight - + let feedViewHeight: CGFloat = (feedView == nil) ? 0 : feedView!.normalHeight conversationCollectionView.contentInset.top = 64 + feedViewHeight + conversationCollectionViewContentInsetYOffset setConversaitonCollectionViewContentInsetBottom(CGRectGetHeight(messageToolbar.bounds) + sectionInsetBottom) @@ -2521,6 +2520,8 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi if let feedView = feedView { if feedView.foldProgress != 1.0 { feedView.foldProgress = 1.0 + + conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset } } } diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index b3c3c387..a2c95d23 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -10,7 +10,14 @@ import UIKit class FeedView: UIView { - static let normalHeight: CGFloat = 200 + var feed: FakeFeed? { + willSet { + if let feed = newValue { + configureWithFeed(feed) + } + } + } + static let foldHeight: CGFloat = 60 weak var heightConstraint: NSLayoutConstraint? @@ -23,12 +30,14 @@ class FeedView: UIView { willSet { if newValue >= 0 && newValue <= 1 { - UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.6, initialSpringVelocity: 0.8, options: UIViewAnimationOptions(rawValue: 0), animations: { [weak self] in + let normalHeight = self.normalHeight + + UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.0, options: UIViewAnimationOptions(rawValue: 0), animations: { [weak self] in self?.nicknameLabelCenterYConstraint.constant = -10 * newValue self?.messageLabelTopConstraint.constant = -25 * newValue + 4 - self?.heightConstraint?.constant = FeedView.foldHeight + (FeedView.normalHeight - FeedView.foldHeight) * (1 - newValue) + self?.heightConstraint?.constant = FeedView.foldHeight + (normalHeight - FeedView.foldHeight) * (1 - newValue) self?.layoutIfNeeded() @@ -83,7 +92,11 @@ class FeedView: UIView { //mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") } - class func normalHeightOfFeed(feed: FakeFeed) -> CGFloat { + var normalHeight: CGFloat { + + guard let feed = feed else { + return 220 + } let rect = feed.message.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) @@ -97,7 +110,7 @@ class FeedView: UIView { return ceil(height) } - func configureWithFeed(feed: FakeFeed) { + private func configureWithFeed(feed: FakeFeed) { messageLabel.text = feed.message let hasMedia = feed.mediaCount > 0 From 7d0a7a34320bf1350f857bd7140d0491c470a1f1 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 12:51:00 +0800 Subject: [PATCH 13/58] fold logic for miniAvatarsView --- .../ConversationViewController.swift | 2 +- Yep/Views/Feed/FeedView.swift | 8 +++++++ Yep/Views/Feed/FeedView.xib | 22 ++++++++++++++----- 3 files changed, 26 insertions(+), 6 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 128b3907..d73e0200 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -341,7 +341,7 @@ class ConversationViewController: BaseViewController { if isFirstAppear { // test - let feed = FakeFeed(mediaCount: 2, message: "My name is NIX.\nHow are you?\nWhould you like to go to China buy iPhone?") + let feed = FakeFeed(mediaCount: 2, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") makeFeedViewWithFeed(feed) // 为记录草稿准备 diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index a2c95d23..8e093d4c 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -36,6 +36,7 @@ class FeedView: UIView { self?.nicknameLabelCenterYConstraint.constant = -10 * newValue self?.messageLabelTopConstraint.constant = -25 * newValue + 4 + self?.messageLabelTrailingConstraint.constant = -(40 + 10) self?.heightConstraint?.constant = FeedView.foldHeight + (normalHeight - FeedView.foldHeight) * (1 - newValue) @@ -50,6 +51,8 @@ class FeedView: UIView { self?.messageCountLabel.alpha = foldingAlpha self?.messageCountImageView.alpha = foldingAlpha + self?.miniAvatarsView.alpha = newValue + }, completion: nil) } } @@ -60,8 +63,11 @@ class FeedView: UIView { @IBOutlet weak var nicknameLabelCenterYConstraint: NSLayoutConstraint! @IBOutlet weak var distanceLabel: UILabel! + @IBOutlet weak var miniAvatarsView: UIView! + @IBOutlet weak var messageLabel: UILabel! @IBOutlet weak var messageLabelTopConstraint: NSLayoutConstraint! + @IBOutlet weak var messageLabelTrailingConstraint: NSLayoutConstraint! @IBOutlet weak var mediaCollectionView: UICollectionView! @@ -86,6 +92,8 @@ class FeedView: UIView { messageLabel.font = UIFont.feedMessageFont() + miniAvatarsView.alpha = 0 + //mediaCollectionView.dataSource = self //mediaCollectionView.delegate = self diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib index 3d5296b6..a5545f6e 100644 --- a/Yep/Views/Feed/FeedView.xib +++ b/Yep/Views/Feed/FeedView.xib @@ -31,13 +31,13 @@ - + @@ -49,20 +49,28 @@ - + + + + + + + + + @@ -76,7 +84,9 @@ + + @@ -95,6 +105,8 @@ + + From c5f572dba2b6c561992be207e10c88b9221d59ed Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 13:09:28 +0800 Subject: [PATCH 14/58] refactor tryFoldFeedView; do it when .BeginTextInput, .MoreMessages --- .../ConversationViewController.swift | 29 ++++++++++++++----- Yep/Views/Feed/FeedView.swift | 8 ++--- Yep/Views/Feed/FeedView.xib | 2 +- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index d73e0200..a4c3f659 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -400,6 +400,13 @@ class ConversationViewController: BaseViewController { } } } + + switch currentState { + case .BeginTextInput, .MoreMessages: + self?.tryFoldFeedView() + default: + break + } } } @@ -1252,6 +1259,20 @@ class ConversationViewController: BaseViewController { } } + private func tryFoldFeedView() { + + guard let feedView = feedView else { + return + } + + if feedView.foldProgress != 1.0 { + + feedView.foldProgress = 1.0 + + conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset + } + } + // MARK: Actions func tapToCollapseMessageToolBar(sender: UITapGestureRecognizer) { @@ -2517,13 +2538,7 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi println(deltaY) if deltaY < -30 { - if let feedView = feedView { - if feedView.foldProgress != 1.0 { - feedView.foldProgress = 1.0 - - conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset - } - } + tryFoldFeedView() } /* diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 8e093d4c..64616353 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -32,7 +32,7 @@ class FeedView: UIView { let normalHeight = self.normalHeight - UIView.animateWithDuration(0.5, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.0, options: UIViewAnimationOptions(rawValue: 0), animations: { [weak self] in + UIView.animateWithDuration(0.3, delay: 0, usingSpringWithDamping: 0.75, initialSpringVelocity: 0.0, options: UIViewAnimationOptions(rawValue: 0), animations: { [weak self] in self?.nicknameLabelCenterYConstraint.constant = -10 * newValue self?.messageLabelTopConstraint.constant = -25 * newValue + 4 @@ -51,7 +51,7 @@ class FeedView: UIView { self?.messageCountLabel.alpha = foldingAlpha self?.messageCountImageView.alpha = foldingAlpha - self?.miniAvatarsView.alpha = newValue + self?.miniMediasView.alpha = newValue }, completion: nil) } @@ -63,7 +63,7 @@ class FeedView: UIView { @IBOutlet weak var nicknameLabelCenterYConstraint: NSLayoutConstraint! @IBOutlet weak var distanceLabel: UILabel! - @IBOutlet weak var miniAvatarsView: UIView! + @IBOutlet weak var miniMediasView: UIView! @IBOutlet weak var messageLabel: UILabel! @IBOutlet weak var messageLabelTopConstraint: NSLayoutConstraint! @@ -92,7 +92,7 @@ class FeedView: UIView { messageLabel.font = UIFont.feedMessageFont() - miniAvatarsView.alpha = 0 + miniMediasView.alpha = 0 //mediaCollectionView.dataSource = self //mediaCollectionView.delegate = self diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib index a5545f6e..7405c8da 100644 --- a/Yep/Views/Feed/FeedView.xib +++ b/Yep/Views/Feed/FeedView.xib @@ -106,7 +106,7 @@ - + From 54385f7b91acf06d59808ccc976fe16350572c23 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 14:28:57 +0800 Subject: [PATCH 15/58] use foldAction --- .../Conversation/ConversationViewController.swift | 6 ++++-- Yep/Views/Feed/FeedView.swift | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index a4c3f659..a745a950 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1044,6 +1044,10 @@ class ConversationViewController: BaseViewController { feedView.feed = feed + feedView.foldAction = { [weak self] in + self?.conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset + } + feedView.backgroundColor = UIColor.orangeColor() feedView.translatesAutoresizingMaskIntoConstraints = false @@ -1268,8 +1272,6 @@ class ConversationViewController: BaseViewController { if feedView.foldProgress != 1.0 { feedView.foldProgress = 1.0 - - conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset } } diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 64616353..a7f7ca16 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -54,10 +54,16 @@ class FeedView: UIView { self?.miniMediasView.alpha = newValue }, completion: nil) + + if newValue == 1.0 { + foldAction?() + } } } } + var foldAction: (() -> Void)? + @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var nicknameLabel: UILabel! @IBOutlet weak var nicknameLabelCenterYConstraint: NSLayoutConstraint! From 973c241d46698959a99e24ec242b3d6f43c71168 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 14:37:08 +0800 Subject: [PATCH 16/58] unfoldAction; unfold logic --- .../ConversationViewController.swift | 4 +++ Yep/Views/Feed/FeedView.swift | 25 ++++++++++++++++--- 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index a745a950..0828a8f8 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1048,6 +1048,10 @@ class ConversationViewController: BaseViewController { self?.conversationCollectionView.contentInset.top = 64 + FeedView.foldHeight + conversationCollectionViewContentInsetYOffset } + feedView.unfoldAction = { [weak self] feedView in + self?.conversationCollectionView.contentInset.top = 64 + feedView.normalHeight + conversationCollectionViewContentInsetYOffset + } + feedView.backgroundColor = UIColor.orangeColor() feedView.translatesAutoresizingMaskIntoConstraints = false diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index a7f7ca16..72d28595 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -36,14 +36,21 @@ class FeedView: UIView { self?.nicknameLabelCenterYConstraint.constant = -10 * newValue self?.messageLabelTopConstraint.constant = -25 * newValue + 4 - self?.messageLabelTrailingConstraint.constant = -(40 + 10) + + if newValue == 1.0 { + self?.messageLabelTrailingConstraint.constant = -(40 + 10) + self?.messageLabel.numberOfLines = 1 + } + + if newValue == 0.0 { + self?.messageLabelTrailingConstraint.constant = 0 + self?.messageLabel.numberOfLines = 0 + } self?.heightConstraint?.constant = FeedView.foldHeight + (normalHeight - FeedView.foldHeight) * (1 - newValue) self?.layoutIfNeeded() - self?.messageLabel.numberOfLines = 1 - let foldingAlpha = (1 - newValue) self?.distanceLabel.alpha = foldingAlpha self?.mediaCollectionView.alpha = foldingAlpha @@ -58,11 +65,16 @@ class FeedView: UIView { if newValue == 1.0 { foldAction?() } + + if newValue == 0.0 { + unfoldAction?(self) + } } } } var foldAction: (() -> Void)? + var unfoldAction: (FeedView -> Void)? @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var nicknameLabel: UILabel! @@ -104,6 +116,13 @@ class FeedView: UIView { //mediaCollectionView.delegate = self //mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") + + let tap = UITapGestureRecognizer(target: self, action: "unfold:") + miniMediasView.addGestureRecognizer(tap) + } + + func unfold(sender: UITapGestureRecognizer) { + foldProgress = 0 } var normalHeight: CGFloat { From 1359325d1154d7736a26e96b219a5cd59aacb470 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 15:58:10 +0800 Subject: [PATCH 17/58] add feed for ConversationViewController detect; push from FeedsViewController --- Yep/Base.lproj/Main.storyboard | 5 +++-- .../Conversation/ConversationViewController.swift | 7 +++++-- .../Feeds/FeedsViewController.swift | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index 2410b966..a2594491 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1601,11 +1601,12 @@ + - + @@ -2048,7 +2049,7 @@ - + diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 0828a8f8..c522ea52 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -20,6 +20,8 @@ struct MessageNotification { class ConversationViewController: BaseViewController { + var feed: FakeFeed? + var conversation: Conversation! var realm: Realm! @@ -341,8 +343,9 @@ class ConversationViewController: BaseViewController { if isFirstAppear { // test - let feed = FakeFeed(mediaCount: 2, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") - makeFeedViewWithFeed(feed) + if let feed = feed { + makeFeedViewWithFeed(feed) + } // 为记录草稿准备 diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index a802ed0b..06096e67 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -7,6 +7,7 @@ // import UIKit +import RealmSwift struct FakeFeed { let mediaCount: Int @@ -58,6 +59,15 @@ class FeedsViewController: UIViewController { // MARK: - Navigation override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + + if segue.identifier == "showConversation" { + + let vc = segue.destinationViewController as! ConversationViewController + let realm = try! Realm() + vc.conversation = realm.objects(Conversation).sorted("updatedUnixTime", ascending: false).first + let feed = FakeFeed(mediaCount: 2, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") + vc.feed = feed + } } } @@ -93,5 +103,10 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) } + + func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + + performSegueWithIdentifier("showConversation", sender: nil) + } } From a9eefecae31f687de6d3271bd09baf0fcc482d5e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 16:19:19 +0800 Subject: [PATCH 18/58] feed select highlight effect --- Yep/Base.lproj/Main.storyboard | 2 +- Yep/ViewControllers/Feeds/FeedsViewController.swift | 12 ++++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index a2594491..9adbd11f 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1575,7 +1575,7 @@ - + diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 06096e67..78f1e8c0 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -108,5 +108,17 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg performSegueWithIdentifier("showConversation", sender: nil) } + + func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) { + + let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FeedCell + cell.contentView.backgroundColor = UIColor.lightGrayColor() + } + + func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) { + + let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FeedCell + cell.contentView.backgroundColor = UIColor.clearColor() + } } From f78501d2aff4be241adb29edb3e7563e31754bf3 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Mon, 28 Sep 2015 17:03:14 +0800 Subject: [PATCH 19/58] add FeedMediaView --- Yep.xcodeproj/project.pbxproj | 4 + .../Feeds/FeedsViewController.swift | 2 +- Yep/Views/Feed/FeedMediaView.swift | 111 ++++++++++++++++++ Yep/Views/Feed/FeedView.swift | 14 ++- Yep/Views/Feed/FeedView.xib | 4 +- 5 files changed, 128 insertions(+), 7 deletions(-) create mode 100644 Yep/Views/Feed/FeedMediaView.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index b5b4cbd6..a8913f23 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -195,6 +195,7 @@ 50A9D4571ACD393A000B2599 /* YepWaverView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50A9D4541ACD393A000B2599 /* YepWaverView.swift */; }; 50AACEC81BB54128004DD54B /* FeedView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AACEC71BB54128004DD54B /* FeedView.swift */; settings = {ASSET_TAGS = (); }; }; 50AACECD1BB5419A004DD54B /* FeedView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50AACECC1BB5419A004DD54B /* FeedView.xib */; settings = {ASSET_TAGS = (); }; }; + 50AACECF1BB93336004DD54B /* FeedMediaView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AACECE1BB93336004DD54B /* FeedMediaView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF461BB25F40007D19DA /* ActivityIndicatorTitleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF451BB25F40007D19DA /* ActivityIndicatorTitleView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF491BB2830E007D19DA /* EdgeBorderButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; settings = {ASSET_TAGS = (); }; }; @@ -462,6 +463,7 @@ 50A9D4541ACD393A000B2599 /* YepWaverView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepWaverView.swift; path = Views/AudioWaves/YepWaverView.swift; sourceTree = ""; }; 50AACEC71BB54128004DD54B /* FeedView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedView.swift; path = Views/Feed/FeedView.swift; sourceTree = ""; }; 50AACECC1BB5419A004DD54B /* FeedView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedView.xib; path = Views/Feed/FeedView.xib; sourceTree = ""; }; + 50AACECE1BB93336004DD54B /* FeedMediaView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedMediaView.swift; path = Views/Feed/FeedMediaView.swift; sourceTree = ""; }; 50AFBF451BB25F40007D19DA /* ActivityIndicatorTitleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ActivityIndicatorTitleView.swift; path = Views/TitleViews/ActivityIndicatorTitleView.swift; sourceTree = ""; }; 50AFBF481BB2830E007D19DA /* EdgeBorderButton.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = EdgeBorderButton.swift; path = Views/Buttons/EdgeBorderButton.swift; sourceTree = ""; }; 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; @@ -1517,6 +1519,7 @@ children = ( 50AACEC71BB54128004DD54B /* FeedView.swift */, 50AACECC1BB5419A004DD54B /* FeedView.xib */, + 50AACECE1BB93336004DD54B /* FeedMediaView.swift */, ); name = Feed; sourceTree = ""; @@ -2042,6 +2045,7 @@ 508D174C1ACCF49B0092D666 /* ChatRightAudioCell.swift in Sources */, 502AE53D1AB87C0D005BD199 /* YepUserDefaults.swift in Sources */, 50EB8CC41AE89F12001AC1EE /* ChatRightVideoCell.swift in Sources */, + 50AACECF1BB93336004DD54B /* FeedMediaView.swift in Sources */, 50D4D0DB1AFA825B005AEB6F /* MediaControlView.swift in Sources */, 0A9018821B0120A500AE4B7F /* OAuthViewController.swift in Sources */, 508D17471ACCF4710092D666 /* ChatLeftAudioCell.swift in Sources */, diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 78f1e8c0..43670f1c 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -65,7 +65,7 @@ class FeedsViewController: UIViewController { let vc = segue.destinationViewController as! ConversationViewController let realm = try! Realm() vc.conversation = realm.objects(Conversation).sorted("updatedUnixTime", ascending: false).first - let feed = FakeFeed(mediaCount: 2, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") + let feed = FakeFeed(mediaCount: 3, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") vc.feed = feed } } diff --git a/Yep/Views/Feed/FeedMediaView.swift b/Yep/Views/Feed/FeedMediaView.swift new file mode 100644 index 00000000..62d18ef7 --- /dev/null +++ b/Yep/Views/Feed/FeedMediaView.swift @@ -0,0 +1,111 @@ +// +// FeedMediaView.swift +// Yep +// +// Created by nixzhu on 15/9/28. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit +import Kingfisher + +class FeedMediaView: UIView { + + lazy var imageView1: UIImageView = { + let view = UIImageView() + view.contentMode = .ScaleAspectFill + view.clipsToBounds = true + return view + }() + + lazy var imageView2: UIImageView = { + let view = UIImageView() + view.contentMode = .ScaleAspectFill + view.clipsToBounds = true + return view + }() + + lazy var imageView3: UIImageView = { + let view = UIImageView() + view.contentMode = .ScaleAspectFill + view.clipsToBounds = true + return view + }() + + lazy var imageView4: UIImageView = { + let view = UIImageView() + view.contentMode = .ScaleAspectFill + view.clipsToBounds = true + return view + }() + + func setImagesWithURLs(URLs: [NSURL]) { + + let fullRect = bounds + let halfRect = CGRect(x: 0, y: 0, width: fullRect.width * 0.5, height: fullRect.height) + let quarterRect = CGRect(x: 0, y: 0, width: fullRect.width * 0.5, height: fullRect.height * 0.5) + + switch URLs.count { + + case 1: + imageView1.frame = fullRect + imageView1.kf_setImageWithURL(URLs[0]) + + addSubview(imageView1) + + case 2: + imageView1.frame = halfRect + imageView1.center = CGPoint(x: halfRect.width * 0.5, y: imageView1.center.y) + imageView1.kf_setImageWithURL(URLs[0]) + + imageView2.frame = halfRect + imageView2.center = CGPoint(x: halfRect.width * 1.5, y: imageView2.center.y) + imageView2.kf_setImageWithURL(URLs[1]) + + addSubview(imageView1) + addSubview(imageView2) + + case 3: + imageView1.frame = quarterRect + imageView1.kf_setImageWithURL(URLs[0]) + + imageView2.frame = quarterRect + imageView2.center = CGPoint(x: imageView2.center.x, y: quarterRect.height * 1.5) + imageView2.kf_setImageWithURL(URLs[1]) + + imageView3.frame = halfRect + imageView3.center = CGPoint(x: halfRect.width * 1.5, y: imageView3.center.y) + imageView3.kf_setImageWithURL(URLs[2]) + + addSubview(imageView1) + addSubview(imageView2) + addSubview(imageView3) + + case 4.. 0 timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true + + let URLs = (0.. - + @@ -101,12 +101,12 @@ + - From 6986409f2e354e3ccd920eba316c7665bff11170 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 11:58:03 +0800 Subject: [PATCH 20/58] add Feed & Attachment --- Yep/AppDelegate.swift | 2 +- Yep/Realm/Models.swift | 31 +++++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index c1077bfc..65cfc02a 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -40,7 +40,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let directory: NSURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(YepConfig.appGroupID)! let realmPath = directory.URLByAppendingPathComponent("db.realm").path! - return Realm.Configuration(path: realmPath, schemaVersion: 1, migrationBlock: { migration, oldSchemaVersion in + return Realm.Configuration(path: realmPath, schemaVersion: 2, migrationBlock: { migration, oldSchemaVersion in }) } diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 581e464a..45422918 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -391,6 +391,37 @@ class Conversation: Object { } } +// MARK: Feed + +class Attachment: Object { + + enum Kind: String { + case Image = "image" + case Thumbnail = "thumbnail" + case Audio = "audio" + case Video = "video" + } + + dynamic var kind: String = "" + dynamic var metadata: String = "" + dynamic var URLString: String = "" +} + +class Feed: Object { + + dynamic var feedID: String = "" + dynamic var allowComment: Bool = true + + dynamic var createdUnixTime: NSTimeInterval = NSDate().timeIntervalSince1970 + dynamic var updatedUnixTime: NSTimeInterval = NSDate().timeIntervalSince1970 + + dynamic var creator: User? + dynamic var body: String = "" + var attachments = List() + + dynamic var skill: UserSkill? + dynamic var group: Group? +} // MARK: Helpers From a635e9571e06d9fc4df2348b41f41b669fdae25f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 12:07:41 +0800 Subject: [PATCH 21/58] goto STAGING --- Yep.xcodeproj/project.pbxproj | 2 +- Yep/Services/YepNetworking.swift | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index a8913f23..01d89d97 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -2293,7 +2293,7 @@ IPHONEOS_DEPLOYMENT_TARGET = 8.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; - OTHER_SWIFT_FLAGS = "-D DEBUG -D STAGING_"; + OTHER_SWIFT_FLAGS = "-D DEBUG -D STAGING"; SDKROOT = iphoneos; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; }; diff --git a/Yep/Services/YepNetworking.swift b/Yep/Services/YepNetworking.swift index ca07fe13..bc7c6924 100644 --- a/Yep/Services/YepNetworking.swift +++ b/Yep/Services/YepNetworking.swift @@ -102,9 +102,9 @@ var yepNetworkActivityCount = 0 { #if STAGING class SessionDelegate: NSObject, NSURLSessionDelegate { - func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential!) -> Void) { + func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) { - completionHandler(.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust)) + completionHandler(.UseCredential, NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!)) } } From f082716aae20d0eff718e7b0edb329ac84ed455f Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 14:24:35 +0800 Subject: [PATCH 22/58] discoverFeeds --- Yep/Services/YepService.swift | 29 +++++++++++++++++++ .../Feeds/FeedsViewController.swift | 6 ++++ 2 files changed, 35 insertions(+) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index b756f314..1cc437c3 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2062,6 +2062,35 @@ func markAsReadMessage(message: Message ,failureHandler: ((Reason, String?) -> V } } +// MARK: - Feeds + +enum FeedSortStyle: String { + + case Distance = "distance" + case Time = "time" +} + +func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: JSONDictionary -> Void) { + + let requestParameters: JSONDictionary = [ + "sort": sortStyle.rawValue, + "page": pageIndex, + "per_page": perPage, + ] + + let parse: JSONDictionary -> JSONDictionary? = { data in + return data + } + + let resource = authJsonResource(path: "/api/v1/topics/discover", method: .GET, requestParameters: requestParameters, parse: parse) + + if let failureHandler = failureHandler { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: failureHandler, completion: completion) + } else { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: defaultFailureHandler, completion: completion) + } +} + // MARK: - Social Work func authURLRequestWithURL(url: NSURL) -> NSURLRequest { diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 43670f1c..ed159c3f 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -54,6 +54,12 @@ class FeedsViewController: UIViewController { feedsCollectionView.backgroundColor = UIColor.whiteColor() feedsCollectionView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellWithReuseIdentifier: feedCellID) + + discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in + defaultFailureHandler(reason, errorMessage: errorMessage) + }, completion: { data in + println(data) + }) } // MARK: - Navigation From 273783545c4978db09f33c2301e6c74c330b7e63 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 14:37:53 +0800 Subject: [PATCH 23/58] add NewFeedViewController; use storyboard reference --- Yep.xcodeproj/project.pbxproj | 16 +++++++++++ Yep/Base.lproj/Main.storyboard | 16 ++++++++++- .../NewFeed/NewFeed.storyboard | 27 +++++++++++++++++++ .../NewFeed/NewFeedViewController.swift | 18 +++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 Yep/ViewControllers/NewFeed/NewFeed.storyboard create mode 100644 Yep/ViewControllers/NewFeed/NewFeedViewController.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 01d89d97..49c07a9f 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -237,6 +237,8 @@ 50EB8CCE1AEA1B38001AC1EE /* MessageMediaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50EB8CCD1AEA1B38001AC1EE /* MessageMediaViewController.swift */; }; 50F2B9781B2EDF3D00F840CC /* BorderTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F2B9771B2EDF3D00F840CC /* BorderTextField.swift */; }; 50F2B97B1B2EEAF800F840CC /* NavigationTitleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F2B97A1B2EEAF800F840CC /* NavigationTitleLabel.swift */; }; + 50F5AF831BBA67060033C9BC /* NewFeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */; settings = {ASSET_TAGS = (); }; }; + 50F5AF861BBA676D0033C9BC /* NewFeed.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */; settings = {ASSET_TAGS = (); }; }; 50FA9A441B661698009BF2A0 /* UIViewController+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */; }; 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */; settings = {ASSET_TAGS = (); }; }; 6ADDB4501B848C600012877A /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADDB44F1B848C600012877A /* 1Password.xcassets */; }; @@ -505,6 +507,8 @@ 50EB8CCD1AEA1B38001AC1EE /* MessageMediaViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = MessageMediaViewController.swift; path = ViewControllers/MessageMedia/MessageMediaViewController.swift; sourceTree = ""; }; 50F2B9771B2EDF3D00F840CC /* BorderTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = BorderTextField.swift; path = Views/TextFields/BorderTextField.swift; sourceTree = ""; }; 50F2B97A1B2EEAF800F840CC /* NavigationTitleLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NavigationTitleLabel.swift; path = Views/Labels/NavigationTitleLabel.swift; sourceTree = ""; }; + 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NewFeedViewController.swift; path = ViewControllers/NewFeed/NewFeedViewController.swift; sourceTree = ""; }; + 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = NewFeed.storyboard; path = ViewControllers/NewFeed/NewFeed.storyboard; sourceTree = ""; }; 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Yep.swift"; path = "Extensions/UIViewController+Yep.swift"; sourceTree = ""; }; 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepSoundEffect.swift; path = Helpers/YepSoundEffect.swift; sourceTree = ""; }; 6ADDB44F1B848C600012877A /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = 1Password.xcassets; sourceTree = ""; }; @@ -802,6 +806,7 @@ 0AB8F79B1B15D1DF00F4AF09 /* Nav */, 848806B71B7B4F58000C5424 /* Show */, 50AFBF601BB4F33A007D19DA /* Feeds */, + 50F5AF841BBA67140033C9BC /* NewFeed */, ); name = ViewControllers; sourceTree = ""; @@ -1702,6 +1707,15 @@ name = Labels; sourceTree = ""; }; + 50F5AF841BBA67140033C9BC /* NewFeed */ = { + isa = PBXGroup; + children = ( + 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */, + 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */, + ); + name = NewFeed; + sourceTree = ""; + }; 59CC1DE9D59AC08247B97B4F /* Pods */ = { isa = PBXGroup; children = ( @@ -1878,6 +1892,7 @@ 5023DE381AB6979600B3EE96 /* ConversationCell.xib in Resources */, 505C338B1BAA92CA00E044E2 /* InfoPlist.strings in Resources */, 50AACECD1BB5419A004DD54B /* FeedView.xib in Resources */, + 50F5AF861BBA676D0033C9BC /* NewFeed.storyboard in Resources */, 50C090A11ADE391600CC6389 /* AddSkillsReusableView.xib in Resources */, 504F415B1AD5028200FBB19A /* SkillCell.xib in Resources */, 50E348931B9063A700A8E699 /* AboutCell.xib in Resources */, @@ -2171,6 +2186,7 @@ 505EC8171ADF8151001D27E0 /* SkillCategoryCell.swift in Sources */, 50E18BB71B180F7D0076C3C6 /* BottomButtonView.swift in Sources */, 0A90187E1B01152800AE4B7F /* ProfileSocialAccountCell.swift in Sources */, + 50F5AF831BBA67060033C9BC /* NewFeedViewController.swift in Sources */, 50894CF51AEA4A01000981AF /* SettingsUserCell.swift in Sources */, 84385C441B8592120071130D /* ShowStepGeniusViewController.swift in Sources */, 5053AD5A1AF83B4200B3CBFA /* ChatLeftLocationCell.swift in Sources */, diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index 9adbd11f..58f55b89 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1598,7 +1598,13 @@ - + + + + + + + @@ -1608,6 +1614,14 @@ + + + + + + + + diff --git a/Yep/ViewControllers/NewFeed/NewFeed.storyboard b/Yep/ViewControllers/NewFeed/NewFeed.storyboard new file mode 100644 index 00000000..1f4b4504 --- /dev/null +++ b/Yep/ViewControllers/NewFeed/NewFeed.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift new file mode 100644 index 00000000..ee72189c --- /dev/null +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -0,0 +1,18 @@ +// +// NewFeedViewController.swift +// Yep +// +// Created by nixzhu on 15/9/29. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class NewFeedViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + title = NSLocalizedString("New Feed", comment: "") + } +} From eea084c4b190d9c598658d9bae39b2a2c7324a8b Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 14:55:39 +0800 Subject: [PATCH 24/58] basic UI of NewFeedViewController --- .../NewFeed/NewFeed.storyboard | 42 +++++++++++++++++-- .../NewFeed/NewFeedViewController.swift | 21 ++++++++++ 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/Yep/ViewControllers/NewFeed/NewFeed.storyboard b/Yep/ViewControllers/NewFeed/NewFeed.storyboard index 1f4b4504..e5346767 100644 --- a/Yep/ViewControllers/NewFeed/NewFeed.storyboard +++ b/Yep/ViewControllers/NewFeed/NewFeed.storyboard @@ -8,20 +8,56 @@ - + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index ee72189c..1c9404f4 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -10,9 +10,30 @@ import UIKit class NewFeedViewController: UIViewController { + @IBOutlet weak var messageTextView: UITextView! + + @IBOutlet weak var mediaCollectionView: UICollectionView! + + override func viewDidLoad() { super.viewDidLoad() title = NSLocalizedString("New Feed", comment: "") + + let postButton = UIBarButtonItem(title: NSLocalizedString("Post", comment: ""), style: .Plain, target: self, action: "post:") + + navigationItem.rightBarButtonItem = postButton + + messageTextView.text = "What's up?" + + messageTextView.backgroundColor = UIColor.lightGrayColor() + mediaCollectionView.backgroundColor = UIColor.blueColor() + } + + // MARK: Actions + + func post(sender: UIBarButtonItem) { + println("post") } } + From f865ee5e792ed630b1c4fdb1ce2de027eaee83d1 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 15:13:06 +0800 Subject: [PATCH 25/58] createFeed --- Yep/Services/YepService.swift | 35 +++++++++++++++++++ .../NewFeed/NewFeedViewController.swift | 6 ++++ 2 files changed, 41 insertions(+) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 1cc437c3..f0651ab4 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2091,6 +2091,41 @@ func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPag } } +func createFeedWithMessage(message: String, attachments: String?, coordinate: CLLocationCoordinate2D?, skill: Skill?, allowComment: Bool, failureHandler: ((Reason, String?) -> Void)?, completion: JSONDictionary -> Void) { + + var requestParameters: JSONDictionary = [ + "body": message, + "latitude": 0, + "longitude": 0, + "allow_comment": allowComment, + ] + + if let coordinate = coordinate { + requestParameters["latitude"] = coordinate.latitude + requestParameters["longitude"] = coordinate.longitude + } + + if let skill = skill { + requestParameters["skill_id"] = skill.id + } + + if let attachments = attachments { + requestParameters["attachments"] = attachments + } + + let parse: JSONDictionary -> JSONDictionary? = { data in + return data + } + + let resource = authJsonResource(path: "/api/v1/topics", method: .POST, requestParameters: requestParameters, parse: parse) + + if let failureHandler = failureHandler { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: failureHandler, completion: completion) + } else { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: defaultFailureHandler, completion: completion) + } +} + // MARK: - Social Work func authURLRequestWithURL(url: NSURL) -> NSURLRequest { diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 1c9404f4..a4512e8e 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -34,6 +34,12 @@ class NewFeedViewController: UIViewController { func post(sender: UIBarButtonItem) { println("post") + + createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: nil, skill: nil, allowComment: true, failureHandler: { reason, errorMessage in + defaultFailureHandler(reason, errorMessage: errorMessage) + }, completion: { data in + println(data) + }) } } From ab81cf8960c19494dd52cb436ebccc79b3520686 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 15:16:28 +0800 Subject: [PATCH 26/58] fix trans --- Yep/zh-Hans.lproj/Localizable.strings | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Yep/zh-Hans.lproj/Localizable.strings b/Yep/zh-Hans.lproj/Localizable.strings index d1deaf2f..13765900 100644 --- a/Yep/zh-Hans.lproj/Localizable.strings +++ b/Yep/zh-Hans.lproj/Localizable.strings @@ -150,19 +150,19 @@ "Face to Face" = "面对面"; /* No comment provided by engineer. */ -"Failed to resend audio!\nPlease make sure your iPhone is connected to the Internet." = "重发音频失败!\n情确保您的iPhone已连接到互联网。"; +"Failed to resend audio!\nPlease make sure your iPhone is connected to the Internet." = "重发音频失败!\n请确保您的 iPhone 已连接到互联网。"; /* No comment provided by engineer. */ -"Failed to resend image!\nPlease make sure your iPhone is connected to the Internet." = "重发图片失败!\n情确保您的iPhone已连接到互联网。"; +"Failed to resend image!\nPlease make sure your iPhone is connected to the Internet." = "重发图片失败!\n请确保您的 iPhone 已连接到互联网。"; /* No comment provided by engineer. */ -"Failed to resend location!\nPlease make sure your iPhone is connected to the Internet." = "重发位置失败!\n情确保您的iPhone已连接到互联网。"; +"Failed to resend location!\nPlease make sure your iPhone is connected to the Internet." = "重发位置失败!\n请确保您的 iPhone 已连接到互联网。"; /* No comment provided by engineer. */ -"Failed to resend text!\nPlease make sure your iPhone is connected to the Internet." = "重发文字失败!\n情确保您的iPhone已连接到互联网。"; +"Failed to resend text!\nPlease make sure your iPhone is connected to the Internet." = "重发文字失败!\n请确保您的 iPhone 已连接到互联网。"; /* No comment provided by engineer. */ -"Failed to resend video!\nPlease make sure your iPhone is connected to the Internet." = "重发视频失败!\n情确保您的iPhone已连接到互联网。"; +"Failed to resend video!\nPlease make sure your iPhone is connected to the Internet." = "重发视频失败!\n请确保您的 iPhone 已连接到互联网。"; /* No comment provided by engineer. */ "Failed to send audio!\nTry tap on message to resend." = "发送音频失败!\n轻按消息气泡可以重发。"; From db33a1c7f7737bec38101b8ba393b4aa959f829a Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 15:26:22 +0800 Subject: [PATCH 27/58] myFeeds --- Yep/Services/YepService.swift | 20 +++++++++++++++++++ .../Feeds/FeedsViewController.swift | 8 +++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index f0651ab4..93ba39ff 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2091,6 +2091,26 @@ func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPag } } +func myFeedsAtPageIndex(pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: JSONDictionary -> Void) { + + let requestParameters: JSONDictionary = [ + "page": pageIndex, + "per_page": perPage, + ] + + let parse: JSONDictionary -> JSONDictionary? = { data in + return data + } + + let resource = authJsonResource(path: "/api/v1/topics", method: .GET, requestParameters: requestParameters, parse: parse) + + if let failureHandler = failureHandler { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: failureHandler, completion: completion) + } else { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: defaultFailureHandler, completion: completion) + } +} + func createFeedWithMessage(message: String, attachments: String?, coordinate: CLLocationCoordinate2D?, skill: Skill?, allowComment: Bool, failureHandler: ((Reason, String?) -> Void)?, completion: JSONDictionary -> Void) { var requestParameters: JSONDictionary = [ diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index ed159c3f..3e6248e8 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -58,7 +58,13 @@ class FeedsViewController: UIViewController { discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) }, completion: { data in - println(data) + println("discoverFeeds \(data)") + }) + + myFeedsAtPageIndex(1, perPage: 100, failureHandler: { reason, errorMessage in + defaultFailureHandler(reason, errorMessage: errorMessage) + }, completion: { data in + println("myFeeds \(data)") }) } From bac0008c4cea518d8d41d56e0baa87cd204d6383 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 15:33:07 +0800 Subject: [PATCH 28/58] Conversations only show OneToOne --- .../Conversations/ConversationsViewController.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Yep/ViewControllers/Conversations/ConversationsViewController.swift b/Yep/ViewControllers/Conversations/ConversationsViewController.swift index a2931c80..4f87b4f2 100644 --- a/Yep/ViewControllers/Conversations/ConversationsViewController.swift +++ b/Yep/ViewControllers/Conversations/ConversationsViewController.swift @@ -50,7 +50,9 @@ class ConversationsViewController: UIViewController { } lazy var conversations: Results = { - return self.realm.objects(Conversation).sorted("updatedUnixTime", ascending: false) + //return self.realm.objects(Conversation).sorted("updatedUnixTime", ascending: false) + let predicate = NSPredicate(format: "type = %d", ConversationType.OneToOne.rawValue) + return self.realm.objects(Conversation).filter(predicate).sorted("updatedUnixTime", ascending: false) }() struct Listener { From 03d63d1e080d83aa3d21b5a03b7af4d19a5f174c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 19:41:11 +0800 Subject: [PATCH 29/58] add DiscoveredFeed & DiscoveredAttachment; show myFeeds in FeedsViewController --- Yep/Realm/Models.swift | 15 ++--- Yep/Services/YepService.swift | 58 ++++++++++++++++++- .../ConversationViewController.swift | 4 +- .../Feeds/FeedsViewController.swift | 51 ++++++++-------- Yep/Views/Cells/Feed/FeedCell.swift | 7 ++- Yep/Views/Feed/FeedView.swift | 21 +++---- 6 files changed, 105 insertions(+), 51 deletions(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 45422918..0275f06e 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -393,14 +393,15 @@ class Conversation: Object { // MARK: Feed -class Attachment: Object { +enum AttachmentKind: String { - enum Kind: String { - case Image = "image" - case Thumbnail = "thumbnail" - case Audio = "audio" - case Video = "video" - } + case Image = "image" + case Thumbnail = "thumbnail" + case Audio = "audio" + case Video = "video" +} + +class Attachment: Object { dynamic var kind: String = "" dynamic var metadata: String = "" diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 93ba39ff..3ccc3d68 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2070,6 +2070,51 @@ enum FeedSortStyle: String { case Time = "time" } +struct DiscoveredAttachment { + + let kind: AttachmentKind + let metadata: String + let URLString: String +} + +struct DiscoveredFeed { + + let id: String + let allowComment: Bool + + let createdUnixTime: NSTimeInterval + let updatedUnixTime: NSTimeInterval + + let creator: DiscoveredUser + let body: String + let attachments: [DiscoveredAttachment] + + let skill: Skill? + let groupID: String + + static func fromJSONDictionary(json: JSONDictionary) -> DiscoveredFeed? { + + guard let + id = json["id"] as? String, + allowComment = json["allow_comment"] as? Bool, + createdUnixTime = json["created_at"] as? NSTimeInterval, + updatedUnixTime = json["updated_at"] as? NSTimeInterval, + creatorInfo = json["user"] as? JSONDictionary, + body = json["body"] as? String, + //attachmentsData = json["circle"] as? [JSONDictionary], // TODO: + //skill + groupInfo = json["circle"] as? JSONDictionary else { + return nil + } + + guard let creator = parseDiscoveredUser(creatorInfo), groupID = groupInfo["id"] as? String else { + return nil + } + + return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], skill: nil, groupID: groupID) + } +} + func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: JSONDictionary -> Void) { let requestParameters: JSONDictionary = [ @@ -2091,15 +2136,22 @@ func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPag } } -func myFeedsAtPageIndex(pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: JSONDictionary -> Void) { +func myFeedsAtPageIndex(pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: [DiscoveredFeed] -> Void) { let requestParameters: JSONDictionary = [ "page": pageIndex, "per_page": perPage, ] - let parse: JSONDictionary -> JSONDictionary? = { data in - return data + let parse: JSONDictionary -> [DiscoveredFeed]? = { data in + + println(data) + + if let feedsData = data["topics"] as? [JSONDictionary] { + return feedsData.map({ DiscoveredFeed.fromJSONDictionary($0) }).flatMap({ $0 }) + } + + return [] } let resource = authJsonResource(path: "/api/v1/topics", method: .GET, requestParameters: requestParameters, parse: parse) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index c522ea52..545ef2a5 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -20,7 +20,7 @@ struct MessageNotification { class ConversationViewController: BaseViewController { - var feed: FakeFeed? + var feed: DiscoveredFeed? var conversation: Conversation! @@ -1041,7 +1041,7 @@ class ConversationViewController: BaseViewController { } } - private func makeFeedViewWithFeed(feed: FakeFeed) { + private func makeFeedViewWithFeed(feed: DiscoveredFeed) { let feedView = FeedView.instanceFromNib() diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 3e6248e8..a2c89604 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -9,11 +9,6 @@ import UIKit import RealmSwift -struct FakeFeed { - let mediaCount: Int - let message: String -} - class FeedsViewController: UIViewController { @IBOutlet weak var feedsCollectionView: UICollectionView! @@ -24,24 +19,23 @@ class FeedsViewController: UIViewController { let feedCellID = "FeedCell" - let fakeFeeds: [FakeFeed] = [ - FakeFeed(mediaCount: 1, message: "My name is NIX."), - FakeFeed(mediaCount: 0, message: "My name is NIX.\nHow are you?"), - FakeFeed(mediaCount: 3, message: "My name is NIX.\nHow are you?\nWhould you like to go to China buy iPhone?"), - FakeFeed(mediaCount: 0, message: "My name is NIX.\nHow are you?\nWhould you like to go to China buy iPhone?"), - FakeFeed(mediaCount: 4, message: "Whould you like to go to China buy iPhone?"), - FakeFeed(mediaCount: 5, message: "998"), - ] + var feeds = [DiscoveredFeed]() { + didSet { + dispatch_async(dispatch_get_main_queue()) { [weak self] in + self?.feedsCollectionView.reloadData() + } + } + } - private func heightOfFeed(feed: FakeFeed) -> CGFloat { + private func heightOfFeed(feed: DiscoveredFeed) -> CGFloat { - let rect = feed.message.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) + let rect = feed.body.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) let height: CGFloat - if feed.mediaCount > 0 { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 - } else { + if feed.attachments.isEmpty { height = ceil(rect.height) + 10 + 40 + 4 + 10 + 20.5 + 10 + } else { + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 } return ceil(height) @@ -63,8 +57,9 @@ class FeedsViewController: UIViewController { myFeedsAtPageIndex(1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) - }, completion: { data in - println("myFeeds \(data)") + }, completion: { [weak self] feeds in + self?.feeds = feeds + println("myFeeds.count \(feeds.count)") }) } @@ -77,8 +72,12 @@ class FeedsViewController: UIViewController { let vc = segue.destinationViewController as! ConversationViewController let realm = try! Realm() vc.conversation = realm.objects(Conversation).sorted("updatedUnixTime", ascending: false).first - let feed = FakeFeed(mediaCount: 3, message: "My name is NIX. How are you? Would you like to go to China buy iPhone?") - vc.feed = feed + + if let + index = sender as? Int, + feed = feeds[safe: index] { + vc.feed = feed + } } } } @@ -90,13 +89,13 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return fakeFeeds.count + return feeds.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedCellID, forIndexPath: indexPath) as! FeedCell - let feed = fakeFeeds[indexPath.item] + let feed = feeds[indexPath.item] cell.configureWithFeed(feed) @@ -107,7 +106,7 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { - let feed = fakeFeeds[indexPath.item] + let feed = feeds[indexPath.item] return CGSize(width: collectionViewWidth, height: heightOfFeed(feed)) } @@ -118,7 +117,7 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { - performSegueWithIdentifier("showConversation", sender: nil) + performSegueWithIdentifier("showConversation", sender: indexPath.item) } func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) { diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index a0b929a9..7ac1b8a6 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -47,10 +47,11 @@ class FeedCell: UICollectionViewCell { mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") } - func configureWithFeed(feed: FakeFeed) { - messageLabel.text = feed.message + func configureWithFeed(feed: DiscoveredFeed) { - let hasMedia = feed.mediaCount > 0 + messageLabel.text = feed.body + + let hasMedia = !feed.attachments.isEmpty timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true } diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 4665f56c..f8f63e72 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -10,7 +10,7 @@ import UIKit class FeedView: UIView { - var feed: FakeFeed? { + var feed: DiscoveredFeed? { willSet { if let feed = newValue { configureWithFeed(feed) @@ -131,27 +131,28 @@ class FeedView: UIView { return 220 } - let rect = feed.message.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) + let rect = feed.body.boundingRectWithSize(CGSize(width: FeedCell.messageLabelMaxWidth, height: CGFloat(FLT_MAX)), options: [.UsesLineFragmentOrigin, .UsesFontLeading], attributes: YepConfig.ChatCell.textAttributes, context: nil) let height: CGFloat - if feed.mediaCount > 0 { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 - } else { + if feed.attachments.isEmpty { height = ceil(rect.height) + 10 + 40 + 4 + 10 + 20.5 + 10 + } else { + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 } return ceil(height) } - private func configureWithFeed(feed: FakeFeed) { - messageLabel.text = feed.message + private func configureWithFeed(feed: DiscoveredFeed) { - let hasMedia = feed.mediaCount > 0 + messageLabel.text = feed.body + + let hasMedia = !feed.attachments.isEmpty timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true - let URLs = (0.. Date: Tue, 29 Sep 2015 19:53:51 +0800 Subject: [PATCH 30/58] better FeedCell's configureWithFeed --- Yep/Services/YepService.swift | 6 ++++-- .../Feeds/FeedsViewController.swift | 2 +- Yep/Views/Cells/Feed/FeedCell.swift | 16 ++++++++++++++++ 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 3ccc3d68..51931d7e 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2091,6 +2091,7 @@ struct DiscoveredFeed { let skill: Skill? let groupID: String + let messageCount: Int static func fromJSONDictionary(json: JSONDictionary) -> DiscoveredFeed? { @@ -2103,7 +2104,8 @@ struct DiscoveredFeed { body = json["body"] as? String, //attachmentsData = json["circle"] as? [JSONDictionary], // TODO: //skill - groupInfo = json["circle"] as? JSONDictionary else { + groupInfo = json["circle"] as? JSONDictionary, + messageCount = json["message_count"] as? Int else { return nil } @@ -2111,7 +2113,7 @@ struct DiscoveredFeed { return nil } - return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], skill: nil, groupID: groupID) + return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], skill: nil, groupID: groupID, messageCount: messageCount) } } diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index a2c89604..11a258ec 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -99,7 +99,7 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg cell.configureWithFeed(feed) - cell.backgroundColor = indexPath.item % 2 == 0 ? UIColor.yellowColor() : UIColor.purpleColor() + //cell.backgroundColor = indexPath.item % 2 == 0 ? UIColor.yellowColor() : UIColor.purpleColor() return cell } diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index 7ac1b8a6..cdfe150c 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -31,6 +31,7 @@ class FeedCell: UICollectionViewCell { override func awakeFromNib() { super.awakeFromNib() + /* avatarImageView.backgroundColor = UIColor.redColor() nicknameLabel.backgroundColor = UIColor.redColor() distanceLabel.backgroundColor = UIColor.redColor() @@ -38,6 +39,7 @@ class FeedCell: UICollectionViewCell { mediaCollectionView.backgroundColor = UIColor.redColor() timeLabel.backgroundColor = UIColor.redColor() messageCountLabel.backgroundColor = UIColor.redColor() + */ messageLabel.font = UIFont.feedMessageFont() @@ -54,6 +56,20 @@ class FeedCell: UICollectionViewCell { let hasMedia = !feed.attachments.isEmpty timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true + + let avatarURLString = feed.creator.avatarURLString + let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 + AvatarCache.sharedInstance.roundAvatarWithAvatarURLString(avatarURLString, withRadius: radius) { [weak self] roundImage in + dispatch_async(dispatch_get_main_queue()) { + //if let _ = tableView.cellForRowAtIndexPath(indexPath) { + self?.avatarImageView.image = roundImage + //} + } + } + + nicknameLabel.text = feed.creator.nickname + timeLabel.text = "\(NSDate(timeIntervalSince1970: feed.createdUnixTime).timeAgo)" + messageCountLabel.text = "\(feed.messageCount)" } } From ddaebdad26b76174a1b46c18365bb5c1ef3ef91d Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 20:06:37 +0800 Subject: [PATCH 31/58] adjust UI of FeedCell --- .../Feeds/FeedsViewController.swift | 6 ++--- Yep/Views/Cells/Feed/FeedCell.swift | 6 +++++ Yep/Views/Cells/Feed/FeedCell.xib | 24 +++++++++---------- 3 files changed, 21 insertions(+), 15 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 11a258ec..47430584 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -33,9 +33,9 @@ class FeedsViewController: UIViewController { let height: CGFloat if feed.attachments.isEmpty { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 20.5 + 10 + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 17 + 10 } else { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 17 + 10 } return ceil(height) @@ -123,7 +123,7 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) { let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FeedCell - cell.contentView.backgroundColor = UIColor.lightGrayColor() + cell.contentView.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5) } func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) { diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index cdfe150c..05dae425 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -31,6 +31,12 @@ class FeedCell: UICollectionViewCell { override func awakeFromNib() { super.awakeFromNib() + nicknameLabel.textColor = UIColor.yepTintColor() + messageLabel.textColor = UIColor.darkGrayColor() + distanceLabel.textColor = UIColor.grayColor() + timeLabel.textColor = UIColor.grayColor() + messageCountLabel.textColor = UIColor.yepTintColor() + /* avatarImageView.backgroundColor = UIColor.redColor() nicknameLabel.backgroundColor = UIColor.redColor() diff --git a/Yep/Views/Cells/Feed/FeedCell.xib b/Yep/Views/Cells/Feed/FeedCell.xib index aeff822d..8d2e05d2 100644 --- a/Yep/Views/Cells/Feed/FeedCell.xib +++ b/Yep/Views/Cells/Feed/FeedCell.xib @@ -22,25 +22,25 @@ - + @@ -52,17 +52,17 @@ - + From 8b87b66805e1184f46206666feaa7fc1fc04443c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 21:04:42 +0800 Subject: [PATCH 32/58] create group & conversation before push from Feeds --- .../Feeds/FeedsViewController.swift | 60 ++++++++++++++++--- 1 file changed, 53 insertions(+), 7 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 47430584..e5f1649c 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -69,15 +69,61 @@ class FeedsViewController: UIViewController { if segue.identifier == "showConversation" { - let vc = segue.destinationViewController as! ConversationViewController - let realm = try! Realm() - vc.conversation = realm.objects(Conversation).sorted("updatedUnixTime", ascending: false).first - - if let + guard let index = sender as? Int, - feed = feeds[safe: index] { - vc.feed = feed + feed = feeds[safe: index], + realm = try? Realm() else { + return } + + let vc = segue.destinationViewController as! ConversationViewController + + let groupID = feed.groupID + var group = groupWithGroupID(groupID, inRealm: realm) + + if group == nil { + + let newGroup = Group() + newGroup.groupID = groupID + + // TOOD: newGroup of Feed + /* + if let groupInfo = messageInfo["circle"] as? JSONDictionary { + if let groupName = groupInfo["name"] as? String { + newGroup.groupName = groupName + } + } + */ + + realm.write { + realm.add(newGroup) + } + + group = newGroup + } + + guard let feedGroup = group else { + return + } + + if feedGroup.conversation == nil { + + let newConversation = Conversation() + + newConversation.type = ConversationType.Group.rawValue + newConversation.withGroup = feedGroup + + realm.write { + realm.add(newConversation) + } + } + + guard let feedConversation = feedGroup.conversation else { + return + } + + vc.conversation = feedConversation + vc.feed = feed } } } From ebca290905c8e375076653b5c98af2ce34243a8d Mon Sep 17 00:00:00 2001 From: nixzhu Date: Tue, 29 Sep 2015 21:10:03 +0800 Subject: [PATCH 33/58] use new create message API --- Yep/Services/YepService.swift | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 51931d7e..2cd755a2 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -1561,7 +1561,13 @@ func createMessageWithMessageInfo(messageInfo: JSONDictionary, failureHandler: ( return nil } - let resource = authJsonResource(path: "/api/v1/messages", method: .POST, requestParameters: messageInfo, parse: parse) + guard let + recipientType = messageInfo["recipient_type"] as? String, + recipientID = messageInfo["recipient_id"] as? String else { + return + } + + let resource = authJsonResource(path: "/api/v1/\(recipientType)/\(recipientID)/messages", method: .POST, requestParameters: messageInfo, parse: parse) if let failureHandler = failureHandler { apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: failureHandler, completion: completion) From 72ccf2c71c2a73be92473be32952ab8574874c71 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 13:33:57 +0800 Subject: [PATCH 34/58] discoverFeeds return [DiscoveredFeed] --- Yep/Services/YepService.swift | 28 +++++++++---------- .../Feeds/FeedsViewController.swift | 9 ++++-- 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 2cd755a2..01cfbb6b 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2123,7 +2123,18 @@ struct DiscoveredFeed { } } -func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: JSONDictionary -> Void) { +let parseFeeds: JSONDictionary -> [DiscoveredFeed]? = { data in + + println("feedsData: \(data)") + + if let feedsData = data["topics"] as? [JSONDictionary] { + return feedsData.map({ DiscoveredFeed.fromJSONDictionary($0) }).flatMap({ $0 }) + } + + return [] +} + +func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPage: Int, failureHandler: ((Reason, String?) -> Void)?,completion: [DiscoveredFeed] -> Void) { let requestParameters: JSONDictionary = [ "sort": sortStyle.rawValue, @@ -2131,9 +2142,7 @@ func discoverFeedsWithSortStyle(sortStyle: FeedSortStyle, pageIndex: Int, perPag "per_page": perPage, ] - let parse: JSONDictionary -> JSONDictionary? = { data in - return data - } + let parse = parseFeeds let resource = authJsonResource(path: "/api/v1/topics/discover", method: .GET, requestParameters: requestParameters, parse: parse) @@ -2151,16 +2160,7 @@ func myFeedsAtPageIndex(pageIndex: Int, perPage: Int, failureHandler: ((Reason, "per_page": perPage, ] - let parse: JSONDictionary -> [DiscoveredFeed]? = { data in - - println(data) - - if let feedsData = data["topics"] as? [JSONDictionary] { - return feedsData.map({ DiscoveredFeed.fromJSONDictionary($0) }).flatMap({ $0 }) - } - - return [] - } + let parse = parseFeeds let resource = authJsonResource(path: "/api/v1/topics", method: .GET, requestParameters: requestParameters, parse: parse) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index e5f1649c..bf643877 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -51,16 +51,19 @@ class FeedsViewController: UIViewController { discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) - }, completion: { data in - println("discoverFeeds \(data)") + }, completion: { [weak self] feeds in + self?.feeds = feeds + println("discoverFeeds.count: \(feeds.count)") }) + /* myFeedsAtPageIndex(1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) }, completion: { [weak self] feeds in self?.feeds = feeds - println("myFeeds.count \(feeds.count)") + println("myFeeds.count: \(feeds.count)") }) + */ } // MARK: - Navigation From 1788f124b7b0d6352769158e45cb5f54840bf68c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 13:37:54 +0800 Subject: [PATCH 35/58] FeedView configureWithFeed more info --- Yep/Views/Feed/FeedView.swift | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index f8f63e72..801a26ce 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -100,6 +100,7 @@ class FeedView: UIView { clipsToBounds = true + /* avatarImageView.backgroundColor = UIColor.redColor() nicknameLabel.backgroundColor = UIColor.redColor() distanceLabel.backgroundColor = UIColor.redColor() @@ -107,6 +108,7 @@ class FeedView: UIView { mediaCollectionView.backgroundColor = UIColor.redColor() timeLabel.backgroundColor = UIColor.redColor() messageCountLabel.backgroundColor = UIColor.redColor() + */ messageLabel.font = UIFont.feedMessageFont() @@ -151,11 +153,21 @@ class FeedView: UIView { timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true - let URLs = feed.attachments.map({ - NSURL(string: $0.URLString)! - }) + let URLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) mediaView.setImagesWithURLs(URLs) + + let avatarURLString = feed.creator.avatarURLString + let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 + AvatarCache.sharedInstance.roundAvatarWithAvatarURLString(avatarURLString, withRadius: radius) { [weak self] roundImage in + dispatch_async(dispatch_get_main_queue()) { + self?.avatarImageView.image = roundImage + } + } + + nicknameLabel.text = feed.creator.nickname + timeLabel.text = "\(NSDate(timeIntervalSince1970: feed.createdUnixTime).timeAgo)" + messageCountLabel.text = "\(feed.messageCount)" } } From 2724e2b22c0af17053c7e6a5b0fff49396fbf0bb Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 13:53:16 +0800 Subject: [PATCH 36/58] distance of feed --- Yep/Services/YepService.swift | 5 ++++- Yep/Views/Cells/Feed/FeedCell.swift | 7 +++++++ Yep/Views/Feed/FeedView.swift | 5 +++++ 3 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 01cfbb6b..5ab8c087 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2094,6 +2094,7 @@ struct DiscoveredFeed { let creator: DiscoveredUser let body: String let attachments: [DiscoveredAttachment] + let distance: Double? let skill: Skill? let groupID: String @@ -2119,7 +2120,9 @@ struct DiscoveredFeed { return nil } - return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], skill: nil, groupID: groupID, messageCount: messageCount) + var distance = json["distance"] as? Double + + return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], distance: distance, skill: nil, groupID: groupID, messageCount: messageCount) } } diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index 05dae425..0e5da696 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -63,6 +63,8 @@ class FeedCell: UICollectionViewCell { timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true + //let URLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) + let avatarURLString = feed.creator.avatarURLString let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 AvatarCache.sharedInstance.roundAvatarWithAvatarURLString(avatarURLString, withRadius: radius) { [weak self] roundImage in @@ -74,6 +76,11 @@ class FeedCell: UICollectionViewCell { } nicknameLabel.text = feed.creator.nickname + + if let distance = feed.distance?.format(".1") { + distanceLabel.text = "\(distance) km" + } + timeLabel.text = "\(NSDate(timeIntervalSince1970: feed.createdUnixTime).timeAgo)" messageCountLabel.text = "\(feed.messageCount)" } diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 801a26ce..01e7bdac 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -166,6 +166,11 @@ class FeedView: UIView { } nicknameLabel.text = feed.creator.nickname + + if let distance = feed.distance?.format(".1") { + distanceLabel.text = "\(distance) km" + } + timeLabel.text = "\(NSDate(timeIntervalSince1970: feed.createdUnixTime).timeAgo)" messageCountLabel.text = "\(feed.messageCount)" } From f26a2420dd5b6354a6a77aa3bf172d8da6b3ee6c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 14:16:30 +0800 Subject: [PATCH 37/58] add HorizontalLineView; adjust detail of FeedView --- Yep.xcodeproj/project.pbxproj | 12 ++++ Yep/Extensions/UIColor+Yep.swift | 3 +- .../ConversationViewController.swift | 2 +- Yep/Views/Feed/FeedView.swift | 16 +++-- Yep/Views/Feed/FeedView.xib | 52 ++++++++-------- .../HorizontalLine/HorizontalLineView.swift | 60 +++++++++++++++++++ 6 files changed, 107 insertions(+), 38 deletions(-) create mode 100644 Yep/Views/HorizontalLine/HorizontalLineView.swift diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 49c07a9f..61d3ddca 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -239,6 +239,7 @@ 50F2B97B1B2EEAF800F840CC /* NavigationTitleLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F2B97A1B2EEAF800F840CC /* NavigationTitleLabel.swift */; }; 50F5AF831BBA67060033C9BC /* NewFeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */; settings = {ASSET_TAGS = (); }; }; 50F5AF861BBA676D0033C9BC /* NewFeed.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */; settings = {ASSET_TAGS = (); }; }; + 50F5AF881BBBB2AE0033C9BC /* HorizontalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */; settings = {ASSET_TAGS = (); }; }; 50FA9A441B661698009BF2A0 /* UIViewController+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */; }; 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */; settings = {ASSET_TAGS = (); }; }; 6ADDB4501B848C600012877A /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADDB44F1B848C600012877A /* 1Password.xcassets */; }; @@ -509,6 +510,7 @@ 50F2B97A1B2EEAF800F840CC /* NavigationTitleLabel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NavigationTitleLabel.swift; path = Views/Labels/NavigationTitleLabel.swift; sourceTree = ""; }; 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NewFeedViewController.swift; path = ViewControllers/NewFeed/NewFeedViewController.swift; sourceTree = ""; }; 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = NewFeed.storyboard; path = ViewControllers/NewFeed/NewFeed.storyboard; sourceTree = ""; }; + 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HorizontalLineView.swift; path = Views/HorizontalLine/HorizontalLineView.swift; sourceTree = ""; }; 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Yep.swift"; path = "Extensions/UIViewController+Yep.swift"; sourceTree = ""; }; 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepSoundEffect.swift; path = Helpers/YepSoundEffect.swift; sourceTree = ""; }; 6ADDB44F1B848C600012877A /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = 1Password.xcassets; sourceTree = ""; }; @@ -896,6 +898,7 @@ 50AFBF471BB25F81007D19DA /* TitleViews */, 50AFBF4C1BB2A453007D19DA /* InfoView */, 50AACEC91BB54132004DD54B /* Feed */, + 50F5AF891BBBB2B30033C9BC /* HorizontalLine */, ); name = Views; sourceTree = ""; @@ -1716,6 +1719,14 @@ name = NewFeed; sourceTree = ""; }; + 50F5AF891BBBB2B30033C9BC /* HorizontalLine */ = { + isa = PBXGroup; + children = ( + 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */, + ); + name = HorizontalLine; + sourceTree = ""; + }; 59CC1DE9D59AC08247B97B4F /* Pods */ = { isa = PBXGroup; children = ( @@ -2059,6 +2070,7 @@ 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */, 508D174C1ACCF49B0092D666 /* ChatRightAudioCell.swift in Sources */, 502AE53D1AB87C0D005BD199 /* YepUserDefaults.swift in Sources */, + 50F5AF881BBBB2AE0033C9BC /* HorizontalLineView.swift in Sources */, 50EB8CC41AE89F12001AC1EE /* ChatRightVideoCell.swift in Sources */, 50AACECF1BB93336004DD54B /* FeedMediaView.swift in Sources */, 50D4D0DB1AFA825B005AEB6F /* MediaControlView.swift in Sources */, diff --git a/Yep/Extensions/UIColor+Yep.swift b/Yep/Extensions/UIColor+Yep.swift index 45041a5a..4520b466 100644 --- a/Yep/Extensions/UIColor+Yep.swift +++ b/Yep/Extensions/UIColor+Yep.swift @@ -30,7 +30,8 @@ extension UIColor { } class func yepBorderColor() -> UIColor { - return UIColor(red: 0.898, green: 0.898, blue: 0.898, alpha: 1) + //return UIColor(red: 0.898, green: 0.898, blue: 0.898, alpha: 1) + return UIColor(red: 0.7, green: 0.7, blue: 0.7, alpha: 1) } class func avatarBackgroundColor() -> UIColor { diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 545ef2a5..77f81dfc 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -1055,7 +1055,7 @@ class ConversationViewController: BaseViewController { self?.conversationCollectionView.contentInset.top = 64 + feedView.normalHeight + conversationCollectionViewContentInsetYOffset } - feedView.backgroundColor = UIColor.orangeColor() + //feedView.backgroundColor = UIColor.orangeColor() feedView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(feedView) diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index 01e7bdac..b8488d58 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -55,8 +55,6 @@ class FeedView: UIView { self?.distanceLabel.alpha = foldingAlpha self?.mediaCollectionView.alpha = foldingAlpha self?.timeLabel.alpha = foldingAlpha - self?.messageCountLabel.alpha = foldingAlpha - self?.messageCountImageView.alpha = foldingAlpha self?.mediaView.alpha = newValue @@ -92,14 +90,16 @@ class FeedView: UIView { @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var timeLabelTopConstraint: NSLayoutConstraint! - @IBOutlet weak var messageCountLabel: UILabel! - @IBOutlet weak var messageCountImageView: UIImageView! - override func awakeFromNib() { super.awakeFromNib() clipsToBounds = true + nicknameLabel.textColor = UIColor.yepTintColor() + messageLabel.textColor = UIColor.darkGrayColor() + distanceLabel.textColor = UIColor.grayColor() + timeLabel.textColor = UIColor.grayColor() + /* avatarImageView.backgroundColor = UIColor.redColor() nicknameLabel.backgroundColor = UIColor.redColor() @@ -107,7 +107,6 @@ class FeedView: UIView { messageLabel.backgroundColor = UIColor.redColor() mediaCollectionView.backgroundColor = UIColor.redColor() timeLabel.backgroundColor = UIColor.redColor() - messageCountLabel.backgroundColor = UIColor.redColor() */ messageLabel.font = UIFont.feedMessageFont() @@ -137,9 +136,9 @@ class FeedView: UIView { let height: CGFloat if feed.attachments.isEmpty { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 20.5 + 10 + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 17 + 10 } else { - height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 20.5 + 10 + height = ceil(rect.height) + 10 + 40 + 4 + 10 + 80 + 10 + 17 + 10 } return ceil(height) @@ -172,7 +171,6 @@ class FeedView: UIView { } timeLabel.text = "\(NSDate(timeIntervalSince1970: feed.createdUnixTime).timeAgo)" - messageCountLabel.text = "\(feed.messageCount)" } } diff --git a/Yep/Views/Feed/FeedView.xib b/Yep/Views/Feed/FeedView.xib index 4fbd5bc5..cd1687e2 100644 --- a/Yep/Views/Feed/FeedView.xib +++ b/Yep/Views/Feed/FeedView.xib @@ -19,25 +19,25 @@ - + @@ -49,17 +49,8 @@ - - - - @@ -71,12 +62,16 @@ + + + + + + + - - - @@ -85,25 +80,31 @@ + + - + + + + + + + - - @@ -115,7 +116,4 @@ - - - diff --git a/Yep/Views/HorizontalLine/HorizontalLineView.swift b/Yep/Views/HorizontalLine/HorizontalLineView.swift new file mode 100644 index 00000000..247e0ed4 --- /dev/null +++ b/Yep/Views/HorizontalLine/HorizontalLineView.swift @@ -0,0 +1,60 @@ +// +// HorizontalLineView.swift +// Yep +// +// Created by nixzhu on 15/9/30. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +@IBDesignable +class HorizontalLineView: UIView { + + @IBInspectable + var lineColor: UIColor = UIColor.yepBorderColor() { + didSet { + setNeedsDisplay() + } + } + @IBInspectable + var lineWidth: CGFloat = 1.0 / UIScreen.mainScreen().scale { + didSet { + setNeedsDisplay() + } + } + + @IBInspectable + var leftMargin: CGFloat = 0 { + didSet { + setNeedsDisplay() + } + } + + @IBInspectable + var rightMargin: CGFloat = 0 { + didSet { + setNeedsDisplay() + } + } + + // MARK: Draw + + override func drawRect(rect: CGRect) { + super.drawRect(rect) + + lineColor.setStroke() + + let context = UIGraphicsGetCurrentContext() + + CGContextSetLineWidth(context, lineWidth) + + let y = ceil(CGRectGetHeight(rect) * 0.5) + + CGContextMoveToPoint(context, leftMargin, y) + CGContextAddLineToPoint(context, CGRectGetWidth(rect) - rightMargin, y) + + CGContextStrokePath(context) + } +} + From 4da07a1aa3b70550d823fa61ed50b93e77bad5af Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 14:38:58 +0800 Subject: [PATCH 38/58] use tableView in FeedsViewController --- Yep.xcodeproj/project.pbxproj | 16 +-- Yep/Base.lproj/Main.storyboard | 26 ++-- .../Feeds/FeedsViewController.swift | 53 +++++-- Yep/Views/Cells/Feed/FeedCell.swift | 20 +-- Yep/Views/Cells/Feed/FeedCell.xib | 130 +++++++++--------- 5 files changed, 132 insertions(+), 113 deletions(-) diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 61d3ddca..4da5b5f3 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -201,8 +201,6 @@ 50AFBF4B1BB2A44C007D19DA /* InfoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */; settings = {ASSET_TAGS = (); }; }; 50AFBF4E1BB3A594007D19DA /* bub3.caf in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF4D1BB3A594007D19DA /* bub3.caf */; settings = {ASSET_TAGS = (); }; }; 50AFBF5F1BB4F332007D19DA /* FeedsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */; settings = {ASSET_TAGS = (); }; }; - 50AFBF631BB4FC30007D19DA /* FeedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50AFBF611BB4FC30007D19DA /* FeedCell.swift */; settings = {ASSET_TAGS = (); }; }; - 50AFBF641BB4FC30007D19DA /* FeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50AFBF621BB4FC30007D19DA /* FeedCell.xib */; settings = {ASSET_TAGS = (); }; }; 50B38FB71B69CD960064C132 /* Array+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FB61B69CD960064C132 /* Array+Yep.swift */; }; 50B38FCC1B6B37F00064C132 /* FeedbackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */; }; 50B8E6161B40F9E700C17EA1 /* YepDownloader.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */; }; @@ -240,6 +238,8 @@ 50F5AF831BBA67060033C9BC /* NewFeedViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */; settings = {ASSET_TAGS = (); }; }; 50F5AF861BBA676D0033C9BC /* NewFeed.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */; settings = {ASSET_TAGS = (); }; }; 50F5AF881BBBB2AE0033C9BC /* HorizontalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */; settings = {ASSET_TAGS = (); }; }; + 50F5AF8C1BBBB64C0033C9BC /* FeedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF8A1BBBB64C0033C9BC /* FeedCell.swift */; settings = {ASSET_TAGS = (); }; }; + 50F5AF8D1BBBB64C0033C9BC /* FeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */; settings = {ASSET_TAGS = (); }; }; 50FA9A441B661698009BF2A0 /* UIViewController+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */; }; 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */; settings = {ASSET_TAGS = (); }; }; 6ADDB4501B848C600012877A /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADDB44F1B848C600012877A /* 1Password.xcassets */; }; @@ -472,8 +472,6 @@ 50AFBF4A1BB2A44C007D19DA /* InfoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = InfoView.swift; path = Views/InfoView/InfoView.swift; sourceTree = ""; }; 50AFBF4D1BB3A594007D19DA /* bub3.caf */ = {isa = PBXFileReference; lastKnownFileType = file; name = bub3.caf; path = Sounds/bub3.caf; sourceTree = ""; }; 50AFBF5E1BB4F332007D19DA /* FeedsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedsViewController.swift; path = ViewControllers/Feeds/FeedsViewController.swift; sourceTree = ""; }; - 50AFBF611BB4FC30007D19DA /* FeedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedCell.swift; path = Views/Cells/Feed/FeedCell.swift; sourceTree = ""; }; - 50AFBF621BB4FC30007D19DA /* FeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedCell.xib; path = Views/Cells/Feed/FeedCell.xib; sourceTree = ""; }; 50B38FB61B69CD960064C132 /* Array+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "Array+Yep.swift"; path = "Extensions/Array+Yep.swift"; sourceTree = ""; }; 50B38FCB1B6B37F00064C132 /* FeedbackViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedbackViewController.swift; path = ViewControllers/Feedback/FeedbackViewController.swift; sourceTree = ""; }; 50B8E6151B40F9E700C17EA1 /* YepDownloader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepDownloader.swift; path = Services/YepDownloader.swift; sourceTree = ""; }; @@ -511,6 +509,8 @@ 50F5AF821BBA67060033C9BC /* NewFeedViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = NewFeedViewController.swift; path = ViewControllers/NewFeed/NewFeedViewController.swift; sourceTree = ""; }; 50F5AF851BBA676D0033C9BC /* NewFeed.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; name = NewFeed.storyboard; path = ViewControllers/NewFeed/NewFeed.storyboard; sourceTree = ""; }; 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HorizontalLineView.swift; path = Views/HorizontalLine/HorizontalLineView.swift; sourceTree = ""; }; + 50F5AF8A1BBBB64C0033C9BC /* FeedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedCell.swift; path = Views/Cells/Feed/FeedCell.swift; sourceTree = ""; }; + 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedCell.xib; path = Views/Cells/Feed/FeedCell.xib; sourceTree = ""; }; 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Yep.swift"; path = "Extensions/UIViewController+Yep.swift"; sourceTree = ""; }; 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepSoundEffect.swift; path = Helpers/YepSoundEffect.swift; sourceTree = ""; }; 6ADDB44F1B848C600012877A /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = 1Password.xcassets; sourceTree = ""; }; @@ -1567,8 +1567,8 @@ 50AFBF651BB4FC37007D19DA /* Feed */ = { isa = PBXGroup; children = ( - 50AFBF611BB4FC30007D19DA /* FeedCell.swift */, - 50AFBF621BB4FC30007D19DA /* FeedCell.xib */, + 50F5AF8A1BBBB64C0033C9BC /* FeedCell.swift */, + 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */, ); name = Feed; sourceTree = ""; @@ -1909,6 +1909,7 @@ 50E348931B9063A700A8E699 /* AboutCell.xib in Resources */, 5039594F1B05E6E000797A3E /* ProfileSocialAccountGithubCell.xib in Resources */, 502AE5591AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib in Resources */, + 50F5AF8D1BBBB64C0033C9BC /* FeedCell.xib in Resources */, 5056AD6F1B05CB92003F9359 /* ProfileSocialAccountImagesCell.xib in Resources */, 506BB7F61AE4E0A500C1A2A0 /* SkillAnnotationHeader.xib in Resources */, 50AFBF4E1BB3A594007D19DA /* bub3.caf in Resources */, @@ -1929,7 +1930,6 @@ 508D17481ACCF4710092D666 /* ChatLeftAudioCell.xib in Resources */, 0A8F54B61AB67D11004AD60E /* Main.storyboard in Resources */, 5033159D1AC101C80008A209 /* ChatRightTextCell.xib in Resources */, - 50AFBF641BB4FC30007D19DA /* FeedCell.xib in Resources */, 84385C461B8594E80071130D /* Show.xcassets in Resources */, 50894CFB1AEA54BA000981AF /* SettingsMoreCell.xib in Resources */, 505EC8181ADF8151001D27E0 /* SkillCategoryCell.xib in Resources */, @@ -2138,7 +2138,6 @@ 5019F6311B39BFE00000D993 /* ConversationMoreView.swift in Sources */, 506BB7F51AE4E0A500C1A2A0 /* SkillAnnotationHeader.swift in Sources */, 5023DE301AB6861500B3EE96 /* ProfileViewController.swift in Sources */, - 50AFBF631BB4FC30007D19DA /* FeedCell.swift in Sources */, 5023DE261AB6856300B3EE96 /* ConversationsViewController.swift in Sources */, 50A9D4511ACD383E000B2599 /* NSDate+Extension.swift in Sources */, 506EC20A1AC95BFC00CE42B3 /* UIFont+Yep.swift in Sources */, @@ -2164,6 +2163,7 @@ 50E114F91ABC137A00F13000 /* YepServiceSync.swift in Sources */, 506E241C1AE6254F00A33C1A /* MessageTypeButton.swift in Sources */, 0A3E60671ACCAECE003DC853 /* YepLocationService.swift in Sources */, + 50F5AF8C1BBBB64C0033C9BC /* FeedCell.swift in Sources */, 50894CF11AEA4726000981AF /* SettingsViewController.swift in Sources */, 5023DE2A1AB685BA00B3EE96 /* ContactsViewController.swift in Sources */, 50CDBE491ACBAD3200459CE0 /* ChatLeftImageCell.swift in Sources */, diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index 58f55b89..236fc431 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -1575,27 +1575,21 @@ - + - - - - - - - + - - + + - + - - - - + + + + @@ -1606,7 +1600,7 @@ - + diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index bf643877..69198aa8 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -11,18 +11,14 @@ import RealmSwift class FeedsViewController: UIViewController { - @IBOutlet weak var feedsCollectionView: UICollectionView! - - lazy var collectionViewWidth: CGFloat = { - return CGRectGetWidth(self.feedsCollectionView.bounds) - }() + @IBOutlet weak var feedsTableView: UITableView! let feedCellID = "FeedCell" var feeds = [DiscoveredFeed]() { didSet { dispatch_async(dispatch_get_main_queue()) { [weak self] in - self?.feedsCollectionView.reloadData() + self?.feedsTableView.reloadData() } } } @@ -46,8 +42,8 @@ class FeedsViewController: UIViewController { title = NSLocalizedString("Feeds", comment: "") - feedsCollectionView.backgroundColor = UIColor.whiteColor() - feedsCollectionView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellWithReuseIdentifier: feedCellID) + feedsTableView.backgroundColor = UIColor.whiteColor() + feedsTableView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellReuseIdentifier: feedCellID) discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) @@ -131,6 +127,45 @@ class FeedsViewController: UIViewController { } } +extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { + + func numberOfSectionsInTableView(tableView: UITableView) -> Int { + + return 1 + } + + func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + + return feeds.count + } + + func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { + + let cell = tableView.dequeueReusableCellWithIdentifier(feedCellID) as! FeedCell + + let feed = feeds[indexPath.item] + + cell.configureWithFeed(feed) + + return cell + } + + func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { + + let feed = feeds[indexPath.item] + + return heightOfFeed(feed) + } + + func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { + + tableView.deselectRowAtIndexPath(indexPath, animated: true) + + performSegueWithIdentifier("showConversation", sender: indexPath.item) + } +} + +/* extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDelegate { func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { @@ -181,4 +216,4 @@ extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDeleg cell.contentView.backgroundColor = UIColor.clearColor() } } - +*/ diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index 0e5da696..eb1bd13f 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -2,13 +2,13 @@ // FeedCell.swift // Yep // -// Created by nixzhu on 15/9/25. +// Created by nixzhu on 15/9/30. // Copyright © 2015年 Catch Inc. All rights reserved. // import UIKit -class FeedCell: UICollectionViewCell { +class FeedCell: UITableViewCell { @IBOutlet weak var avatarImageView: UIImageView! @IBOutlet weak var nicknameLabel: UILabel! @@ -37,18 +37,8 @@ class FeedCell: UICollectionViewCell { timeLabel.textColor = UIColor.grayColor() messageCountLabel.textColor = UIColor.yepTintColor() - /* - avatarImageView.backgroundColor = UIColor.redColor() - nicknameLabel.backgroundColor = UIColor.redColor() - distanceLabel.backgroundColor = UIColor.redColor() - messageLabel.backgroundColor = UIColor.redColor() - mediaCollectionView.backgroundColor = UIColor.redColor() - timeLabel.backgroundColor = UIColor.redColor() - messageCountLabel.backgroundColor = UIColor.redColor() - */ - messageLabel.font = UIFont.feedMessageFont() - + mediaCollectionView.dataSource = self mediaCollectionView.delegate = self @@ -64,13 +54,13 @@ class FeedCell: UICollectionViewCell { mediaCollectionView.hidden = hasMedia ? false : true //let URLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) - + let avatarURLString = feed.creator.avatarURLString let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 AvatarCache.sharedInstance.roundAvatarWithAvatarURLString(avatarURLString, withRadius: radius) { [weak self] roundImage in dispatch_async(dispatch_get_main_queue()) { //if let _ = tableView.cellForRowAtIndexPath(indexPath) { - self?.avatarImageView.image = roundImage + self?.avatarImageView.image = roundImage //} } } diff --git a/Yep/Views/Cells/Feed/FeedCell.xib b/Yep/Views/Cells/Feed/FeedCell.xib index 8d2e05d2..c302abcc 100644 --- a/Yep/Views/Cells/Feed/FeedCell.xib +++ b/Yep/Views/Cells/Feed/FeedCell.xib @@ -4,104 +4,104 @@ + - - - - - + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - + + + + + + + + - - + + From 96cbb7e673c33de18efd8dd1b3dad40c0820efea Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 14:46:25 +0800 Subject: [PATCH 39/58] footer view; seperater line inset --- Yep/ViewControllers/Feeds/FeedsViewController.swift | 7 +++++++ Yep/Views/Cells/Feed/FeedCell.xib | 1 + 2 files changed, 8 insertions(+) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 69198aa8..1eda65fb 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -15,10 +15,16 @@ class FeedsViewController: UIViewController { let feedCellID = "FeedCell" + lazy var noFeedsFooterView: InfoView = InfoView(NSLocalizedString("No Feeds.", comment: "")) + var feeds = [DiscoveredFeed]() { didSet { dispatch_async(dispatch_get_main_queue()) { [weak self] in self?.feedsTableView.reloadData() + + if let strongSelf = self { + strongSelf.feedsTableView.tableFooterView = strongSelf.feeds.isEmpty ? strongSelf.noFeedsFooterView : UIView() + } } } } @@ -44,6 +50,7 @@ class FeedsViewController: UIViewController { feedsTableView.backgroundColor = UIColor.whiteColor() feedsTableView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellReuseIdentifier: feedCellID) + feedsTableView.tableFooterView = UIView() discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) diff --git a/Yep/Views/Cells/Feed/FeedCell.xib b/Yep/Views/Cells/Feed/FeedCell.xib index c302abcc..703cc799 100644 --- a/Yep/Views/Cells/Feed/FeedCell.xib +++ b/Yep/Views/Cells/Feed/FeedCell.xib @@ -90,6 +90,7 @@ + From f03ee86fdf274eb4e230847be3d5418c4608112e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 15:08:31 +0800 Subject: [PATCH 40/58] coordinate for createFeed --- Yep/Services/YepLocationService.swift | 3 ++ .../NewFeed/NewFeedViewController.swift | 30 +++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) diff --git a/Yep/Services/YepLocationService.swift b/Yep/Services/YepLocationService.swift index 3834da07..797b7551 100644 --- a/Yep/Services/YepLocationService.swift +++ b/Yep/Services/YepLocationService.swift @@ -30,11 +30,14 @@ class YepLocationService: NSObject, CLLocationManagerDelegate { return locationManager }() + var currentLocation: CLLocation? var address: String? let geocoder = CLGeocoder() func locationManager(manager: CLLocationManager, didUpdateToLocation newLocation: CLLocation, fromLocation oldLocation: CLLocation) { + currentLocation = newLocation + // 尽量减少对服务器的请求和反向查询 let distance = newLocation.distanceFromLocation(oldLocation) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index a4512e8e..dfd5a815 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -7,6 +7,8 @@ // import UIKit +import Proposer +import CoreLocation class NewFeedViewController: UIViewController { @@ -28,14 +30,38 @@ class NewFeedViewController: UIViewController { messageTextView.backgroundColor = UIColor.lightGrayColor() mediaCollectionView.backgroundColor = UIColor.blueColor() + + // try turn on location + + let locationResource = PrivateResource.Location(.WhenInUse) + + if locationResource.isNotDeterminedAuthorization { + + proposeToAccess(.Location(.WhenInUse), agreed: { + + YepLocationService.turnOn() + + }, rejected: { + self.alertCanNotAccessLocation() + }) + + } else { + proposeToAccess(.Location(.WhenInUse), agreed: { + + YepLocationService.turnOn() + + }, rejected: { + }) + } } // MARK: Actions func post(sender: UIBarButtonItem) { - println("post") - createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: nil, skill: nil, allowComment: true, failureHandler: { reason, errorMessage in + let coordinate = YepLocationService.sharedManager.currentLocation?.coordinate + + createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) }, completion: { data in println(data) From fc83dd38c5c4b7c228d0455e1aa27ceb8dcec3dd Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 15:16:11 +0800 Subject: [PATCH 41/58] createFeed success action --- Yep/ViewControllers/NewFeed/NewFeedViewController.swift | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index dfd5a815..73a73e99 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -61,10 +61,17 @@ class NewFeedViewController: UIViewController { let coordinate = YepLocationService.sharedManager.currentLocation?.coordinate - createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { reason, errorMessage in + createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { [weak self] reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) + + YepAlert.alertSorry(message: errorMessage ?? NSLocalizedString("Create feed failed!", comment: ""), inViewController: self) + }, completion: { data in println(data) + + dispatch_async(dispatch_get_main_queue()) { [weak self] in + self?.navigationController?.popViewControllerAnimated(true) + } }) } } From 89007e44ddae5d5c1cdf1fe1d881b70fab60916b Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 15:24:38 +0800 Subject: [PATCH 42/58] in afterCreatedFeedAction, updateFeeds --- .../Feeds/FeedsViewController.swift | 29 +++++++++++++++---- .../NewFeed/NewFeedViewController.swift | 7 +++-- 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 1eda65fb..663616e4 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -52,12 +52,7 @@ class FeedsViewController: UIViewController { feedsTableView.registerNib(UINib(nibName: feedCellID, bundle: nil), forCellReuseIdentifier: feedCellID) feedsTableView.tableFooterView = UIView() - discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in - defaultFailureHandler(reason, errorMessage: errorMessage) - }, completion: { [weak self] feeds in - self?.feeds = feeds - println("discoverFeeds.count: \(feeds.count)") - }) + updateFeeds() /* myFeedsAtPageIndex(1, perPage: 100, failureHandler: { reason, errorMessage in @@ -69,10 +64,32 @@ class FeedsViewController: UIViewController { */ } + // MARK: - Actions + + func updateFeeds() { + + discoverFeedsWithSortStyle(.Time, pageIndex: 1, perPage: 100, failureHandler: { reason, errorMessage in + defaultFailureHandler(reason, errorMessage: errorMessage) + + }, completion: { [weak self] feeds in + self?.feeds = feeds + println("discoverFeeds.count: \(feeds.count)") + }) + } + // MARK: - Navigation override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { + if segue.identifier == "showNewFeed" { + + let vc = segue.destinationViewController as! NewFeedViewController + + vc.afterCreatedFeedAction = { [weak self] in + self?.updateFeeds() + } + } + if segue.identifier == "showConversation" { guard let diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 73a73e99..74cc5fa0 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -12,11 +12,11 @@ import CoreLocation class NewFeedViewController: UIViewController { + var afterCreatedFeedAction: (() -> Void)? + @IBOutlet weak var messageTextView: UITextView! - @IBOutlet weak var mediaCollectionView: UICollectionView! - override func viewDidLoad() { super.viewDidLoad() @@ -70,6 +70,9 @@ class NewFeedViewController: UIViewController { println(data) dispatch_async(dispatch_get_main_queue()) { [weak self] in + + self?.afterCreatedFeedAction?() + self?.navigationController?.popViewControllerAnimated(true) } }) From 27c86b1e39915f1a6cd23f72a1bc0d78448960c2 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 15:50:42 +0800 Subject: [PATCH 43/58] basic UI of mediaCollectionView in NewFeedViewController --- .../NewFeed/NewFeedViewController.swift | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 74cc5fa0..30878ec4 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -31,6 +31,11 @@ class NewFeedViewController: UIViewController { messageTextView.backgroundColor = UIColor.lightGrayColor() mediaCollectionView.backgroundColor = UIColor.blueColor() + mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") + mediaCollectionView.contentInset.left = 20 + mediaCollectionView.dataSource = self + mediaCollectionView.delegate = self + // try turn on location let locationResource = PrivateResource.Location(.WhenInUse) @@ -79,3 +84,28 @@ class NewFeedViewController: UIViewController { } } +extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDelegate { + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 2 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return 2 + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) + cell.backgroundColor = UIColor.greenColor() + return cell + } + + func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { + + return CGSize(width: 80, height: 80) + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10) + } +} From 80820302f8a7a4a9a886b15a25ef54636d3d1378 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 16:08:17 +0800 Subject: [PATCH 44/58] add FeedMediaAddCell --- Yep.xcodeproj/project.pbxproj | 16 ++++++++ .../feed_media_add.imageset/Contents.json | 12 ++++++ .../feed_media_add.pdf | Bin 0 -> 3918 bytes .../NewFeed/NewFeedViewController.swift | 35 +++++++++++++++--- .../Cells/FeedMediaAdd/FeedMediaAddCell.swift | 18 +++++++++ .../Cells/FeedMediaAdd/FeedMediaAddCell.xib | 33 +++++++++++++++++ 6 files changed, 109 insertions(+), 5 deletions(-) create mode 100644 Yep/Images.xcassets/feed_media_add.imageset/Contents.json create mode 100644 Yep/Images.xcassets/feed_media_add.imageset/feed_media_add.pdf create mode 100644 Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift create mode 100644 Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index 4da5b5f3..dab4de28 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -240,6 +240,8 @@ 50F5AF881BBBB2AE0033C9BC /* HorizontalLineView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */; settings = {ASSET_TAGS = (); }; }; 50F5AF8C1BBBB64C0033C9BC /* FeedCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF8A1BBBB64C0033C9BC /* FeedCell.swift */; settings = {ASSET_TAGS = (); }; }; 50F5AF8D1BBBB64C0033C9BC /* FeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */; settings = {ASSET_TAGS = (); }; }; + 50F5AF951BBBCDA30033C9BC /* FeedMediaAddCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF931BBBCDA30033C9BC /* FeedMediaAddCell.swift */; settings = {ASSET_TAGS = (); }; }; + 50F5AF961BBBCDA30033C9BC /* FeedMediaAddCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF941BBBCDA30033C9BC /* FeedMediaAddCell.xib */; settings = {ASSET_TAGS = (); }; }; 50FA9A441B661698009BF2A0 /* UIViewController+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */; }; 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */; settings = {ASSET_TAGS = (); }; }; 6ADDB4501B848C600012877A /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADDB44F1B848C600012877A /* 1Password.xcassets */; }; @@ -511,6 +513,8 @@ 50F5AF871BBBB2AE0033C9BC /* HorizontalLineView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = HorizontalLineView.swift; path = Views/HorizontalLine/HorizontalLineView.swift; sourceTree = ""; }; 50F5AF8A1BBBB64C0033C9BC /* FeedCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedCell.swift; path = Views/Cells/Feed/FeedCell.swift; sourceTree = ""; }; 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedCell.xib; path = Views/Cells/Feed/FeedCell.xib; sourceTree = ""; }; + 50F5AF931BBBCDA30033C9BC /* FeedMediaAddCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedMediaAddCell.swift; path = Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift; sourceTree = ""; }; + 50F5AF941BBBCDA30033C9BC /* FeedMediaAddCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedMediaAddCell.xib; path = Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib; sourceTree = ""; }; 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Yep.swift"; path = "Extensions/UIViewController+Yep.swift"; sourceTree = ""; }; 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepSoundEffect.swift; path = Helpers/YepSoundEffect.swift; sourceTree = ""; }; 6ADDB44F1B848C600012877A /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = 1Password.xcassets; sourceTree = ""; }; @@ -946,6 +950,7 @@ 5064F65B1B0B14470089FAD4 /* AddFriendMore */, 50E348941B9063AD00A8E699 /* About */, 50AFBF651BB4FC37007D19DA /* Feed */, + 50F5AF921BBBCC960033C9BC /* FeedMediaAdd */, ); name = Cells; sourceTree = ""; @@ -1727,6 +1732,15 @@ name = HorizontalLine; sourceTree = ""; }; + 50F5AF921BBBCC960033C9BC /* FeedMediaAdd */ = { + isa = PBXGroup; + children = ( + 50F5AF931BBBCDA30033C9BC /* FeedMediaAddCell.swift */, + 50F5AF941BBBCDA30033C9BC /* FeedMediaAddCell.xib */, + ); + name = FeedMediaAdd; + sourceTree = ""; + }; 59CC1DE9D59AC08247B97B4F /* Pods */ = { isa = PBXGroup; children = ( @@ -1950,6 +1964,7 @@ 50EB8CC51AE89F12001AC1EE /* ChatRightVideoCell.xib in Resources */, 502AE5191AB70D72005BD199 /* Intro.storyboard in Resources */, 504BDC151B4528A500DBD35D /* Badges.xcassets in Resources */, + 50F5AF961BBBCDA30033C9BC /* FeedMediaAddCell.xib in Resources */, 50894D081AEDFDA2000981AF /* EditProfileMoreInfoCell.xib in Resources */, 50A640E61B6F41E00050E4A3 /* DoNotDisturbSwitchCell.xib in Resources */, 508D174D1ACCF49B0092D666 /* ChatRightAudioCell.xib in Resources */, @@ -2144,6 +2159,7 @@ 0A0A11821AE389380008772C /* RegisterSkillsLayout.swift in Sources */, 50C0909B1ADE234F00CC6389 /* RegisterPickSkillsViewController.swift in Sources */, 5076FC5A1AF9DF6B00D7381A /* ConversationMessagePreviewTransitionManager.swift in Sources */, + 50F5AF951BBBCDA30033C9BC /* FeedMediaAddCell.swift in Sources */, 508D16BD1ADCAF0400270E3F /* PullToRefreshView.swift in Sources */, 508D17441ACCDC9F0092D666 /* VoiceRecordButton.swift in Sources */, 502AE5271AB72D06005BD199 /* YepNetworking.swift in Sources */, diff --git a/Yep/Images.xcassets/feed_media_add.imageset/Contents.json b/Yep/Images.xcassets/feed_media_add.imageset/Contents.json new file mode 100644 index 00000000..d3889fb8 --- /dev/null +++ b/Yep/Images.xcassets/feed_media_add.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "feed_media_add.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Yep/Images.xcassets/feed_media_add.imageset/feed_media_add.pdf b/Yep/Images.xcassets/feed_media_add.imageset/feed_media_add.pdf new file mode 100644 index 0000000000000000000000000000000000000000..9dbe211e316261aa51e6d27947a2805a4011e43a GIT binary patch literal 3918 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 C)|-j| literal 0 HcmV?d00001 diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 30878ec4..6bff4fd6 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -17,6 +17,8 @@ class NewFeedViewController: UIViewController { @IBOutlet weak var messageTextView: UITextView! @IBOutlet weak var mediaCollectionView: UICollectionView! + let feedMediaAddCellID = "FeedMediaAddCell" + override func viewDidLoad() { super.viewDidLoad() @@ -29,8 +31,9 @@ class NewFeedViewController: UIViewController { messageTextView.text = "What's up?" messageTextView.backgroundColor = UIColor.lightGrayColor() - mediaCollectionView.backgroundColor = UIColor.blueColor() + //mediaCollectionView.backgroundColor = UIColor.blueColor() + mediaCollectionView.registerNib(UINib(nibName: feedMediaAddCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaAddCellID) mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") mediaCollectionView.contentInset.left = 20 mediaCollectionView.dataSource = self @@ -91,13 +94,35 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 2 + + switch section { + case 0: + return 1 + case 1: + return 3 + default: + return 0 + } } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) - cell.backgroundColor = UIColor.greenColor() - return cell + + switch indexPath.section { + + case 0: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaAddCellID, forIndexPath: indexPath) as! FeedMediaAddCell + cell.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5) + return cell + + case 1: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) + cell.backgroundColor = UIColor.greenColor() + return cell + + default: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) + return cell + } } func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { diff --git a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift new file mode 100644 index 00000000..181695c3 --- /dev/null +++ b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift @@ -0,0 +1,18 @@ +// +// FeedMediaAddCell.swift +// Yep +// +// Created by nixzhu on 15/9/30. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class FeedMediaAddCell: UICollectionViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + +} diff --git a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib new file mode 100644 index 00000000..6ff71ecb --- /dev/null +++ b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From e2090c0dc077037426c564cbead347fc5343037c Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 16:18:33 +0800 Subject: [PATCH 45/58] add FeedMediaCell --- Yep.xcodeproj/project.pbxproj | 16 +++++++ .../icon_media_delete.imageset/Contents.json | 12 ++++++ .../icon_media_delete.pdf | Bin 0 -> 4673 bytes .../NewFeed/NewFeedViewController.swift | 8 ++-- Yep/Views/Cells/FeedMedia/FeedMediaCell.swift | 18 ++++++++ Yep/Views/Cells/FeedMedia/FeedMediaCell.xib | 40 ++++++++++++++++++ .../Cells/FeedMediaAdd/FeedMediaAddCell.swift | 4 +- .../Cells/FeedMediaAdd/FeedMediaAddCell.xib | 6 +-- 8 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 Yep/Images.xcassets/icon_media_delete.imageset/Contents.json create mode 100644 Yep/Images.xcassets/icon_media_delete.imageset/icon_media_delete.pdf create mode 100644 Yep/Views/Cells/FeedMedia/FeedMediaCell.swift create mode 100644 Yep/Views/Cells/FeedMedia/FeedMediaCell.xib diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index dab4de28..da357b7c 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -242,6 +242,8 @@ 50F5AF8D1BBBB64C0033C9BC /* FeedCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */; settings = {ASSET_TAGS = (); }; }; 50F5AF951BBBCDA30033C9BC /* FeedMediaAddCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF931BBBCDA30033C9BC /* FeedMediaAddCell.swift */; settings = {ASSET_TAGS = (); }; }; 50F5AF961BBBCDA30033C9BC /* FeedMediaAddCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF941BBBCDA30033C9BC /* FeedMediaAddCell.xib */; settings = {ASSET_TAGS = (); }; }; + 50F5AF991BBBD02A0033C9BC /* FeedMediaCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50F5AF971BBBD02A0033C9BC /* FeedMediaCell.swift */; settings = {ASSET_TAGS = (); }; }; + 50F5AF9A1BBBD02A0033C9BC /* FeedMediaCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 50F5AF981BBBD02A0033C9BC /* FeedMediaCell.xib */; settings = {ASSET_TAGS = (); }; }; 50FA9A441B661698009BF2A0 /* UIViewController+Yep.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */; }; 6A649A9B1BB259CB00EE4FB5 /* YepSoundEffect.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */; settings = {ASSET_TAGS = (); }; }; 6ADDB4501B848C600012877A /* 1Password.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 6ADDB44F1B848C600012877A /* 1Password.xcassets */; }; @@ -515,6 +517,8 @@ 50F5AF8B1BBBB64C0033C9BC /* FeedCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedCell.xib; path = Views/Cells/Feed/FeedCell.xib; sourceTree = ""; }; 50F5AF931BBBCDA30033C9BC /* FeedMediaAddCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedMediaAddCell.swift; path = Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift; sourceTree = ""; }; 50F5AF941BBBCDA30033C9BC /* FeedMediaAddCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedMediaAddCell.xib; path = Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib; sourceTree = ""; }; + 50F5AF971BBBD02A0033C9BC /* FeedMediaCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = FeedMediaCell.swift; path = Views/Cells/FeedMedia/FeedMediaCell.swift; sourceTree = ""; }; + 50F5AF981BBBD02A0033C9BC /* FeedMediaCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = FeedMediaCell.xib; path = Views/Cells/FeedMedia/FeedMediaCell.xib; sourceTree = ""; }; 50FA9A431B661698009BF2A0 /* UIViewController+Yep.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = "UIViewController+Yep.swift"; path = "Extensions/UIViewController+Yep.swift"; sourceTree = ""; }; 6A649A9A1BB259CB00EE4FB5 /* YepSoundEffect.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepSoundEffect.swift; path = Helpers/YepSoundEffect.swift; sourceTree = ""; }; 6ADDB44F1B848C600012877A /* 1Password.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = 1Password.xcassets; sourceTree = ""; }; @@ -951,6 +955,7 @@ 50E348941B9063AD00A8E699 /* About */, 50AFBF651BB4FC37007D19DA /* Feed */, 50F5AF921BBBCC960033C9BC /* FeedMediaAdd */, + 50F5AF9B1BBBD0310033C9BC /* FeedMedia */, ); name = Cells; sourceTree = ""; @@ -1741,6 +1746,15 @@ name = FeedMediaAdd; sourceTree = ""; }; + 50F5AF9B1BBBD0310033C9BC /* FeedMedia */ = { + isa = PBXGroup; + children = ( + 50F5AF971BBBD02A0033C9BC /* FeedMediaCell.swift */, + 50F5AF981BBBD02A0033C9BC /* FeedMediaCell.xib */, + ); + name = FeedMedia; + sourceTree = ""; + }; 59CC1DE9D59AC08247B97B4F /* Pods */ = { isa = PBXGroup; children = ( @@ -1956,6 +1970,7 @@ 848806B11B789A2D000C5424 /* EditSkillCell.xib in Resources */, 50E114FD1ABC549300F13000 /* ContactsCell.xib in Resources */, 502AE54F1AB93175005BD199 /* ProfileHeaderCell.xib in Resources */, + 50F5AF9A1BBBD02A0033C9BC /* FeedMediaCell.xib in Resources */, 50A640EA1B6F45FA0050E4A3 /* DoNotDisturbPeriodCell.xib in Resources */, 0A8F54BB1AB67D11004AD60E /* LaunchScreen.xib in Resources */, 5053AD511AF82A1700B3CBFA /* PickLocationCell.xib in Resources */, @@ -2075,6 +2090,7 @@ 50553F931ADBA50600F80B59 /* NSDate+Yep.swift in Sources */, 50AFBF461BB25F40007D19DA /* ActivityIndicatorTitleView.swift in Sources */, 50E61CEB1AF1F69D00908A9D /* ConversationTitleView.swift in Sources */, + 50F5AF991BBBD02A0033C9BC /* FeedMediaCell.swift in Sources */, 5023DE331AB688F600B3EE96 /* UIColor+Yep.swift in Sources */, 503315971AC1017E0008A209 /* ChatLeftTextCell.swift in Sources */, 0A8F54B11AB67D11004AD60E /* AppDelegate.swift in Sources */, diff --git a/Yep/Images.xcassets/icon_media_delete.imageset/Contents.json b/Yep/Images.xcassets/icon_media_delete.imageset/Contents.json new file mode 100644 index 00000000..03e3daa0 --- /dev/null +++ b/Yep/Images.xcassets/icon_media_delete.imageset/Contents.json @@ -0,0 +1,12 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "icon_media_delete.pdf" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/Yep/Images.xcassets/icon_media_delete.imageset/icon_media_delete.pdf b/Yep/Images.xcassets/icon_media_delete.imageset/icon_media_delete.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04a3bf37869214db3643c264b7c86c1af9886a5e GIT binary patch literal 4673 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 literal 0 HcmV?d00001 diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 6bff4fd6..07336e3e 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -18,6 +18,7 @@ class NewFeedViewController: UIViewController { @IBOutlet weak var mediaCollectionView: UICollectionView! let feedMediaAddCellID = "FeedMediaAddCell" + let feedMediaCellID = "FeedMediaCell" override func viewDidLoad() { super.viewDidLoad() @@ -31,9 +32,10 @@ class NewFeedViewController: UIViewController { messageTextView.text = "What's up?" messageTextView.backgroundColor = UIColor.lightGrayColor() - //mediaCollectionView.backgroundColor = UIColor.blueColor() + mediaCollectionView.backgroundColor = UIColor.clearColor() mediaCollectionView.registerNib(UINib(nibName: feedMediaAddCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaAddCellID) + mediaCollectionView.registerNib(UINib(nibName: feedMediaCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaCellID) mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") mediaCollectionView.contentInset.left = 20 mediaCollectionView.dataSource = self @@ -111,12 +113,10 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel case 0: let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaAddCellID, forIndexPath: indexPath) as! FeedMediaAddCell - cell.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5) return cell case 1: - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) - cell.backgroundColor = UIColor.greenColor() + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaCellID, forIndexPath: indexPath) as! FeedMediaCell return cell default: diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift new file mode 100644 index 00000000..f56ffd81 --- /dev/null +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift @@ -0,0 +1,18 @@ +// +// FeedMediaCell.swift +// Yep +// +// Created by nixzhu on 15/9/30. +// Copyright © 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class FeedMediaCell: UICollectionViewCell { + + override func awakeFromNib() { + super.awakeFromNib() + + contentView.backgroundColor = UIColor.darkGrayColor() + } +} diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib new file mode 100644 index 00000000..4a0dd189 --- /dev/null +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift index 181695c3..c2303d22 100644 --- a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift +++ b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.swift @@ -12,7 +12,7 @@ class FeedMediaAddCell: UICollectionViewCell { override func awakeFromNib() { super.awakeFromNib() - // Initialization code - } + contentView.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5) + } } diff --git a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib index 6ff71ecb..6111f75e 100644 --- a/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib +++ b/Yep/Views/Cells/FeedMediaAdd/FeedMediaAddCell.xib @@ -8,13 +8,13 @@ - + - + - + From e5bb7c592161f22a2a08e7bd2fcfe283cc924cff Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 16:32:06 +0800 Subject: [PATCH 46/58] pick image in NewFeedViewController --- .../NewFeed/NewFeedViewController.swift | 92 ++++++++++++++++++- 1 file changed, 91 insertions(+), 1 deletion(-) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 07336e3e..48c6679c 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -9,6 +9,7 @@ import UIKit import Proposer import CoreLocation +import MobileCoreServices class NewFeedViewController: UIViewController { @@ -17,6 +18,23 @@ class NewFeedViewController: UIViewController { @IBOutlet weak var messageTextView: UITextView! @IBOutlet weak var mediaCollectionView: UICollectionView! + lazy var imagePicker: UIImagePickerController = { + let imagePicker = UIImagePickerController() + imagePicker.delegate = self + imagePicker.mediaTypes = [kUTTypeImage as String] + imagePicker.videoQuality = .TypeMedium + imagePicker.allowsEditing = false + return imagePicker + }() + + var mediaImages = [UIImage]() { + didSet { + dispatch_async(dispatch_get_main_queue()) { [weak self] in + self?.mediaCollectionView.reloadData() + } + } + } + let feedMediaAddCellID = "FeedMediaAddCell" let feedMediaCellID = "FeedMediaCell" @@ -65,6 +83,15 @@ class NewFeedViewController: UIViewController { } } + override func viewDidAppear(animated: Bool) { + super.viewDidAppear(animated) + + // touch to create (if need) for faster appear + delay(0.2) { [weak self] in + self?.imagePicker.hidesBarsOnTap = false + } + } + // MARK: Actions func post(sender: UIBarButtonItem) { @@ -101,7 +128,7 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel case 0: return 1 case 1: - return 3 + return mediaImages.count default: return 0 } @@ -133,4 +160,67 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 10) } + + func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { + + switch indexPath.section { + + case 0: + let openCameraRoll: ProposerAction = { [weak self] in + if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { + if let strongSelf = self { + strongSelf.imagePicker.sourceType = .PhotoLibrary + strongSelf.presentViewController(strongSelf.imagePicker, animated: true, completion: nil) + } + } + } + + proposeToAccess(.Photos, agreed: openCameraRoll, rejected: { [weak self] in + self?.alertCanNotAccessCameraRoll() + }) + + default: + break + } + } } + +extension NewFeedViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate { + + func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { + + if let mediaType = info[UIImagePickerControllerMediaType] as? String { + + if mediaType == (kUTTypeImage as String) { + + if let image = info[UIImagePickerControllerOriginalImage] as? UIImage { + + let imageWidth = image.size.width + let imageHeight = image.size.height + + let fixedImageWidth: CGFloat + let fixedImageHeight: CGFloat + + if imageWidth > imageHeight { + fixedImageWidth = min(imageWidth, YepConfig.Media.imageWidth) + fixedImageHeight = imageHeight * (fixedImageWidth / imageWidth) + } else { + fixedImageHeight = min(imageHeight, YepConfig.Media.imageHeight) + fixedImageWidth = imageWidth * (fixedImageHeight / imageHeight) + } + + let fixedSize = CGSize(width: fixedImageWidth, height: fixedImageHeight) + + // resize to smaller, not need fixRotation + + if let fixedImage = image.resizeToSize(fixedSize, withInterpolationQuality: CGInterpolationQuality.Medium) { + mediaImages.append(fixedImage) + } + } + } + } + + dismissViewControllerAnimated(true, completion: nil) + } +} + From df1135bdd0f974a6e9f5fae1968d977d45ca9f53 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 16:39:09 +0800 Subject: [PATCH 47/58] show picked images for feed --- Yep/ViewControllers/NewFeed/NewFeedViewController.swift | 7 ++++++- Yep/Views/Cells/FeedMedia/FeedMediaCell.swift | 6 ++++++ Yep/Views/Cells/FeedMedia/FeedMediaCell.xib | 5 ++++- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 48c6679c..3b1bb03c 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -144,6 +144,11 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel case 1: let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaCellID, forIndexPath: indexPath) as! FeedMediaCell + + let image = mediaImages[indexPath.item] + + cell.configureWithImage(image) + return cell default: @@ -169,7 +174,7 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel let openCameraRoll: ProposerAction = { [weak self] in if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary) { if let strongSelf = self { - strongSelf.imagePicker.sourceType = .PhotoLibrary + strongSelf.imagePicker.sourceType = .SavedPhotosAlbum strongSelf.presentViewController(strongSelf.imagePicker, animated: true, completion: nil) } } diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift index f56ffd81..9b239f40 100644 --- a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift @@ -10,9 +10,15 @@ import UIKit class FeedMediaCell: UICollectionViewCell { + @IBOutlet weak var imageView: UIImageView! + override func awakeFromNib() { super.awakeFromNib() contentView.backgroundColor = UIColor.darkGrayColor() } + + func configureWithImage(image: UIImage) { + imageView.image = image + } } diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib index 4a0dd189..47c5505f 100644 --- a/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib @@ -13,7 +13,7 @@ - + @@ -31,6 +31,9 @@ + + + From ccb7091e89bf484943b723035f19b76b6c7de427 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 17:13:55 +0800 Subject: [PATCH 48/58] logic of update images for feed --- Yep/Services/YepService.swift | 2 +- .../NewFeed/NewFeedViewController.swift | 82 +++++++++++++++++-- 2 files changed, 74 insertions(+), 10 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 5ab8c087..13d4fc07 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2174,7 +2174,7 @@ func myFeedsAtPageIndex(pageIndex: Int, perPage: Int, failureHandler: ((Reason, } } -func createFeedWithMessage(message: String, attachments: String?, coordinate: CLLocationCoordinate2D?, skill: Skill?, allowComment: Bool, failureHandler: ((Reason, String?) -> Void)?, completion: JSONDictionary -> Void) { +func createFeedWithMessage(message: String, attachments: JSONDictionary?, coordinate: CLLocationCoordinate2D?, skill: Skill?, allowComment: Bool, failureHandler: ((Reason, String?) -> Void)?, completion: JSONDictionary -> Void) { var requestParameters: JSONDictionary = [ "body": message, diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 3b1bb03c..93c736f0 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -96,24 +96,88 @@ class NewFeedViewController: UIViewController { func post(sender: UIBarButtonItem) { + YepHUD.showActivityIndicator() + + let message = messageTextView.text + let coordinate = YepLocationService.sharedManager.currentLocation?.coordinate - createFeedWithMessage(messageTextView.text, attachments: nil, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { [weak self] reason, errorMessage in - defaultFailureHandler(reason, errorMessage: errorMessage) + let uploadMediaImagesGroup = dispatch_group_create() - YepAlert.alertSorry(message: errorMessage ?? NSLocalizedString("Create feed failed!", comment: ""), inViewController: self) + var allS3UploadParams = [S3UploadParams]() - }, completion: { data in - println(data) + mediaImages.forEach({ image in - dispatch_async(dispatch_get_main_queue()) { [weak self] in + if let imageData = UIImageJPEGRepresentation(image, 0.7) { - self?.afterCreatedFeedAction?() + dispatch_group_enter(uploadMediaImagesGroup) - self?.navigationController?.popViewControllerAnimated(true) + s3PublicUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in + + defaultFailureHandler(reason, errorMessage: errorMessage) + + dispatch_async(dispatch_get_main_queue()) { + dispatch_group_leave(uploadMediaImagesGroup) + } + + }, completion: { s3UploadParams in + + dispatch_async(dispatch_get_main_queue()) { + allS3UploadParams.append(s3UploadParams) + + dispatch_group_leave(uploadMediaImagesGroup) + } + }) } }) - } + + dispatch_group_notify(uploadMediaImagesGroup, dispatch_get_main_queue()) { + + let imageInfosData = allS3UploadParams.map({ + [ + "file": $0.key, + "metadata": "", // TODO: metadata + ] + }) + + let mediaInfo = [ + "image": imageInfosData, + ] + + /* + guard let + mediaData = try? NSJSONSerialization.dataWithJSONObject(mediaInfo, options: []), + mediaDataString = NSString(data: mediaData, encoding: NSUTF8StringEncoding) as? String else { + + YepHUD.hideActivityIndicator() + + return + } + + println("mediaDataString: \(mediaDataString)") + */ + + createFeedWithMessage(message, attachments: mediaInfo, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { [weak self] reason, errorMessage in + defaultFailureHandler(reason, errorMessage: errorMessage) + + YepAlert.alertSorry(message: errorMessage ?? NSLocalizedString("Create feed failed!", comment: ""), inViewController: self) + + YepHUD.hideActivityIndicator() + + }, completion: { data in + println(data) + + YepHUD.hideActivityIndicator() + + dispatch_async(dispatch_get_main_queue()) { [weak self] in + + self?.afterCreatedFeedAction?() + + self?.navigationController?.popViewControllerAnimated(true) + } + }) + } + } } extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDelegate { From 1dc76e41ecce4631dbdbd38567bf243070e7a451 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 17:22:51 +0800 Subject: [PATCH 49/58] parse attachments in feed --- Yep/Services/YepService.swift | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 13d4fc07..ef887e5d 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -2081,6 +2081,19 @@ struct DiscoveredAttachment { let kind: AttachmentKind let metadata: String let URLString: String + + static func fromJSONDictionary(json: JSONDictionary) -> DiscoveredAttachment? { + guard let + kindString = json["kind"] as? String, + kind = AttachmentKind(rawValue: kindString), + metadata = json["metadata"] as? String, + fileInfo = json["file"] as? JSONDictionary, + URLString = fileInfo["url"] as? String else { + return nil + } + + return DiscoveredAttachment(kind: kind, metadata: metadata, URLString: URLString) + } } struct DiscoveredFeed { @@ -2109,8 +2122,8 @@ struct DiscoveredFeed { updatedUnixTime = json["updated_at"] as? NSTimeInterval, creatorInfo = json["user"] as? JSONDictionary, body = json["body"] as? String, - //attachmentsData = json["circle"] as? [JSONDictionary], // TODO: - //skill + attachmentsData = json["attachments"] as? [JSONDictionary], + //skill // TODO: skill groupInfo = json["circle"] as? JSONDictionary, messageCount = json["message_count"] as? Int else { return nil @@ -2120,9 +2133,11 @@ struct DiscoveredFeed { return nil } - var distance = json["distance"] as? Double + let distance = json["distance"] as? Double - return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: [], distance: distance, skill: nil, groupID: groupID, messageCount: messageCount) + let attachments = attachmentsData.map({ DiscoveredAttachment.fromJSONDictionary($0) }).flatMap({ $0 }) + + return DiscoveredFeed(id: id, allowComment: allowComment, createdUnixTime: createdUnixTime, updatedUnixTime: updatedUnixTime, creator: creator, body: body, attachments: attachments, distance: distance, skill: nil, groupID: groupID, messageCount: messageCount) } } From 22da75d92df8f6fbbcb43ea9b3f5cbe6b910ff9d Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 18:39:56 +0800 Subject: [PATCH 50/58] show images of feed --- .../NewFeed/NewFeedViewController.swift | 2 +- Yep/Views/Cells/Feed/FeedCell.swift | 25 ++++++++++++++++--- Yep/Views/Cells/FeedMedia/FeedMediaCell.swift | 5 ++++ 3 files changed, 27 insertions(+), 5 deletions(-) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index 93c736f0..af496369 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -112,7 +112,7 @@ class NewFeedViewController: UIViewController { dispatch_group_enter(uploadMediaImagesGroup) - s3PublicUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in + s3PrivateUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in defaultFailureHandler(reason, errorMessage: errorMessage) diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index eb1bd13f..b458560b 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -23,11 +23,20 @@ class FeedCell: UITableViewCell { @IBOutlet weak var messageCountLabel: UILabel! + + var attachmentURLs = [NSURL]() { + didSet { + mediaCollectionView.reloadData() + } + } + static let messageLabelMaxWidth: CGFloat = { let maxWidth = UIScreen.mainScreen().bounds.width - (60 + 10) return maxWidth }() + let feedMediaCellID = "FeedMediaCell" + override func awakeFromNib() { super.awakeFromNib() @@ -39,6 +48,7 @@ class FeedCell: UITableViewCell { messageLabel.font = UIFont.feedMessageFont() + mediaCollectionView.registerNib(UINib(nibName: feedMediaCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaCellID) mediaCollectionView.dataSource = self mediaCollectionView.delegate = self @@ -53,7 +63,7 @@ class FeedCell: UITableViewCell { timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true - //let URLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) + attachmentURLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) let avatarURLString = feed.creator.avatarURLString let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 @@ -83,12 +93,19 @@ extension FeedCell: UICollectionViewDataSource, UICollectionViewDelegate { } func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return 15 + return attachmentURLs.count } func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) - cell.backgroundColor = UIColor.greenColor() + + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaCellID, forIndexPath: indexPath) as! FeedMediaCell + + let imageURL = attachmentURLs[indexPath.item] + + println("attachment imageURL: \(imageURL)") + + cell.configureWithImageURL(imageURL) + return cell } diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift index 9b239f40..313b5fbe 100644 --- a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift @@ -7,6 +7,7 @@ // import UIKit +import Kingfisher class FeedMediaCell: UICollectionViewCell { @@ -21,4 +22,8 @@ class FeedMediaCell: UICollectionViewCell { func configureWithImage(image: UIImage) { imageView.image = image } + + func configureWithImageURL(imageURL: NSURL) { + imageView.kf_setImageWithURL(imageURL) + } } From 4d4f802e11dac42547d9282354ae8b3199061141 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 18:44:36 +0800 Subject: [PATCH 51/58] adjust UI of FeedMediaCell for image or URL --- Yep/Views/Cells/Feed/FeedCell.swift | 1 + Yep/Views/Cells/FeedMedia/FeedMediaCell.swift | 9 ++++++++- Yep/Views/Cells/FeedMedia/FeedMediaCell.xib | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/Yep/Views/Cells/Feed/FeedCell.swift b/Yep/Views/Cells/Feed/FeedCell.swift index b458560b..891149bd 100644 --- a/Yep/Views/Cells/Feed/FeedCell.swift +++ b/Yep/Views/Cells/Feed/FeedCell.swift @@ -48,6 +48,7 @@ class FeedCell: UITableViewCell { messageLabel.font = UIFont.feedMessageFont() + mediaCollectionView.backgroundColor = UIColor.clearColor() mediaCollectionView.registerNib(UINib(nibName: feedMediaCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaCellID) mediaCollectionView.dataSource = self mediaCollectionView.delegate = self diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift index 313b5fbe..81ec2f95 100644 --- a/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.swift @@ -12,18 +12,25 @@ import Kingfisher class FeedMediaCell: UICollectionViewCell { @IBOutlet weak var imageView: UIImageView! + @IBOutlet weak var deleteImageView: UIImageView! override func awakeFromNib() { super.awakeFromNib() - contentView.backgroundColor = UIColor.darkGrayColor() + contentView.backgroundColor = UIColor.clearColor() } func configureWithImage(image: UIImage) { + imageView.image = image + + deleteImageView.hidden = false } func configureWithImageURL(imageURL: NSURL) { + imageView.kf_setImageWithURL(imageURL) + + deleteImageView.hidden = true } } diff --git a/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib index 47c5505f..6badec7d 100644 --- a/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib +++ b/Yep/Views/Cells/FeedMedia/FeedMediaCell.xib @@ -32,6 +32,7 @@ + From 659174c14c041175845b7587c600e54be161c215 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Wed, 30 Sep 2015 18:56:30 +0800 Subject: [PATCH 52/58] fill attachments to FeedView --- Yep/Views/Feed/FeedView.swift | 61 +++++++++++++++++++++++++++-------- 1 file changed, 47 insertions(+), 14 deletions(-) diff --git a/Yep/Views/Feed/FeedView.swift b/Yep/Views/Feed/FeedView.swift index b8488d58..1d49f883 100644 --- a/Yep/Views/Feed/FeedView.swift +++ b/Yep/Views/Feed/FeedView.swift @@ -90,6 +90,15 @@ class FeedView: UIView { @IBOutlet weak var timeLabel: UILabel! @IBOutlet weak var timeLabelTopConstraint: NSLayoutConstraint! + var attachmentURLs = [NSURL]() { + didSet { + mediaCollectionView.reloadData() + mediaView.setImagesWithURLs(attachmentURLs) + } + } + + let feedMediaCellID = "FeedMediaCell" + override func awakeFromNib() { super.awakeFromNib() @@ -100,21 +109,14 @@ class FeedView: UIView { distanceLabel.textColor = UIColor.grayColor() timeLabel.textColor = UIColor.grayColor() - /* - avatarImageView.backgroundColor = UIColor.redColor() - nicknameLabel.backgroundColor = UIColor.redColor() - distanceLabel.backgroundColor = UIColor.redColor() - messageLabel.backgroundColor = UIColor.redColor() - mediaCollectionView.backgroundColor = UIColor.redColor() - timeLabel.backgroundColor = UIColor.redColor() - */ - messageLabel.font = UIFont.feedMessageFont() mediaView.alpha = 0 - //mediaCollectionView.dataSource = self - //mediaCollectionView.delegate = self + mediaCollectionView.backgroundColor = UIColor.clearColor() + mediaCollectionView.registerNib(UINib(nibName: feedMediaCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaCellID) + mediaCollectionView.dataSource = self + mediaCollectionView.delegate = self //mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") @@ -152,9 +154,7 @@ class FeedView: UIView { timeLabelTopConstraint.constant = hasMedia ? 100 : 10 mediaCollectionView.hidden = hasMedia ? false : true - let URLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) - - mediaView.setImagesWithURLs(URLs) + attachmentURLs = feed.attachments.map({ NSURL(string: $0.URLString) }).flatMap({ $0 }) let avatarURLString = feed.creator.avatarURLString let radius = min(CGRectGetWidth(avatarImageView.bounds), CGRectGetHeight(avatarImageView.bounds)) * 0.5 @@ -174,3 +174,36 @@ class FeedView: UIView { } } +extension FeedView: UICollectionViewDataSource, UICollectionViewDelegate { + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 1 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + return attachmentURLs.count + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedMediaCellID, forIndexPath: indexPath) as! FeedMediaCell + + let imageURL = attachmentURLs[indexPath.item] + + println("attachment imageURL: \(imageURL)") + + cell.configureWithImageURL(imageURL) + + return cell + } + + func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { + + return CGSize(width: 80, height: 80) + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { + return UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) + } +} + From e351cf2dbf88d8b20bd2ed6f77d23dae0d8cc08e Mon Sep 17 00:00:00 2001 From: nixzhu Date: Thu, 1 Oct 2015 13:47:48 +0800 Subject: [PATCH 53/58] new s3UploadFileOfKind --- Yep/Services/YepService.swift | 4 +- Yep/Services/YepStorageService.swift | 57 +++++++++++-------- .../EditProfileViewController.swift | 2 +- .../NewFeed/NewFeedViewController.swift | 2 +- .../RegisterPickAvatarViewController.swift | 2 +- .../SkillHome/SkillHomeViewController.swift | 2 +- 6 files changed, 38 insertions(+), 31 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index ef887e5d..4f877642 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -1852,7 +1852,7 @@ func sendMessage(message: Message, inFilePath filePath: String?, orFileData file default: - s3PrivateUploadFile(inFilePath: filePath, orFileData: fileData, mimeType: mediaType.mineType, failureHandler: failureHandler, completion: { s3UploadParams in + s3UploadFileOfKind(.Message, inFilePath: filePath, orFileData: fileData, mimeType: mediaType.mineType, failureHandler: failureHandler, completion: { s3UploadParams in switch mediaType { @@ -1907,7 +1907,7 @@ func sendMessage(message: Message, inFilePath filePath: String?, orFileData file thumbnailData = UIImageJPEGRepresentation(image, YepConfig.messageImageCompressionQuality()) } - s3PrivateUploadFile(inFilePath: nil, orFileData: thumbnailData, mimeType: MessageMediaType.Image.mineType, failureHandler: failureHandler, completion: { thumbnailS3UploadParams in + s3UploadFileOfKind(.Message, inFilePath: nil, orFileData: thumbnailData, mimeType: MessageMediaType.Image.mineType, failureHandler: failureHandler, completion: { thumbnailS3UploadParams in if let metaData = metaData { let attachments = [ diff --git a/Yep/Services/YepStorageService.swift b/Yep/Services/YepStorageService.swift index 52c77546..725254fa 100644 --- a/Yep/Services/YepStorageService.swift +++ b/Yep/Services/YepStorageService.swift @@ -15,6 +15,7 @@ import AFNetworking Struct of S3 UploadParams */ struct S3UploadParams { + let url: String let key: String let acl: String @@ -23,6 +24,13 @@ struct S3UploadParams { let date: String let credential: String let encodedPolicy: String + + enum Kind: String { + + case Message = "message" + case Avatar = "avatar" + case Feed = "topic" + } } /** @@ -92,36 +100,23 @@ private func uploadFileToS3(inFilePath filePath: String?, orFileData fileData: N // MARK: Upload -//extension NSMutableData { -// -// /// Append string to NSMutableData -// /// -// /// Rather than littering my code with calls to `dataUsingEncoding` to convert strings to NSData, and then add that data to the NSMutableData, this wraps it in a nice convenient little extension to NSMutableData. This converts using UTF-8. -// /// -// /// :param: string The string to be added to the `NSMutableData`. -// -// func appendString(string: String) { -// let data = string.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false) -// appendData(data!) -// } -//} +func s3UploadParamsOfKind(kind: S3UploadParams.Kind, failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { -/// Create boundary string for multipart/form-data request -/// -/// - returns: The boundary string that consists of "Boundary-" followed by a UUID string. + s3UploadParams("/api/v1/attachments/\(kind.rawValue)/s3_upload_form_fields", failureHandler: { (reason, error) in + if let failureHandler = failureHandler { + failureHandler(reason, error) + } else { + defaultFailureHandler(reason, errorMessage: error) + } -//func generateBoundaryString() -> String { -// return "Boundary-\(NSUUID().UUIDString)" -//} - -/// Get S3 Private Message upload params -/// -/// You can use this in Message Attachment -/// -/// :S3UploadParams: The Upload Params + }, completion: { S3PrivateUploadParams in + completion(S3PrivateUploadParams) + }) +} +/* private func s3PrivateUploadParams(failureHandler failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { s3UploadParams("/api/v1/attachments/s3_upload_form_fields", failureHandler: { (reason, error) in @@ -155,6 +150,7 @@ private func s3PublicUploadParams(failureHandler failureHandler: ((Reason, Strin completion(S3PublicUploadParams) }) } +*/ /// Get S3 upload params /// @@ -217,6 +213,16 @@ private func s3UploadParams(url: String, failureHandler: ((Reason, String?) -> ( // API +func s3UploadFileOfKind(kind: S3UploadParams.Kind, inFilePath filePath: String?, orFileData fileData: NSData?, mimeType: String, failureHandler: ((Reason, String?) -> ())?, completion: S3UploadParams -> ()) { + + s3UploadParamsOfKind(kind, failureHandler: failureHandler) { s3UploadParams in + uploadFileToS3(inFilePath: filePath, orFileData: fileData, mimeType: mimeType, s3UploadParams: s3UploadParams, failureHandler: failureHandler) { + completion(s3UploadParams) + } + } +} + +/* func s3PublicUploadFile(inFilePath filePath: String?, orFileData fileData: NSData?, mimeType: String, failureHandler: ((Reason, String?) -> ())?, completion: S3UploadParams -> ()) { s3PublicUploadParams(failureHandler: failureHandler) { s3UploadParams in @@ -234,3 +240,4 @@ func s3PrivateUploadFile(inFilePath filePath: String?, orFileData fileData: NSDa } } } +*/ diff --git a/Yep/ViewControllers/EditProfile/EditProfileViewController.swift b/Yep/ViewControllers/EditProfile/EditProfileViewController.swift index 9f34ed5e..93db2810 100644 --- a/Yep/ViewControllers/EditProfile/EditProfileViewController.swift +++ b/Yep/ViewControllers/EditProfile/EditProfileViewController.swift @@ -431,7 +431,7 @@ extension EditProfileViewController: UIImagePickerControllerDelegate, UINavigati let image = image.largestCenteredSquareImage().resizeToTargetSize(YepConfig.avatarMaxSize()) let imageData = UIImageJPEGRepresentation(image, YepConfig.avatarCompressionQuality()) - s3PublicUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in + s3UploadFileOfKind(.Avatar, inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in defaultFailureHandler(reason, errorMessage: errorMessage) diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index af496369..dbe86737 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -112,7 +112,7 @@ class NewFeedViewController: UIViewController { dispatch_group_enter(uploadMediaImagesGroup) - s3PrivateUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in + s3UploadFileOfKind(.Feed, inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in defaultFailureHandler(reason, errorMessage: errorMessage) diff --git a/Yep/ViewControllers/Register/RegisterPickAvatarViewController.swift b/Yep/ViewControllers/Register/RegisterPickAvatarViewController.swift index 19423760..e2834d37 100644 --- a/Yep/ViewControllers/Register/RegisterPickAvatarViewController.swift +++ b/Yep/ViewControllers/Register/RegisterPickAvatarViewController.swift @@ -228,7 +228,7 @@ class RegisterPickAvatarViewController: UIViewController { avatar = self.avatar.largestCenteredSquareImage().resizeToTargetSize(YepConfig.avatarMaxSize()) let imageData = UIImageJPEGRepresentation(avatar, YepConfig.avatarCompressionQuality()) - s3PublicUploadFile(inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in + s3UploadFileOfKind(.Avatar, inFilePath: nil, orFileData: imageData, mimeType: MessageMediaType.Image.mineType, failureHandler: { (reason, errorMessage) in defaultFailureHandler(reason, errorMessage: errorMessage) diff --git a/Yep/ViewControllers/SkillHome/SkillHomeViewController.swift b/Yep/ViewControllers/SkillHome/SkillHomeViewController.swift index fbfcfd5a..4894d406 100644 --- a/Yep/ViewControllers/SkillHome/SkillHomeViewController.swift +++ b/Yep/ViewControllers/SkillHome/SkillHomeViewController.swift @@ -487,7 +487,7 @@ extension SkillHomeViewController: UIImagePickerControllerDelegate, UINavigation YepHUD.showActivityIndicator() - s3PublicUploadFile(inFilePath: nil, orFileData: data, mimeType: MessageMediaType.Image.mineType, failureHandler: { [weak self] reason, errorMessage in + s3UploadFileOfKind(.Avatar, inFilePath: nil, orFileData: data, mimeType: MessageMediaType.Image.mineType, failureHandler: { [weak self] reason, errorMessage in YepHUD.hideActivityIndicator() From 2be016228cbda2e1d663e523e04268a149ec6ddd Mon Sep 17 00:00:00 2001 From: nixzhu Date: Thu, 1 Oct 2015 13:51:06 +0800 Subject: [PATCH 54/58] clean code --- Yep/Services/YepStorageService.swift | 89 +++++----------------------- 1 file changed, 15 insertions(+), 74 deletions(-) diff --git a/Yep/Services/YepStorageService.swift b/Yep/Services/YepStorageService.swift index 725254fa..2f9003ab 100644 --- a/Yep/Services/YepStorageService.swift +++ b/Yep/Services/YepStorageService.swift @@ -10,10 +10,10 @@ import Foundation import MobileCoreServices.UTType import AFNetworking - /** Struct of S3 UploadParams */ + struct S3UploadParams { let url: String @@ -98,60 +98,6 @@ private func uploadFileToS3(inFilePath filePath: String?, orFileData fileData: N uploadTask.resume() } -// MARK: Upload - - - -func s3UploadParamsOfKind(kind: S3UploadParams.Kind, failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { - - s3UploadParams("/api/v1/attachments/\(kind.rawValue)/s3_upload_form_fields", failureHandler: { (reason, error) in - if let failureHandler = failureHandler { - failureHandler(reason, error) - } else { - defaultFailureHandler(reason, errorMessage: error) - } - - }, completion: { S3PrivateUploadParams in - completion(S3PrivateUploadParams) - }) -} - -/* -private func s3PrivateUploadParams(failureHandler failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { - - s3UploadParams("/api/v1/attachments/s3_upload_form_fields", failureHandler: { (reason, error) in - if let failureHandler = failureHandler { - failureHandler(reason, error) - } else { - defaultFailureHandler(reason, errorMessage: error) - } - - }, completion: { S3PrivateUploadParams in - completion(S3PrivateUploadParams) - }) -} - -/// Get S3 public upload params -/// -/// You can use this in Avatar -/// -/// :S3UploadParams: The Upload Params - -private func s3PublicUploadParams(failureHandler failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { - - s3UploadParams("/api/v1/attachments/s3_upload_public_form_fields", failureHandler: { (reason, error) in - if let failureHandler = failureHandler { - failureHandler(reason, error) - } else { - defaultFailureHandler(reason, errorMessage: error) - } - - }, completion: { S3PublicUploadParams in - completion(S3PublicUploadParams) - }) -} -*/ - /// Get S3 upload params /// /// @@ -211,6 +157,20 @@ private func s3UploadParams(url: String, failureHandler: ((Reason, String?) -> ( } } +private func s3UploadParamsOfKind(kind: S3UploadParams.Kind, failureHandler: ((Reason, String?) -> ())?, completion: (S3UploadParams) -> Void) { + + s3UploadParams("/api/v1/attachments/\(kind.rawValue)/s3_upload_form_fields", failureHandler: { (reason, error) in + if let failureHandler = failureHandler { + failureHandler(reason, error) + } else { + defaultFailureHandler(reason, errorMessage: error) + } + + }, completion: { S3PrivateUploadParams in + completion(S3PrivateUploadParams) + }) +} + // API func s3UploadFileOfKind(kind: S3UploadParams.Kind, inFilePath filePath: String?, orFileData fileData: NSData?, mimeType: String, failureHandler: ((Reason, String?) -> ())?, completion: S3UploadParams -> ()) { @@ -222,22 +182,3 @@ func s3UploadFileOfKind(kind: S3UploadParams.Kind, inFilePath filePath: String?, } } -/* -func s3PublicUploadFile(inFilePath filePath: String?, orFileData fileData: NSData?, mimeType: String, failureHandler: ((Reason, String?) -> ())?, completion: S3UploadParams -> ()) { - - s3PublicUploadParams(failureHandler: failureHandler) { s3UploadParams in - uploadFileToS3(inFilePath: filePath, orFileData: fileData, mimeType: mimeType, s3UploadParams: s3UploadParams, failureHandler: failureHandler) { - completion(s3UploadParams) - } - } -} - -func s3PrivateUploadFile(inFilePath filePath: String?, orFileData fileData: NSData?, mimeType: String, failureHandler: ((Reason, String?) -> ())?, completion: S3UploadParams -> ()) { - - s3PrivateUploadParams(failureHandler: failureHandler) { s3UploadParams in - uploadFileToS3(inFilePath: filePath, orFileData: fileData, mimeType: mimeType, s3UploadParams: s3UploadParams, failureHandler: failureHandler) { - completion(s3UploadParams) - } - } -} -*/ From 4fc5f42accdaa55a9eb31f8728f100be775c0951 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 2 Oct 2015 11:57:42 +0800 Subject: [PATCH 55/58] new logic for unread message (not paging) --- Yep/Services/YepService.swift | 37 ++++++++++++++++++++--------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index 4f877642..e910a08e 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -1504,25 +1504,24 @@ func sentButUnreadMessages(failureHandler failureHandler: ((Reason, String?) -> func unreadMessages(completion completion: [JSONDictionary] -> Void) { + headUnreadMessages { result in + + var messages = [JSONDictionary]() + + if let page1Messages = result["messages"] as? [JSONDictionary] { + messages += page1Messages + } + if let count = result["count"] as? Int, let currentPage = result["current_page"] as? Int, let perPage = result["per_page"] as? Int { + if count <= currentPage * perPage { - if let messages = result["messages"] as? [JSONDictionary] { - completion(messages) - } else { - completion([]) - } + completion(messages) } else { - var messages = [JSONDictionary]() - - if let page1Messages = result["messages"] as? [JSONDictionary] { - messages += page1Messages - } - // We have more messages let downloadGroup = dispatch_group_create() @@ -1532,11 +1531,13 @@ func unreadMessages(completion completion: [JSONDictionary] -> Void) { moreUnreadMessages(inPage: page, withPerPage: perPage, failureHandler: { (reason, errorMessage) in dispatch_group_leave(downloadGroup) - }, completion: { result in - if let currentPageMessages = result["messages"] as? [JSONDictionary] { - messages += currentPageMessages - } - dispatch_group_leave(downloadGroup) + + }, completion: { result in + if let currentPageMessages = result["messages"] as? [JSONDictionary] { + messages += currentPageMessages + } + + dispatch_group_leave(downloadGroup) }) } @@ -1544,6 +1545,10 @@ func unreadMessages(completion completion: [JSONDictionary] -> Void) { completion(messages) } } + + } else { + // 可能无分页 + completion(messages) } } } From 07df6c7e79a1193c54e289498c9590632bcf95c2 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 2 Oct 2015 12:03:52 +0800 Subject: [PATCH 56/58] clean code --- .../ConversationViewController.swift | 8 --- .../Feeds/FeedsViewController.swift | 61 ------------------- .../NewFeed/NewFeedViewController.swift | 19 +----- 3 files changed, 2 insertions(+), 86 deletions(-) diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index 77f81dfc..c8bf3795 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -2544,18 +2544,10 @@ extension ConversationViewController: UICollectionViewDataSource, UICollectionVi if let dragBeginLocation = dragBeginLocation { let location = scrollView.panGestureRecognizer.locationInView(view) let deltaY = location.y - dragBeginLocation.y - println(deltaY) if deltaY < -30 { tryFoldFeedView() } - - /* - let fullDeltaHeight = FeedView.normalHeight - FeedView.foldHeight - let currentHeight = max(min(FeedView.normalHeight + deltaY, FeedView.normalHeight), FeedView.foldHeight) - //feedView?.frame.size.height = currentHeight - feedView?.foldProgress = (FeedView.normalHeight - currentHeight) / fullDeltaHeight - */ } } diff --git a/Yep/ViewControllers/Feeds/FeedsViewController.swift b/Yep/ViewControllers/Feeds/FeedsViewController.swift index 663616e4..e686025a 100644 --- a/Yep/ViewControllers/Feeds/FeedsViewController.swift +++ b/Yep/ViewControllers/Feeds/FeedsViewController.swift @@ -53,15 +53,6 @@ class FeedsViewController: UIViewController { feedsTableView.tableFooterView = UIView() updateFeeds() - - /* - myFeedsAtPageIndex(1, perPage: 100, failureHandler: { reason, errorMessage in - defaultFailureHandler(reason, errorMessage: errorMessage) - }, completion: { [weak self] feeds in - self?.feeds = feeds - println("myFeeds.count: \(feeds.count)") - }) - */ } // MARK: - Actions @@ -189,55 +180,3 @@ extension FeedsViewController: UITableViewDataSource, UITableViewDelegate { } } -/* -extension FeedsViewController: UICollectionViewDataSource, UICollectionViewDelegate { - - func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { - return 1 - } - - func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { - return feeds.count - } - - func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { - let cell = collectionView.dequeueReusableCellWithReuseIdentifier(feedCellID, forIndexPath: indexPath) as! FeedCell - - let feed = feeds[indexPath.item] - - cell.configureWithFeed(feed) - - //cell.backgroundColor = indexPath.item % 2 == 0 ? UIColor.yellowColor() : UIColor.purpleColor() - - return cell - } - - func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { - - let feed = feeds[indexPath.item] - - return CGSize(width: collectionViewWidth, height: heightOfFeed(feed)) - } - - func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { - return UIEdgeInsets(top: 10, left: 0, bottom: 10, right: 0) - } - - func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) { - - performSegueWithIdentifier("showConversation", sender: indexPath.item) - } - - func collectionView(collectionView: UICollectionView, didHighlightItemAtIndexPath indexPath: NSIndexPath) { - - let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FeedCell - cell.contentView.backgroundColor = UIColor.lightGrayColor().colorWithAlphaComponent(0.5) - } - - func collectionView(collectionView: UICollectionView, didUnhighlightItemAtIndexPath indexPath: NSIndexPath) { - - let cell = collectionView.cellForItemAtIndexPath(indexPath) as! FeedCell - cell.contentView.backgroundColor = UIColor.clearColor() - } -} -*/ diff --git a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift index dbe86737..6f709964 100644 --- a/Yep/ViewControllers/NewFeed/NewFeedViewController.swift +++ b/Yep/ViewControllers/NewFeed/NewFeedViewController.swift @@ -54,7 +54,6 @@ class NewFeedViewController: UIViewController { mediaCollectionView.registerNib(UINib(nibName: feedMediaAddCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaAddCellID) mediaCollectionView.registerNib(UINib(nibName: feedMediaCellID, bundle: nil), forCellWithReuseIdentifier: feedMediaCellID) - mediaCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "cell") mediaCollectionView.contentInset.left = 20 mediaCollectionView.dataSource = self mediaCollectionView.delegate = self @@ -136,7 +135,7 @@ class NewFeedViewController: UIViewController { let imageInfosData = allS3UploadParams.map({ [ "file": $0.key, - "metadata": "", // TODO: metadata + "metadata": "", // TODO: metadata, maybe not need ] }) @@ -144,19 +143,6 @@ class NewFeedViewController: UIViewController { "image": imageInfosData, ] - /* - guard let - mediaData = try? NSJSONSerialization.dataWithJSONObject(mediaInfo, options: []), - mediaDataString = NSString(data: mediaData, encoding: NSUTF8StringEncoding) as? String else { - - YepHUD.hideActivityIndicator() - - return - } - - println("mediaDataString: \(mediaDataString)") - */ - createFeedWithMessage(message, attachments: mediaInfo, coordinate: coordinate, skill: nil, allowComment: true, failureHandler: { [weak self] reason, errorMessage in defaultFailureHandler(reason, errorMessage: errorMessage) @@ -216,8 +202,7 @@ extension NewFeedViewController: UICollectionViewDataSource, UICollectionViewDel return cell default: - let cell = collectionView.dequeueReusableCellWithReuseIdentifier("cell", forIndexPath: indexPath) - return cell + return UICollectionViewCell() } } From 97c23b2d9b5f5d53cff1565502e38b8e5b6aab93 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 2 Oct 2015 12:07:07 +0800 Subject: [PATCH 57/58] not need use Model Feed now --- Yep/AppDelegate.swift | 2 +- Yep/Realm/Models.swift | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Yep/AppDelegate.swift b/Yep/AppDelegate.swift index 65cfc02a..c1077bfc 100644 --- a/Yep/AppDelegate.swift +++ b/Yep/AppDelegate.swift @@ -40,7 +40,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate { let directory: NSURL = NSFileManager.defaultManager().containerURLForSecurityApplicationGroupIdentifier(YepConfig.appGroupID)! let realmPath = directory.URLByAppendingPathComponent("db.realm").path! - return Realm.Configuration(path: realmPath, schemaVersion: 2, migrationBlock: { migration, oldSchemaVersion in + return Realm.Configuration(path: realmPath, schemaVersion: 1, migrationBlock: { migration, oldSchemaVersion in }) } diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 0275f06e..2aca8ee7 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -401,6 +401,7 @@ enum AttachmentKind: String { case Video = "video" } +/* class Attachment: Object { dynamic var kind: String = "" @@ -423,7 +424,7 @@ class Feed: Object { dynamic var skill: UserSkill? dynamic var group: Group? } - +*/ // MARK: Helpers From ca09848e84f70b900b910f4ecc871112de8e5118 Mon Sep 17 00:00:00 2001 From: nixzhu Date: Fri, 2 Oct 2015 12:57:40 +0800 Subject: [PATCH 58/58] new messagesFromRecipient for Feed conversation sync --- Yep/Realm/Models.swift | 30 +++++++- Yep/Services/YepService.swift | 69 +++++++++++++++++++ .../ConversationViewController.swift | 16 +++++ 3 files changed, 114 insertions(+), 1 deletion(-) diff --git a/Yep/Realm/Models.swift b/Yep/Realm/Models.swift index 2aca8ee7..bbbf1440 100644 --- a/Yep/Realm/Models.swift +++ b/Yep/Realm/Models.swift @@ -362,6 +362,7 @@ enum ConversationType: Int { class Conversation: Object { var fakeID: String? { + switch type { case ConversationType.OneToOne.rawValue: if let withFriend = withFriend { @@ -372,7 +373,34 @@ class Conversation: Object { return "group" + withGroup.groupID } default: - break + return nil + } + + return nil + } + + var recipientID: String? { + + switch type { + case ConversationType.OneToOne.rawValue: + if let withFriend = withFriend { + return withFriend.userID + } + case ConversationType.Group.rawValue: + if let withGroup = withGroup { + return withGroup.groupID + } + default: + return nil + } + + return nil + } + + var recipient: Recipient? { + + if let recipientType = ConversationType(rawValue: type), recipientID = recipientID { + return Recipient(type: recipientType, ID: recipientID) } return nil diff --git a/Yep/Services/YepService.swift b/Yep/Services/YepService.swift index e910a08e..cd6cafbc 100644 --- a/Yep/Services/YepService.swift +++ b/Yep/Services/YepService.swift @@ -1553,6 +1553,75 @@ func unreadMessages(completion completion: [JSONDictionary] -> Void) { } } +struct Recipient { + + let type: ConversationType + let ID: String +} + +enum TimeDirection { + + case Future(minMessageID: String) + case Past(maxMessageID: String) + case None +} + +func messagesFromRecipient(recipient: Recipient, withTimeDirection timeDirection: TimeDirection, failureHandler: ((Reason, String?) -> Void)?, completion: Bool -> Void) { + + var requestParameters = [ + "recipient_type": recipient.type.nameForServer, + "recipient_id": recipient.ID, + ] + + switch timeDirection { + case .Future(let minMessageID): + requestParameters["min_id"] = minMessageID + case .Past(let maxMessageID): + requestParameters["max_id"] = maxMessageID + case .None: + break + } + + let parse: JSONDictionary -> Bool? = { data in + + guard let unreadMessagesData = data["messages"] as? [JSONDictionary] else { + return false + } + + println("messagesFromRecipient: \(recipient), \(unreadMessagesData.count)") + + dispatch_async(dispatch_get_main_queue()) { + + guard let realm = try? Realm() else { + return + } + + var messageIDs = [String]() + + for messageInfo in unreadMessagesData { + syncMessageWithMessageInfo(messageInfo, inRealm: realm) { _messageIDs in + messageIDs += _messageIDs + } + } + + if !messageIDs.isEmpty { + let object = ["messageIDs": messageIDs] + NSNotificationCenter.defaultCenter().postNotificationName(YepNewMessagesReceivedNotification, object: object) + } + } + + return true + } + + let resource = authJsonResource(path: "/api/v1/\(recipient.type.nameForServer)/\(recipient.ID)/messages/unread", method: .GET, requestParameters: requestParameters, parse: parse ) + + if let failureHandler = failureHandler { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: failureHandler, completion: completion) + } else { + apiRequest({_ in}, baseURL: baseURL, resource: resource, failure: defaultFailureHandler, completion: completion) + } +} + func createMessageWithMessageInfo(messageInfo: JSONDictionary, failureHandler: ((Reason, String?) -> Void)?, completion: (messageID: String) -> Void) { println("Message info \(messageInfo)") diff --git a/Yep/ViewControllers/Conversation/ConversationViewController.swift b/Yep/ViewControllers/Conversation/ConversationViewController.swift index c8bf3795..24158a82 100644 --- a/Yep/ViewControllers/Conversation/ConversationViewController.swift +++ b/Yep/ViewControllers/Conversation/ConversationViewController.swift @@ -329,6 +329,22 @@ class ConversationViewController: BaseViewController { } } } + + // sync unread messages + + if let recipient = conversation.recipient { + + let timeDirection: TimeDirection + if let minMessageID = messages.last?.messageID { + timeDirection = .Future(minMessageID: minMessageID) + } else { + timeDirection = .None + } + + messagesFromRecipient(recipient, withTimeDirection: timeDirection, failureHandler: nil, completion: { success in + println("messagesFromRecipient: \(success)") + }) + } }