您的位置:首页 > 其它

大作业小巴学车的总结

2017-02-20 19:38 113 查看
自定义tabbarcontroller 主要创建一个类继承自uitabbarcontroller 随后将tabView移除 设定自己的view即可

setupChildVC

func setUpChildVC(){
let sb = UIStoryboard(name: "Main", bundle: nil)

learnCarVC = sb.instantiateViewController(withIdentifier: "learnVC") as? MapViewController
serveVC = sb.instantiateViewController(withIdentifier: "serviceVC") as? ServiceViewController
peiJiaVC = sb.instantiateViewController(withIdentifier: "peijiaVC") as? WithDrivingViewController
qusVC = sb.instantiateViewController(withIdentifier: "qusVC") as? QusViewController
let serviceNav = UINavigationController(rootViewController: serveVC!)
let learnCarNav = UINavigationController(rootViewController: learnCarVC!)
let qusNav = UINavigationController(rootViewController: qusVC!)
let peijiaNav = UINavigationController(rootViewController: peiJiaVC!)

// serviceNav.tabBarItem.title = "服务"
// serviceNav.tabBarItem.image = UIImage(named: "ic_serve_tab")
// serviceNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_right")
// learnCarVC.tabBarItem.title = "学车"
// learnCarVC.tabBarItem.image = UIImage(named: "ic_learn_tab")
// learnCarNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_middle")
// peiJiaVC?.tabBarItem.title = "陪驾"
// peiJiaVC?.tabBarItem.image = UIImage(named: "ic_peijia_tab")
// peiJiaVC?.tabBarItem.selectedImage = UIImage(named: "icon_tab_middle")
//
// qusNav.tabBarItem.title = "题库"
// learnCarNav.tabBarItem.image = UIImage(named: "ic_exercise_tab")
// learnCarNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_left")

// qusVC.navigationItem.leftBarButtonItem = leftItem
//
// serviceVC.navigationItem.leftBarButtonItem = leftItem
//

self.viewControllers = [qusNav,learnCarNav,peijiaNav,serviceNav]

}
setuptabbarView
func setupTabBar() {
let rect = self.tabBar.frame
self.tabBar.removeFromSuperview()
myView = UIView(frame: CGRect(x: 0, y: rect.origin.y - 20, width: SCREEN_WIDTH, height: rect.size.height + 20))

self.view.addSubview(myView!)
for i in 0 ..< 4{
let button = CDTabBarButton()

button.setTitle(titles[i], for: .normal)
button.setImage(UIImage(named:unselImages[i]), for: .normal)
button.setImage(UIImage(named:selImages[i]), for: .selected)
let x = (CGFloat)(i) * (myView?.frame.size.width)! / 4
button.frame = CGRect(x: x, y: 0, width: (myView?.frame.size.width)! / 4, height: (myView?.frame.size.height)!)
button.tag = i
button.titleLabel?.font = UIFont.systemFont(ofSize: 12)
button.imageEdgeInsets = UIEdgeInsetsMake(5, 13, 21,(button.titleLabel?.bounds.size.width)!)
button.titleLabel?.textAlignment = .center
button.titleEdgeInsets = UIEdgeInsetsMake(40, -1 * (button.titleLabel?.bounds.size.width)! - 45, 0, 0)
button.setTitleColor(UIColor.black, for: .normal)
myView?.addSubview(button)
button.addTarget(self, action: #selector(CDTabbarViewController.clickBtn), for: .touchUpInside)
if(i == 1){
button.isSelected = true
self.selectedBtn = button
self.selectedIndex = 1
}
}
}
随后实现clickBtn即可
func clickBtn(sender:UIButton) {

self.selectedBtn.isSelected = false;
sender.isSelected = true
self.selectedBtn = sender
self.selectedIndex = sender.tag
}
整体代码如下
//
// CDTabbarViewController.swift
// xiaobaxuecheProject
//
// Created by hznucai on 2016/12/13.
// Copyright © 2016年 hznucai. All rights reserved.
//

import UIKit

class CDTabbarViewController: UITabBarController {
var selectedBtn = UIButton()
var myView:UIView?

let selImages = ["ic_exercise_tab","ic_learn_tab","ic_peijia_tab","ic_serve_tab"]
let unselImages = ["icon_tab_left","icon_tab_middle","icon_tab_middle","icon_tab_right"]
let titles = ["题库","学车","陪驾","服务"]
var learnCarVC:MapViewController?
var qusVC:QusViewController?
var serveVC:ServiceViewController?
var peiJiaVC:WithDrivingViewController?
var leftItem:UIBarButtonItem?
override func viewDidLoad() {
super.viewDidLoad()
self.setUpChildVC()
self.setupTabBar()

// Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

func setUpChildVC(){
let sb = UIStoryboard(name: "Main", bundle: nil)

learnCarVC = sb.instantiateViewController(withIdentifier: "learnVC") as? MapViewController
serveVC = sb.instantiateViewController(withIdentifier: "serviceVC") as? ServiceViewController
peiJiaVC = sb.instantiateViewController(withIdentifier: "peijiaVC") as? WithDrivingViewController
qusVC = sb.instantiateViewController(withIdentifier: "qusVC") as? QusViewController
let serviceNav = UINavigationController(rootViewController: serveVC!)
let learnCarNav = UINavigationController(rootViewController: learnCarVC!)
let qusNav = UINavigationController(rootViewController: qusVC!)
let peijiaNav = UINavigationController(rootViewController: peiJiaVC!)

// serviceNav.tabBarItem.title = "服务"
// serviceNav.tabBarItem.image = UIImage(named: "ic_serve_tab")
// serviceNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_right")
// learnCarVC.tabBarItem.title = "学车"
// learnCarVC.tabBarItem.image = UIImage(named: "ic_learn_tab")
// learnCarNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_middle")
// peiJiaVC?.tabBarItem.title = "陪驾"
// peiJiaVC?.tabBarItem.image = UIImage(named: "ic_peijia_tab")
// peiJiaVC?.tabBarItem.selectedImage = UIImage(named: "icon_tab_middle")
//
// qusNav.tabBarItem.title = "题库"
// learnCarNav.tabBarItem.image = UIImage(named: "ic_exercise_tab")
// learnCarNav.tabBarItem.selectedImage = UIImage(named: "icon_tab_left")

// qusVC.navigationItem.leftBarButtonItem = leftItem
//
// serviceVC.navigationItem.leftBarButtonItem = leftItem
//

self.viewControllers = [qusNav,learnCarNav,peijiaNav,serviceNav]

}
func setupTabBar() {
let rect = self.tabBar.frame
self.tabBar.removeFromSuperview()
myView = UIView(frame: CGRect(x: 0, y: rect.origin.y - 20, width: SCREEN_WIDTH, height: rect.size.height + 20))

self.view.addSubview(myView!)
for i in 0 ..< 4{
let button = CDTabBarButton()

button.setTitle(titles[i], for: .normal)
button.setImage(UIImage(named:unselImages[i]), for: .normal)
button.setImage(UIImage(named:selImages[i]), for: .selected)
let x = (CGFloat)(i) * (myView?.frame.size.width)! / 4
button.frame = CGRect(x: x, y: 0, width: (myView?.frame.size.width)! / 4, height: (myView?.frame.size.height)!)
button.tag = i
button.titleLabel?.font = UIFont.systemFont(ofSize: 12)
button.imageEdgeInsets = UIEdgeInsetsMake(5, 13, 21,(button.titleLabel?.bounds.size.width)!)
button.titleLabel?.textAlignment = .center
button.titleEdgeInsets = UIEdgeInsetsMake(40, -1 * (button.titleLabel?.bounds.size.width)! - 45, 0, 0)
button.setTitleColor(UIColor.black, for: .normal)
myView?.addSubview(button)
button.addTarget(self, action: #selector(CDTabbarViewController.clickBtn), for: .touchUpInside)
if(i == 1){
button.isSelected = true
self.selectedBtn = button
self.selectedIndex = 1
}
}
}
func clickBtn(sender:UIButton) {

self.selectedBtn.isSelected = false;
sender.isSelected = true
self.selectedBtn = sender
self.selectedIndex = sender.tag
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.myView?.isHidden = false
}
override func viewWillDisappear(_ animated: Bool) {

super.viewWillDisappear(animated)
self.myView?.isHidden = true
}

}
这样即可
自定义present的方法 使看起来像push一样

实现UIViewControllerTransitioningDelegate的方法

随后实现这两个方法

func animationController(forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let isFrom = true
return HalfWaySpringAnimator(isFrom: isFrom)
}

func animationController(forDismissed dismissed: UIViewController) -> UIViewControllerAnimatedTransitioning? {
let isFrom = false
return HalfWaySpringAnimator(isFrom: isFrom)

}
在要跳转的过程之前
func clickHeader(){
//到个人中心界面
let learnCarSb = UIStoryboard(name: "Personal", bundle: nil)
let PersonalNav = learnCarSb.instantiateViewController(withIdentifier: "PersonalNav") as! UINavigationController

PersonalNav.transitioningDelegate = self
// self.isshow = false
// tabBar.view.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)

// myView.frame = CGRect(x: -100, y: 0, width:100, height: SCREEN_HEIGHT)
// self.modalPresentationStyle = .custom
self.present(PersonalNav, animated: true, completion: nil)

}
实现HalfWaySpringAnimator的方法
//
// HalfWaySpringAnimator.swift
// xiaobaxuecheProject
//
// Created by hznucai on 2016/12/15.
// Copyright © 2016年 hznucai. All rights reserved.
//

import UIKit

class HalfWaySpringAnimator: NSObject,UIViewControllerAnimatedTransitioning {
//设置动画的持续时间
var isFrom = false
init(isFrom:Bool) {
super.init()
self.isFrom = isFrom
}
func transitionDuration(using transitionContext: UIViewControllerContextTransitioning?) -> TimeInterval {
return 0.3
}
//设置动画的进行方式
func animateTransition(using transitionContext: UIViewControllerContextTransitioning) {
let fromVC = transitionContext.viewController(forKey: .from
)
let toVC = transitionContext.viewController(forKey: .to)
let containerView = transitionContext.containerView
let fromView = fromVC?.view
let toView = toVC?.view
if(isFrom) {
toView?.frame = CGRect(x:SCREEN_WIDTH, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
containerView.addSubview(toView!)
let transitionDuration = self.transitionDuration(using: transitionContext)
UIView.animate(withDuration: transitionDuration, animations: {
toView?.frame = CGRect(x:0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
// 逐渐变为不透明
toView?.frame = transitionContext.finalFrame(for: toVC!)
}) { (finish:Bool) in
let wasCancelled = transitionContext.transitionWasCancelled
transitionContext.completeTransition(!wasCancelled)
}
}else{
fromView?.frame = CGRect(x:0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
toView?.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
containerView.addSubview(toView!)
containerView.addSubview(fromView!)
// containerView.bringSubview(toFront: fromView!)
let transitionDuration = self.transitionDuration(using: transitionContext)
UIView.animate(withDuration: transitionDuration, animations: {
fromView?.frame = CGRect(x:SCREEN_WIDTH, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)
// 逐渐变为不透明
toView?.frame = transitionContext.finalFrame(for: toVC!)
}) { (finish:Bool) in
let wasCancelled = transitionContext.transitionWasCancelled
transitionContext.completeTransition(!wasCancelled)
}

}
}
}


具体可以看这个博客http://www.jianshu.com/p/38cd35968864 这样即可
在子view中实现点击的方法

只需实现clickHeaderViewDeleage的方法 随后在Button的click中将这个click传递过去即可

//
// headerView.swift
// xiaobaxuecheProject
//
// Created by hznucai on 2016/12/18.
// Copyright © 2016年 hznucai. All rights reserved.
//

import UIKit
protocol clickHeaderViewDelegate{
func clickHeader()
}
class headerView: UIView {
var headerDelegate:clickHeaderViewDelegate?
override init(frame:CGRect){
super.init(frame: frame)
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
imageView.image = UIImage(named:"ico_客服")
let label = UILabel(frame: CGRect(x: 55, y: 0, width: 100, height: 30))
label.text = "未设置"
let subTitle = UILabel(frame: CGRect(x: 55, y: 35, width: 100, height: 30))
subTitle.text = "17816869731"
subTitle.font = UIFont.systemFont(ofSize: 10)
self.addSubview(imageView)
self.addSubview(label)
self.addSubview(subTitle)
self.addGestureRecognizer(UITapGestureRecognizer(target: self, action: #selector(headerView.click)))
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
func click() {
self.headerDelegate?.clickHeader()
}
}
在主view中

func clickHeader(){
//到个人中心界面
let learnCarSb = UIStoryboard(name: "Personal", bundle: nil)
let PersonalNav = learnCarSb.instantiateViewController(withIdentifier: "PersonalNav") as! UINavigationController

PersonalNav.transitioningDelegate = self
// self.isshow = false
// tabBar.view.frame = CGRect(x: 0, y: 0, width: SCREEN_WIDTH, height: SCREEN_HEIGHT)

// myView.frame = CGRect(x: -100, y: 0, width:100, height: SCREEN_HEIGHT)
// self.modalPresentationStyle = .custom
self.present(PersonalNav, animated: true, completion: nil)

}这样即可

iOS很久没打了 要开始复习了 为面试做好准备!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: