From b764e74c65ff204b20552fedd69ae08cdf67e337 Mon Sep 17 00:00:00 2001 From: JohnLui Date: Sat, 2 May 2015 00:58:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=86=8D=E9=80=A0=20=E2=80=9C=E6=89=8B?= =?UTF-8?q?=E6=9C=BAQQ=E2=80=9D=20=E4=BE=A7=E6=BB=91=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=EF=BC=88=E5=9B=9B=EF=BC=89=E2=80=94=E2=80=94=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=20TabBar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++ SwiftSideslipLikeQQ.xcodeproj/project.pbxproj | 8 +++ .../SwiftSideslipLikeQQ.xccheckout | 4 +- .../UserInterfaceState.xcuserstate | Bin 36110 -> 38058 bytes .../Base.lproj/Main.storyboard | 48 +++++++++++++++- SwiftSideslipLikeQQ/Common.swift | 2 + SwiftSideslipLikeQQ/LeftViewController.swift | 8 +-- .../MainTabBarController.swift | 48 ++++++++++++++++ SwiftSideslipLikeQQ/MainTabBarController.xib | 53 ++++++++++++++++++ .../OtherPageViewController.swift | 1 + SwiftSideslipLikeQQ/ViewController.swift | 26 +++++++-- 11 files changed, 189 insertions(+), 14 deletions(-) create mode 100644 SwiftSideslipLikeQQ/MainTabBarController.swift create mode 100644 SwiftSideslipLikeQQ/MainTabBarController.xib diff --git a/README.md b/README.md index 72da453..8942f5d 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,11 @@ ![pic](http://lvwenhan.com/content/uploadfile/201504/8f171428840820.gif) +###番外篇:【再造 “手机QQ” 侧滑菜单(四)——增加 TabBar】较简单不再成文。 +实现效果: + +![pic](http://staticonsae.sinaapp.com/images/9.gif) + 有问题请直接在文章下面留言。 diff --git a/SwiftSideslipLikeQQ.xcodeproj/project.pbxproj b/SwiftSideslipLikeQQ.xcodeproj/project.pbxproj index b4135a3..1d10b90 100644 --- a/SwiftSideslipLikeQQ.xcodeproj/project.pbxproj +++ b/SwiftSideslipLikeQQ.xcodeproj/project.pbxproj @@ -16,6 +16,8 @@ 465933151AD7F60700969878 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 465933131AD7F60700969878 /* LaunchScreen.xib */; }; 465933211AD7F60700969878 /* SwiftSideslipLikeQQTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 465933201AD7F60700969878 /* SwiftSideslipLikeQQTests.swift */; }; 4659332B1AD7FB0E00969878 /* HomeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4659332A1AD7FB0E00969878 /* HomeViewController.swift */; }; + 46617ED61AF3E4C5008F038F /* MainTabBarController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 46617ED41AF3E4C5008F038F /* MainTabBarController.swift */; }; + 46617ED71AF3E4C5008F038F /* MainTabBarController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 46617ED51AF3E4C5008F038F /* MainTabBarController.xib */; }; 466C00881AD832D9002ED354 /* Common.swift in Sources */ = {isa = PBXBuildFile; fileRef = 466C00871AD832D9002ED354 /* Common.swift */; }; 466C008D1AD9071A002ED354 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 466C008C1AD9071A002ED354 /* README.md */; }; 466C008F1AD92447002ED354 /* LeftViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 466C008E1AD92447002ED354 /* LeftViewController.swift */; }; @@ -45,6 +47,8 @@ 4659331F1AD7F60700969878 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 465933201AD7F60700969878 /* SwiftSideslipLikeQQTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwiftSideslipLikeQQTests.swift; sourceTree = ""; }; 4659332A1AD7FB0E00969878 /* HomeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HomeViewController.swift; sourceTree = ""; }; + 46617ED41AF3E4C5008F038F /* MainTabBarController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MainTabBarController.swift; sourceTree = ""; }; + 46617ED51AF3E4C5008F038F /* MainTabBarController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = MainTabBarController.xib; sourceTree = ""; }; 466C00871AD832D9002ED354 /* Common.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Common.swift; sourceTree = ""; }; 466C008C1AD9071A002ED354 /* README.md */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 466C008E1AD92447002ED354 /* LeftViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LeftViewController.swift; sourceTree = ""; }; @@ -101,6 +105,8 @@ 465933131AD7F60700969878 /* LaunchScreen.xib */, 465933081AD7F60700969878 /* Supporting Files */, 466C00871AD832D9002ED354 /* Common.swift */, + 46617ED41AF3E4C5008F038F /* MainTabBarController.swift */, + 46617ED51AF3E4C5008F038F /* MainTabBarController.xib */, ); path = SwiftSideslipLikeQQ; sourceTree = ""; @@ -212,6 +218,7 @@ files = ( 465933101AD7F60700969878 /* Main.storyboard in Resources */, 465933151AD7F60700969878 /* LaunchScreen.xib in Resources */, + 46617ED71AF3E4C5008F038F /* MainTabBarController.xib in Resources */, 465933121AD7F60700969878 /* Images.xcassets in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -232,6 +239,7 @@ files = ( 4642DDB51ADA76DA00D0F32B /* SwiftColors.swift in Sources */, 466C00881AD832D9002ED354 /* Common.swift in Sources */, + 46617ED61AF3E4C5008F038F /* MainTabBarController.swift in Sources */, 4659330D1AD7F60700969878 /* ViewController.swift in Sources */, 466C008D1AD9071A002ED354 /* README.md in Sources */, 466C008F1AD92447002ED354 /* LeftViewController.swift in Sources */, diff --git a/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcshareddata/SwiftSideslipLikeQQ.xccheckout b/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcshareddata/SwiftSideslipLikeQQ.xccheckout index 972697c..ade6ae0 100644 --- a/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcshareddata/SwiftSideslipLikeQQ.xccheckout +++ b/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcshareddata/SwiftSideslipLikeQQ.xccheckout @@ -7,14 +7,14 @@ IDESourceControlProjectIdentifier 638A92D4-E7ED-492B-A10B-4FBA9A121445 IDESourceControlProjectName - SwiftSideslipLikeQQ + project IDESourceControlProjectOriginsDictionary B50A8E23391344F2DB4CCAF07401A5258B534E2C github.com:johnlui/SwiftSideslipLikeQQ.git IDESourceControlProjectPath - SwiftSideslipLikeQQ.xcodeproj + SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace IDESourceControlProjectRelativeInstallPathDictionary B50A8E23391344F2DB4CCAF07401A5258B534E2C diff --git a/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcuserdata/dren_a.xcuserdatad/UserInterfaceState.xcuserstate b/SwiftSideslipLikeQQ.xcodeproj/project.xcworkspace/xcuserdata/dren_a.xcuserdatad/UserInterfaceState.xcuserstate index ed414de566d70f842afe1732f699ccf4fdbd6f9e..42a3e69f5652dcafe668fece5bb7948078f94722 100644 GIT binary patch delta 20399 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 LD0%a1bj<$&eL9)f delta 18531 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 nXuQ?=~P!)1- diff --git a/SwiftSideslipLikeQQ/Base.lproj/Main.storyboard b/SwiftSideslipLikeQQ/Base.lproj/Main.storyboard index 37c4c80..944829e 100644 --- a/SwiftSideslipLikeQQ/Base.lproj/Main.storyboard +++ b/SwiftSideslipLikeQQ/Base.lproj/Main.storyboard @@ -1,7 +1,7 @@ - + - + @@ -264,6 +264,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftSideslipLikeQQ/Common.swift b/SwiftSideslipLikeQQ/Common.swift index e6d7fae..ff2a77b 100644 --- a/SwiftSideslipLikeQQ/Common.swift +++ b/SwiftSideslipLikeQQ/Common.swift @@ -11,4 +11,6 @@ import UIKit struct Common { static let screenWidth = UIScreen.mainScreen().applicationFrame.maxX static let screenHeight = UIScreen.mainScreen().applicationFrame.maxY + static let rootViewController = UIApplication.sharedApplication().keyWindow?.rootViewController as! ViewController + static let contactsVC = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("Contacts") as! UIViewController } diff --git a/SwiftSideslipLikeQQ/LeftViewController.swift b/SwiftSideslipLikeQQ/LeftViewController.swift index 6f5fc3d..ecd90ba 100644 --- a/SwiftSideslipLikeQQ/LeftViewController.swift +++ b/SwiftSideslipLikeQQ/LeftViewController.swift @@ -34,13 +34,13 @@ class LeftViewController: UIViewController, UITableViewDelegate, UITableViewData } func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { - let viewController = UIApplication.sharedApplication().keyWindow?.rootViewController as! ViewController - + let viewController = Common.rootViewController viewController.homeViewController.titleOfOtherPages = titlesDictionary[indexPath.row] viewController.homeViewController.performSegueWithIdentifier("showOtherPages", sender: self) - + Common.contactsVC.view.removeFromSuperview() + viewController.mainTabBarController.tabBar.hidden = true + viewController.mainTabBarController.selectedIndex = 0 viewController.showHome() - tableView.deselectRowAtIndexPath(indexPath, animated: false) } diff --git a/SwiftSideslipLikeQQ/MainTabBarController.swift b/SwiftSideslipLikeQQ/MainTabBarController.swift new file mode 100644 index 0000000..fdf45a2 --- /dev/null +++ b/SwiftSideslipLikeQQ/MainTabBarController.swift @@ -0,0 +1,48 @@ +// +// MainTabBarController.swift +// SwiftSideslipLikeQQ +// +// Created by JohnLui on 15/5/2. +// Copyright (c) 2015年 com.lvwenhan. All rights reserved. +// + +import UIKit + +class MainTabBarController: UITabBarController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + override func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem!) { + switch item.tag { + case 0: + Common.contactsVC.view.removeFromSuperview() + case 1: + Common.rootViewController.mainTabBarController.view.addSubview(Common.contactsVC.view) + Common.rootViewController.mainTabBarController.view.bringSubviewToFront(Common.rootViewController.mainTabBarController.tabBar) + case 2: + println("Just like case 1 ↑") + default: + break + } + } + + /* + // 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. + } + */ + +} diff --git a/SwiftSideslipLikeQQ/MainTabBarController.xib b/SwiftSideslipLikeQQ/MainTabBarController.xib new file mode 100644 index 0000000..9375d17 --- /dev/null +++ b/SwiftSideslipLikeQQ/MainTabBarController.xib @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/SwiftSideslipLikeQQ/OtherPageViewController.swift b/SwiftSideslipLikeQQ/OtherPageViewController.swift index 2a5805f..8243cca 100644 --- a/SwiftSideslipLikeQQ/OtherPageViewController.swift +++ b/SwiftSideslipLikeQQ/OtherPageViewController.swift @@ -35,6 +35,7 @@ class OtherPageViewController: UIViewController { func goBack() { self.navigationController?.popViewControllerAnimated(true) + Common.rootViewController.mainTabBarController.tabBar.hidden = false } /* diff --git a/SwiftSideslipLikeQQ/ViewController.swift b/SwiftSideslipLikeQQ/ViewController.swift index c8e1422..00ba60a 100644 --- a/SwiftSideslipLikeQQ/ViewController.swift +++ b/SwiftSideslipLikeQQ/ViewController.swift @@ -10,6 +10,9 @@ import UIKit class ViewController: UIViewController { + var mainTabBarController: MainTabBarController! + var tapGesture: UITapGestureRecognizer! + var homeNavigationController: UINavigationController! var homeViewController: HomeViewController! var leftViewController: LeftViewController! @@ -53,10 +56,20 @@ class ViewController: UIViewController { // 通过 StoryBoard 取出 HomeViewController 的 view,放在背景视图上面 mainView = UIView(frame: self.view.frame) + + let nibContents = NSBundle.mainBundle().loadNibNamed("MainTabBarController", owner: nil, options: nil) + mainTabBarController = nibContents.first as! MainTabBarController + + let tabBarView = mainTabBarController.view + mainView.addSubview(tabBarView) + homeNavigationController = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("HomeNavigationController") as! UINavigationController homeViewController = homeNavigationController.viewControllers.first as! HomeViewController - mainView.addSubview(homeViewController.navigationController!.view) - mainView.addSubview(homeViewController.view) + tabBarView.addSubview(homeViewController.navigationController!.view) + tabBarView.addSubview(homeViewController.view) + + tabBarView.bringSubviewToFront(mainTabBarController.tabBar) + self.view.addSubview(mainView) homeViewController.navigationItem.leftBarButtonItem?.action = Selector("showLeft") @@ -67,10 +80,8 @@ class ViewController: UIViewController { panGesture.addTarget(self, action: Selector("pan:")) mainView.addGestureRecognizer(panGesture) - // 绑定单击收起菜单 - let tapGesture = UITapGestureRecognizer(target: self, action: "showHome") - mainView.addGestureRecognizer(tapGesture) - + // 生成单击收起菜单手势 + tapGesture = UITapGestureRecognizer(target: self, action: "showHome") } override func didReceiveMemoryWarning() { @@ -123,17 +134,20 @@ class ViewController: UIViewController { // 展示左视图 func showLeft() { + mainView.addGestureRecognizer(tapGesture) distance = self.view.center.x * (FullDistance*2 + Proportion - 1) doTheAnimate(self.Proportion, showWhat: "left") homeNavigationController.popToRootViewControllerAnimated(true) } // 展示主视图 func showHome() { + mainView.removeGestureRecognizer(tapGesture) distance = 0 doTheAnimate(1, showWhat: "home") } // 展示右视图 func showRight() { + mainView.addGestureRecognizer(tapGesture) distance = self.view.center.x * -(FullDistance*2 + Proportion - 1) doTheAnimate(self.Proportion, showWhat: "right") }