开始用Swift开发iOS 10 - 12 丰富Detail View和定制化Navigation Bar

上一篇开始用Swift开发iOS 10 - 11 面向对象编程介绍对代码做了一点修改,这一篇来丰富一下详情页和定制化Navigation Bar。

重新设计详细页面

  • 选中Main.storyboard,删除Image View和三个Label。

  • 添加Table View,修改其大小为整个View,并且添加一些约束。设置prototype cells为1;table view cell的identifierCellrow height为36。

    向Detail View Controller中添加一个Table View

  • 在table view的头部添加一个image view,给变其高度为300,宽度为View的宽度。


  • 连接image view和RestaurantDetailViewController中的restaurantImageView接口。

  • 修改Image View的content modeAspect Fit,并勾选Clip to Bounds

定制 Prototype Cell

  • 增加两个label,分别命名为FieldValue ,字体修改成自己想要的。把它们组成一个Stack View。
  • 为Stack View添加一些约束。
    在cell中垂直居中;Trailing Space 和 Leading Space都为零。


Ctrl-dragFieldLabel到ValueLabel,选择Equal Widths,生成一个FieldLabel与ValueLabel宽度相同的约束。修改Multiplier值为0.5,就是FieldLabel的宽度是ValueLabel的一半。

  • 新建RestaurantDetailTableViewCell类文件,继承至UITableViewCell。添加两个接口,并关联上面的两个Label。
@IBOutlet var fieldLabel:UILabel!
@IBOutlet var valueLabel:UILabel!

更新 RestaurantDetailViewController

  • 实现UITableViewDataSourceUITableViewDelegate:
    class RestaurantDetailViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

  • 实现UITableViewDataSource的相关方法:

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return 4
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! RestaurantDetailTableViewCell
        // Configure the cell...
        switch indexPath.row {
        case 0:
            cell.fieldLabel.text = "Name"
            cell.valueLabel.text = restaurant.name
        case 1:
            cell.fieldLabel.text = "Type"
            cell.valueLabel.text = restaurant.type
        case 2:
            cell.fieldLabel.text = "Location"
            cell.valueLabel.text = restaurant.location
        case 3:
            cell.fieldLabel.text = "Been here"
            cell.valueLabel.text = (restaurant.isVisited) ? "Yes, I've been herebefore" : "No"
        default:
            cell.fieldLabel.text = ""
            cell.valueLabel.text = ""
        }
        
        cell.backgroundColor = UIColor.clear
        
        return cell
    }
  • 把table view的delegatedataSource接口设置成Restaurant Detail View Controller

定制table view 的样式

  • RestaurantDetailViewController中添加一个接口变量,并关联storyboard中的table view。
    @IBOutlet var tableView:UITableView!

  • 设置table view的背景颜色,在viewDidLoad中添加:
    tableView.backgroundColor = UIColor(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 0.2)
    新加的颜色是亮灰色(和白色相近,可以设置成其他深颜色做对比),运行后不是整个table view都变色。


    这是因为,每一个cell都是重新添加的,cell的背景颜色还是默认的白色,覆盖了table view的背景颜色,要在tableView(_:cellForRowAt:)return之前添加:
    cell.backgroundColor = UIColor.clear

  • 移除table view中空cell的分割线,在viewDidLoad中添加:
    tableView.tableFooterView = UIView(frame: CGRect.zero)

  • 改变分割线的颜色, 在viewDidLoad中添加:
    tableView.separatorColor = UIColor(red: 240.0/255.0, green: 240.0/255.0, blue: 240.0/255.0, alpha: 0.8)

定制Navigation Bar的样式

通过UINavigationBar.appearance()修改Navigation Bar的样式。

Navigation Bar的样式修改是整体修改的,所以修改Navigation Bar的样式代码要写在application(_:didFinishLaunchingWithOptions:)方法中。

  • 修改navigation bar的背景颜色:
    UINavigationBar.appearance().barTintColor = UIColor(red: 216.0/255.0, green: 74.0/255.0, blue: 32.0/255.0, alpha: 1.0)
  • 修改title样式:
    if let barFont = UIFont(name: "Avenir-Light", size: 24.0) {
         UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.white, NSFontAttributeName:barFont]
    }

Avenir-Light是字体名称,详细的iOS字体可查 http://iosfonts.com

  • tintColor控制Navigation items和bar button items的颜色
    UINavigationBar.appearance().tintColor = UIColor.white

目前,Navigation bar的返回按钮是一个<Food Pin,想删除Food Pin,需要修改RestaurantTableViewControllerbackBarButtonItem属性。
RestaurantTableViewControllerviewDidLoad中添加:
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .plain, target: nil, action: nil)

为 detail view 的 Navigation bar 添加title,在 RestaurantDetailViewControllerviewDidLoad中添加:
title = restaurant.name

隐藏Navigation Bar

  • 自从iOS 8后,Navigation Bar可以在不同情况下隐藏,在storyboard中选择Navigation Controller修改。(On Swipe是向上滑)
  • 但这种设置整个app的Navigation Bar都会隐藏。如果只想在restaurant table view controller中隐藏,在detail view中不隐藏,就需要在两个控制器的viewDidLoad分别设置:navigationController?.hidesBarsOnSwipe = truenavigationController?.hidesBarsOnSwipe = false

  • 运行反复测试后发现两个问题:

    1. 当从detail view返回后,restaurant table view controllerNavigation Bar不能隐藏。
    2. restaurant table view controllerNavigation Bar隐藏后进入detail view后, Navigation Bar消失不能再显示。

首先明确两个控制器中的navigationController属性指的是同一个Navigation Controller ,viewDidLoad方法是view第一次加载时调用,之后就不再调用了。 也就是说当从detail view返回,hidesBarsOnSwipe已经被设置为false,而到restaurant table view controllerviewDidLoad不再调用,所以Navigation Bar不能再隐藏。

解决办法是使用viewWillAppear,这个方法是在视图每一次显示时调用。
RestaurantTableViewController中添加:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.hidesBarsOnSwipe = true
}

RestaurantDetailViewController中添加:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    navigationController?.hidesBarsOnSwipe = false
    navigationController?.setNavigationBarHidden(false, animated: true)
}

修改Status Bar样式

app中Status Bar的默认样式是黑色。

Info.plist中添加一个key为View controller-based status bar appearance,值为NO。然后application(_:didFinishLaunchingWithOptions:)中添加:UIApplication.shared.statusBarStyle = .lightContent

代码

Beginning-iOS-Programming-with-Swift

说明

此文是学习appcode网站出的一本书 《Beginning iOS 10 Programming with Swift》 的一篇记录

系列文章目录

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容

  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,016评论 4 62
  • 属于你自己的待办清单app(Your own to-do app) To-do list(待办清单)app是App...
    Billionfan阅读 3,263评论 11 10
  • 工作的时候工作 玩耍的时候玩耍 这是自律的基本准则 西奥多·阿多诺(Theodor Adorno,1903-196...
    问丨无心阅读 400评论 0 0
  • 人一但遇到一些困难,就会想到逃跑。特别是在你夜晚躺在床上,脑子就会短路,会胡思乱想。想到的是都是计划逃脱,策...
    老B哥阅读 343评论 0 0
  • 今天是端午节,我们回家看望姥姥,中午要做饭的时候,姥姥说煎茄盒儿吃。儿子突然说:“妈妈,让我来,我想尝试一下。”我...
    黄鑫妈妈阅读 366评论 0 0