一行代码一场梦,大家好我是阿达!今天跟大家分享的部分是『自订导览列外观』。以下是我们将要改变的部分:
变更导览列的背景颜色 变更导览列的字型 自订返回按钮的颜色 变更返回键的标题
自从 iOS5 之后 Apple 导入外观 API , UIApperance 让开发者可以很轻易的自订大部份的 UIKit 控制元件的外观,包含整个应用程式的导览列。 想要自订导览列的外观,你可以使用 appearance() 来取得类别的外观代理 (appearance proxy):
想要修改导览列的背景颜色,设定 barTinColor 属性为你喜爱的颜色: //修改导览列的颜色 UINavigationBar.appearance().barTintColor = UIColor (red: 231.0 / 250, green: 95.0 / 250, blue: 53 / 250, alpha: 0.3)
把他加在 AppDelegate.swift 中 didFinishLaunchingWithOptions 方法中。
接下来是标题的样式可以借由 titleTextAttribustes 属性的设定来做变更:
//改变标题样式
if let barFont = UIFont (name: "AvenirNextCondensed-DemiBold", size: 22.0){ UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:barFont] }
以上这段程序在说明,我们指定 AvenirNextCondensed-DemiBold 为字型,并将颜色设定为白色。
很抽象吗? 没事的,按下 command + R 吧!
我们看看左上角的返回键,现在还是显示着『Food Pin』的标题。如果今天我们想让画面更简洁一点,把提移除呢?
让我们进到 RestaurantTableViewController 中的viewDidLoad去修改:
//移除返回按鈕標題清空
self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
加好了之后,当然就是快乐的command + R啦!
恩~ 真的是干净了很多,可是蓝色的按钮,跟橘色的底。。。真的很不搭。。。有办法解决吗?
当然有的!我们回到 AppDelegate.swift 中继续在didFinishLaunchingWithOptions方法中,加入以下程式:
//將按鈕改成白色 UINavigationBar.appearance().tintColor = UIColor.whiteColor()
別懷疑~接下來就是 command + R
恩~ 看起来真的顺眼多了,如果我们想多做一些改变,我们看到导览列上一片空白,感觉如果如果让他显示我们所点选的餐厅是不是更好? 这超级容易的呢!只要设定细节视图的标题为餐厅名称就可以啦!,我们把以下的程式码插入, DetailViewController 的 viewDidLoad 当中:
//顯示餐廳名字在導覽列上 title = self.restaurant.name
恩~相信大家都知道,command + R 按下去,见证奇迹吧!
就是这么轻易,就是这么容易,让我们的app变得更有设计感。
接下来要跟大家分享的是,关于隐藏导览列,没错,你没听错,我们接下来要做的就是隐藏导览列。有的时候我们会需要更多的画面在你的主画面上,而上面的导览列就占了很多部分,在以前如果要隐藏导览列的话,我们必须要有自己的解决方案,iOS8 推出了让你可以用滑动或是点击的方式来隐藏导览列。
在 Storyboard 的 Navigation Controller Scene 下面选取 『Navigation Controller 』,在里面有一个叫做『On Swipe』。启动了之后当你的画面往下拉,就会发现上面的导览列不见了,当你滑回去之后会发现他又出现了。
這樣的確很方便,但是會有兩個問題,第一就是導覽回表格視圖控制器之後,無法隱藏。 第二個問題就是細節視圖的導覽列不見了。
要解决这个方法其实很简单,针对第一个问题,因为 ViewDidLoad 只有当视图第一次被载入的时候才会呼叫,第二次之后就不会呼叫了,之后第二个问题因为隐藏的导览列被带到下一页的细节部分。
所以我们必须告诉 App 要重新显示导览列。幸好,UIViewController 提供了几个方法来回应视图事件。 不像 viewDidLoad,这些方式在每次视图显示或移除的时候都会被呼叫。当视图显示的时候, viewWillAppear 与 viewDidLoad 就会被呼叫。 不同点在于说,当画面要准备显示的时候,viewWillAppear 会被呼叫,当一个画面在画面显示的时候则呼叫 viewDidLoad。
因此插入以下的程式到 RestaurantTableViewController.swift 中:
//處理導覽列 override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.navigationController?.hidesBarsOnSwipe = true }
针对细节的导览列的修改,我们要在 DetailVIewController.swift 加入以下程式:
//隱藏導覽列
override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) self.navigationController?.hidesBarsOnSwipe = false self.navigationController?.setNavigationBarHidden(false, animated: true) }
完成了之后按下 command + R 来看看结果
我们会看到,这样子一来我们的表格视图(tableView)的导览列消失了之后,进入细节图之后导览列就没有消失了!感觉是不是好棒棒的啊!
|