diff --git a/Yep.xcodeproj/project.pbxproj b/Yep.xcodeproj/project.pbxproj index cd760dd1..cda1f661 100644 --- a/Yep.xcodeproj/project.pbxproj +++ b/Yep.xcodeproj/project.pbxproj @@ -41,6 +41,14 @@ 502AE5381AB866E3005BD199 /* LoginVerifyMobileViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE5371AB866E3005BD199 /* LoginVerifyMobileViewController.swift */; }; 502AE53A1AB871C1005BD199 /* YepAlert.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE5391AB871C1005BD199 /* YepAlert.swift */; }; 502AE53D1AB87C0D005BD199 /* YepUserDefaults.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE53C1AB87C0D005BD199 /* YepUserDefaults.swift */; }; + 502AE5401AB88862005BD199 /* SkillRankCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE53E1AB88862005BD199 /* SkillRankCell.swift */; }; + 502AE5411AB88862005BD199 /* SkillRankCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 502AE53F1AB88862005BD199 /* SkillRankCell.xib */; }; + 502AE54E1AB93175005BD199 /* ProfileHeaderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE54C1AB93175005BD199 /* ProfileHeaderCell.swift */; }; + 502AE54F1AB93175005BD199 /* ProfileHeaderCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 502AE54D1AB93175005BD199 /* ProfileHeaderCell.xib */; }; + 502AE5531AB93215005BD199 /* ProfileFooterCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE5511AB93215005BD199 /* ProfileFooterCell.swift */; }; + 502AE5541AB93215005BD199 /* ProfileFooterCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 502AE5521AB93215005BD199 /* ProfileFooterCell.xib */; }; + 502AE5581AB932D5005BD199 /* ProfileSectionHeaderReusableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 502AE5561AB932D5005BD199 /* ProfileSectionHeaderReusableView.swift */; }; + 502AE5591AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib in Resources */ = {isa = PBXBuildFile; fileRef = 502AE5571AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -92,6 +100,14 @@ 502AE5371AB866E3005BD199 /* LoginVerifyMobileViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = LoginVerifyMobileViewController.swift; path = ViewControllers/Login/LoginVerifyMobileViewController.swift; sourceTree = ""; }; 502AE5391AB871C1005BD199 /* YepAlert.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepAlert.swift; path = Helpers/YepAlert.swift; sourceTree = ""; }; 502AE53C1AB87C0D005BD199 /* YepUserDefaults.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = YepUserDefaults.swift; path = Helpers/YepUserDefaults.swift; sourceTree = ""; }; + 502AE53E1AB88862005BD199 /* SkillRankCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = SkillRankCell.swift; path = Views/Cells/SkillRank/SkillRankCell.swift; sourceTree = ""; }; + 502AE53F1AB88862005BD199 /* SkillRankCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = SkillRankCell.xib; path = Views/Cells/SkillRank/SkillRankCell.xib; sourceTree = ""; }; + 502AE54C1AB93175005BD199 /* ProfileHeaderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProfileHeaderCell.swift; path = Views/Cells/ProfileHeader/ProfileHeaderCell.swift; sourceTree = ""; }; + 502AE54D1AB93175005BD199 /* ProfileHeaderCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ProfileHeaderCell.xib; path = Views/Cells/ProfileHeader/ProfileHeaderCell.xib; sourceTree = ""; }; + 502AE5511AB93215005BD199 /* ProfileFooterCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProfileFooterCell.swift; path = Views/Cells/ProfileFooter/ProfileFooterCell.swift; sourceTree = ""; }; + 502AE5521AB93215005BD199 /* ProfileFooterCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ProfileFooterCell.xib; path = Views/Cells/ProfileFooter/ProfileFooterCell.xib; sourceTree = ""; }; + 502AE5561AB932D5005BD199 /* ProfileSectionHeaderReusableView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = ProfileSectionHeaderReusableView.swift; path = Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.swift; sourceTree = ""; }; + 502AE5571AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; name = ProfileSectionHeaderReusableView.xib; path = Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.xib; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -238,6 +254,7 @@ 5023DE3A1AB697A700B3EE96 /* Cells */, 502AE5221AB71C82005BD199 /* Buttons */, 502AE52F1AB8387D005BD199 /* TextFields */, + 502AE5471AB89A73005BD199 /* ReusableViews */, ); name = Views; sourceTree = ""; @@ -246,6 +263,9 @@ isa = PBXGroup; children = ( 5023DE3B1AB697B000B3EE96 /* Conversation */, + 502AE5421AB88866005BD199 /* SkillRank */, + 502AE5501AB93178005BD199 /* ProfileHeader */, + 502AE5551AB93218005BD199 /* ProfileFooter */, ); name = Cells; sourceTree = ""; @@ -348,6 +368,50 @@ name = Helpers; sourceTree = ""; }; + 502AE5421AB88866005BD199 /* SkillRank */ = { + isa = PBXGroup; + children = ( + 502AE53E1AB88862005BD199 /* SkillRankCell.swift */, + 502AE53F1AB88862005BD199 /* SkillRankCell.xib */, + ); + name = SkillRank; + sourceTree = ""; + }; + 502AE5471AB89A73005BD199 /* ReusableViews */ = { + isa = PBXGroup; + children = ( + 502AE55A1AB932D9005BD199 /* ProfileSectionHeader */, + ); + name = ReusableViews; + sourceTree = ""; + }; + 502AE5501AB93178005BD199 /* ProfileHeader */ = { + isa = PBXGroup; + children = ( + 502AE54C1AB93175005BD199 /* ProfileHeaderCell.swift */, + 502AE54D1AB93175005BD199 /* ProfileHeaderCell.xib */, + ); + name = ProfileHeader; + sourceTree = ""; + }; + 502AE5551AB93218005BD199 /* ProfileFooter */ = { + isa = PBXGroup; + children = ( + 502AE5511AB93215005BD199 /* ProfileFooterCell.swift */, + 502AE5521AB93215005BD199 /* ProfileFooterCell.xib */, + ); + name = ProfileFooter; + sourceTree = ""; + }; + 502AE55A1AB932D9005BD199 /* ProfileSectionHeader */ = { + isa = PBXGroup; + children = ( + 502AE5561AB932D5005BD199 /* ProfileSectionHeaderReusableView.swift */, + 502AE5571AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib */, + ); + name = ProfileSectionHeader; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -431,11 +495,15 @@ files = ( 5023DE4E1AB6B19300B3EE96 /* scarlett.png in Resources */, 5023DE381AB6979600B3EE96 /* ConversationCell.xib in Resources */, + 502AE5591AB932D5005BD199 /* ProfileSectionHeaderReusableView.xib in Resources */, + 502AE5411AB88862005BD199 /* SkillRankCell.xib in Resources */, + 502AE5541AB93215005BD199 /* ProfileFooterCell.xib in Resources */, 5023DE4B1AB6B19300B3EE96 /* kevin.png in Resources */, 5023DE4A1AB6B19300B3EE96 /* jony.png in Resources */, 5023DE4D1AB6B19300B3EE96 /* robert.png in Resources */, 0A8F54B61AB67D11004AD60E /* Main.storyboard in Resources */, 5023DE4C1AB6B19300B3EE96 /* nixzhu.png in Resources */, + 502AE54F1AB93175005BD199 /* ProfileHeaderCell.xib in Resources */, 0A8F54BB1AB67D11004AD60E /* LaunchScreen.xib in Resources */, 0A8F54B81AB67D11004AD60E /* Images.xcassets in Resources */, 502AE5191AB70D72005BD199 /* Intro.storyboard in Resources */, @@ -457,7 +525,9 @@ buildActionMask = 2147483647; files = ( 502AE5311AB85067005BD199 /* RegisterPickMobileViewController.swift in Sources */, + 502AE5581AB932D5005BD199 /* ProfileSectionHeaderReusableView.swift in Sources */, 502AE5211AB71C7E005BD199 /* BorderButton.swift in Sources */, + 502AE54E1AB93175005BD199 /* ProfileHeaderCell.swift in Sources */, 502AE5381AB866E3005BD199 /* LoginVerifyMobileViewController.swift in Sources */, 5023DE331AB688F600B3EE96 /* UIColor+Yep.swift in Sources */, 0A8F54B11AB67D11004AD60E /* AppDelegate.swift in Sources */, @@ -465,6 +535,7 @@ 502AE51B1AB70DDB005BD199 /* WelcomeViewController.swift in Sources */, 5023DE591AB6DBC100B3EE96 /* UIImage+Yep.swift in Sources */, 502AE5331AB86020005BD199 /* RegisterVerifyMobileViewController.swift in Sources */, + 502AE5401AB88862005BD199 /* SkillRankCell.swift in Sources */, 5023DE2D1AB685ED00B3EE96 /* DiscoverViewController.swift in Sources */, 502AE53A1AB871C1005BD199 /* YepAlert.swift in Sources */, 502AE52E1AB83879005BD199 /* UnderLineTextField.swift in Sources */, @@ -478,6 +549,7 @@ 5023DE371AB6979600B3EE96 /* ConversationCell.swift in Sources */, 502AE5351AB8649F005BD199 /* LoginByMobileViewController.swift in Sources */, 502AE52B1AB819AF005BD199 /* YepConfig.swift in Sources */, + 502AE5531AB93215005BD199 /* ProfileFooterCell.swift in Sources */, 5023DE521AB6C51300B3EE96 /* CGRect+Yep.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/Yep/Base.lproj/Main.storyboard b/Yep/Base.lproj/Main.storyboard index 96b907ab..6a409d6f 100644 --- a/Yep/Base.lproj/Main.storyboard +++ b/Yep/Base.lproj/Main.storyboard @@ -91,9 +91,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/ViewControllers/Profile/ProfileViewController.swift b/Yep/ViewControllers/Profile/ProfileViewController.swift index d05b7aa5..1bf5e703 100644 --- a/Yep/ViewControllers/Profile/ProfileViewController.swift +++ b/Yep/ViewControllers/Profile/ProfileViewController.swift @@ -8,29 +8,156 @@ import UIKit +let skillRanckCellIdentifier = "SkillRankCell" +let headerCellIdentifier = "ProfileHeaderCell" +let footerCellIdentifier = "ProfileFooterCell" +let sectionHeaderIdentifier = "ProfileSectionHeaderReusableView" +let sectionFooterIdentifier = "ProfileSectionFooterReusableView" + +let screenWidth = UIScreen.mainScreen().bounds.width +let sectionLeftEdgeInset: CGFloat = 20 +let sectionRightEdgeInset = sectionLeftEdgeInset +let sectionBottomEdgeInset: CGFloat = 20 +let cellWidth = (screenWidth - (sectionLeftEdgeInset + sectionRightEdgeInset)) / 3 + +let introductionText = "I would like to learn Design or Speech, I can teach you iOS Dev in return. 😃" + + class ProfileViewController: UIViewController { + @IBOutlet weak var profileCollectionView: UICollectionView! + override func viewDidLoad() { super.viewDidLoad() - // Do any additional setup after loading the view. - view.backgroundColor = UIColor.darkGrayColor() - } + profileCollectionView.registerNib(UINib(nibName: skillRanckCellIdentifier, bundle: nil), forCellWithReuseIdentifier: skillRanckCellIdentifier) + profileCollectionView.registerNib(UINib(nibName: headerCellIdentifier, bundle: nil), forCellWithReuseIdentifier: headerCellIdentifier) + profileCollectionView.registerNib(UINib(nibName: footerCellIdentifier, bundle: nil), forCellWithReuseIdentifier: footerCellIdentifier) + profileCollectionView.registerNib(UINib(nibName: sectionHeaderIdentifier, bundle: nil), forSupplementaryViewOfKind: UICollectionElementKindSectionHeader, withReuseIdentifier: sectionHeaderIdentifier) + profileCollectionView.registerClass(UICollectionReusableView.self, forSupplementaryViewOfKind: UICollectionElementKindSectionFooter, withReuseIdentifier: sectionFooterIdentifier) - override func didReceiveMemoryWarning() { - super.didReceiveMemoryWarning() - // Dispose of any resources that can be recreated. } - - - /* - // MARK: - Navigation - - // In a storyboard-based application, you will often want to do a little preparation before navigation - override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { - // Get the new view controller using segue.destinationViewController. - // Pass the selected object to the new view controller. - } - */ } + +extension ProfileViewController: UICollectionViewDataSource, UICollectionViewDelegate { + + enum ProfileSection: Int { + case Header = 0 + case Master + case Learning + case Footer + } + + func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { + return 4 + } + + func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { + switch section { + case ProfileSection.Header.rawValue: + return 1 + case ProfileSection.Master.rawValue: + return 5 + case ProfileSection.Learning.rawValue: + return 2 + case ProfileSection.Footer.rawValue: + return 1 + default: + return 0 + } + } + + func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { + switch indexPath.section { + case ProfileSection.Header.rawValue: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(headerCellIdentifier, forIndexPath: indexPath) as! ProfileHeaderCell + return cell + case ProfileSection.Master.rawValue: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(skillRanckCellIdentifier, forIndexPath: indexPath) as! SkillRankCell + return cell + case ProfileSection.Learning.rawValue: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(skillRanckCellIdentifier, forIndexPath: indexPath) as! SkillRankCell + return cell + case ProfileSection.Footer.rawValue: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(footerCellIdentifier, forIndexPath: indexPath) as! ProfileFooterCell + cell.introductionLabel.text = introductionText + return cell + default: + let cell = collectionView.dequeueReusableCellWithReuseIdentifier(skillRanckCellIdentifier, forIndexPath: indexPath) as! SkillRankCell + return cell + } + } + + func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { + if kind == UICollectionElementKindSectionHeader { + let header = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: sectionHeaderIdentifier, forIndexPath: indexPath) as! ProfileSectionHeaderReusableView + + switch indexPath.section { + case ProfileSection.Header.rawValue: + header.titleLabel.text = "" + case ProfileSection.Master.rawValue: + header.titleLabel.text = NSLocalizedString("Master", comment: "") + case ProfileSection.Learning.rawValue: + header.titleLabel.text = NSLocalizedString("Learning", comment: "") + case ProfileSection.Footer.rawValue: + header.titleLabel.text = NSLocalizedString("Introduction", comment: "") + default: + header.titleLabel.text = "" + } + + return header + } else { + let footer = collectionView.dequeueReusableSupplementaryViewOfKind(kind, withReuseIdentifier: sectionFooterIdentifier, forIndexPath: indexPath) as! UICollectionReusableView + return footer + } + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets { + switch section { + case ProfileSection.Header.rawValue: + return UIEdgeInsets(top: 0, left: 0, bottom: sectionBottomEdgeInset, right: 0) + case ProfileSection.Master.rawValue: + return UIEdgeInsets(top: 0, left: sectionLeftEdgeInset, bottom: sectionBottomEdgeInset, right: sectionRightEdgeInset) + case ProfileSection.Learning.rawValue: + return UIEdgeInsets(top: 0, left: sectionLeftEdgeInset, bottom: sectionBottomEdgeInset, right: sectionRightEdgeInset) + case ProfileSection.Footer.rawValue: + return UIEdgeInsets(top: 0, left: 0, bottom: sectionBottomEdgeInset, right: 0) + default: + return UIEdgeInsetsZero + } + } + + func collectionView(collectionView: UICollectionView!, layout collectionViewLayout: UICollectionViewLayout!, sizeForItemAtIndexPath indexPath: NSIndexPath!) -> CGSize { + switch indexPath.section { + case ProfileSection.Header.rawValue: + return CGSizeMake(screenWidth, 250) + case ProfileSection.Master.rawValue: + return CGSizeMake(cellWidth, 40) + case ProfileSection.Learning.rawValue: + return CGSizeMake(cellWidth, 40) + case ProfileSection.Footer.rawValue: + + let attributes = [NSFontAttributeName: UIFont(name: "HelveticaNeue-Thin", size: 12)!] + let rect = introductionText.boundingRectWithSize(CGSize(width: screenWidth - 20*2, height: CGFloat(FLT_MAX)), options: .UsesLineFragmentOrigin | .UsesFontLeading, attributes:attributes, context:nil) + + return CGSizeMake(screenWidth, ceil(rect.height)) + default: + return CGSizeMake(cellWidth, 40) + } + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForHeaderInSection section: Int) -> CGSize { + if section == ProfileSection.Header.rawValue { + return CGSizeMake(screenWidth, 0) + } else { + return CGSizeMake(screenWidth, 40) + } + } + + func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, referenceSizeForFooterInSection section: Int) -> CGSize { + return CGSizeMake(screenWidth, 0) + } +} + + diff --git a/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.swift b/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.swift new file mode 100644 index 00000000..4416d64c --- /dev/null +++ b/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.swift @@ -0,0 +1,20 @@ +// +// ProfileFooterCell.swift +// Yep +// +// Created by NIX on 15/3/18. +// Copyright (c) 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class ProfileFooterCell: UICollectionViewCell { + + @IBOutlet weak var introductionLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + +} diff --git a/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.xib b/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.xib new file mode 100644 index 00000000..3d93c2ed --- /dev/null +++ b/Yep/Views/Cells/ProfileFooter/ProfileFooterCell.xib @@ -0,0 +1,36 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.swift b/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.swift new file mode 100644 index 00000000..7abc2713 --- /dev/null +++ b/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.swift @@ -0,0 +1,43 @@ +// +// ProfileHeaderCell.swift +// Yep +// +// Created by NIX on 15/3/18. +// Copyright (c) 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class ProfileHeaderCell: UICollectionViewCell { + + @IBOutlet weak var avatarImageView: UIImageView! + @IBOutlet weak var nameLabel: UILabel! + @IBOutlet weak var joinedDateLabel: UILabel! + @IBOutlet weak var locationLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + + avatarImageView.alpha = 0 + + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)) { + if let avatarURLString = YepUserDefaults.avatarURLString() { + if let url = NSURL(string: avatarURLString) { + if let data = NSData(contentsOfURL: url) { + let image = UIImage(data: data) + + dispatch_async(dispatch_get_main_queue()) { + self.avatarImageView.image = image + + UIView.animateWithDuration(0.5, delay: 0.0, options: .CurveEaseOut, animations: { () -> Void in + self.avatarImageView.alpha = 1 + }, completion: { (finished) -> Void in + }) + } + } + } + } + } + } + +} diff --git a/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.xib b/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.xib new file mode 100644 index 00000000..6724a30e --- /dev/null +++ b/Yep/Views/Cells/ProfileHeader/ProfileHeaderCell.xib @@ -0,0 +1,62 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/Views/Cells/SkillRank/SkillRankCell.swift b/Yep/Views/Cells/SkillRank/SkillRankCell.swift new file mode 100644 index 00000000..7f447d45 --- /dev/null +++ b/Yep/Views/Cells/SkillRank/SkillRankCell.swift @@ -0,0 +1,21 @@ +// +// SkillRankCell.swift +// Yep +// +// Created by NIX on 15/3/18. +// Copyright (c) 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class SkillRankCell: UICollectionViewCell { + + @IBOutlet weak var skillLabel: UILabel! + @IBOutlet weak var rankView: UIView! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + +} diff --git a/Yep/Views/Cells/SkillRank/SkillRankCell.xib b/Yep/Views/Cells/SkillRank/SkillRankCell.xib new file mode 100644 index 00000000..d3c9983e --- /dev/null +++ b/Yep/Views/Cells/SkillRank/SkillRankCell.xib @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.swift b/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.swift new file mode 100644 index 00000000..2bc7d7c6 --- /dev/null +++ b/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.swift @@ -0,0 +1,20 @@ +// +// ProfileSectionHeaderReusableView.swift +// Yep +// +// Created by NIX on 15/3/18. +// Copyright (c) 2015年 Catch Inc. All rights reserved. +// + +import UIKit + +class ProfileSectionHeaderReusableView: UICollectionReusableView { + + @IBOutlet weak var titleLabel: UILabel! + + override func awakeFromNib() { + super.awakeFromNib() + // Initialization code + } + +} diff --git a/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.xib b/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.xib new file mode 100644 index 00000000..0baf45b7 --- /dev/null +++ b/Yep/Views/ReusableViews/ProfileSectionHeader/ProfileSectionHeaderReusableView.xib @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + + + + + + + + + + +