Study iOS 9 Programming with Swift(3)

2016/8/30 posted in  Develop comments

使用Swift进行iOS编程知识点总结第三篇,主要包括Navigation Bar的导入和Appearance的自定义、状态栏的样式自定义、Segue的基本使用和通过Segues在两个View Controller间传递数据。

关联阅读:
Study iOS 9 Programming with Swift(1)
Study iOS 9 Programming with Swift(2)
Study iOS 9 Programming with Swift(3)

目录

更新记录

  • 2016/08/31 第一次发布

导航栏的引入

  • 引入导航栏的方式:Select the table view controller and click "Editor" in the menu. Choose "Embed in" > "Navigation Controller".
  • 选中引入导航栏的View Controller可以设置导航栏中的title。

导航栏外表的自定义

  • 在AppDelegate.swift文件中的application(_:didFinishLaunchingWithOptions:)方法中添加以下代码可以自定义导航栏的Appearance。
  • 代码片段:
// 自定义导航栏的背景色
UINavigationBar.appearance().barTintColor = UIColor(red: 207.0/255.0, green: 0.0/255.0, blue: 15.0/255.0, alpha: 0.9)
    
// 自定义导航栏的导航button及文字、其他导航栏按钮元素的颜色
UINavigationBar.appearance().tintColor = UIColor.whiteColor()
    
// 自定义导航栏title文字的样式,包括字体、字号、颜色等等
UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()]
    
// 以下代码自定义了导航栏title文字的字体、字号、颜色,iOS SDK自带字体的名称可在http://iosfonts.com/查看
if let barFont = UIFont(name: "PingFangSC-Semibold", size: 20.0) {
      
  UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor(), NSFontAttributeName:barFont]
      
}
  • 若想移除导航栏back button后的title,可以在souce view controller中的viewdidload方法中添加以下代码:
// Remove the title of the back button 
navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: .Plain, target: nil, action: nil)
  • 在导航栏上显示上级table view中对应cell的标题,在destination view controller中的viewdidload方法中添加以下代码:
// 将发现页选择的cell的标题显示在导航栏上
title = movie.name

对于某个View在滑动时隐藏导航栏

  • 因为viewDidLoad方法只会在view初次创建时被调起一次,所以不能使用使用此方法来隐藏导航栏。可以使用viewWillAppear方法,此方法在view每次展示时都会被调起。
  • 在Table View Controller添加以下代码:
// view每次展示时都会被调起
override func viewWillAppear(animated: Bool) {
  super.viewWillAppear(animated)
    
  // 向下滑动时隐藏导航栏
  navigationController?.hidesBarsOnSwipe = true
    
}

  • 在Detail View Controller添加以下代码:
override func viewWillAppear(animated: Bool) {
  super.viewWillAppear(animated)
    
  // 滑动时不隐藏导航栏
  navigationController?.hidesBarsOnSwipe = false
    
  // 设置导航栏为不可隐藏。第一个页面隐藏了导航栏之后,防止进入详情页不显示导航栏。
  navigationController?.setNavigationBarHidden(false, animated: true)
     
}

调整状态栏的样式

  • Status Bar有两种样式:Light和Dark。
  • 若想改变某个view controller的Status Bar样式,可以添加以下代码:
override func preferredStatusBarStyle() -> UIStatusBarStyle {
  return .LightContent 
}
  • 若想改变app全局的Status Bar样式,有两步需要做。第一步:Select the project in the project navigator. Under the Info tab of the FoodPin target, insert a new key named View controller-based status bar appearance and set the value to NO。第二步在AppDelegate.swift文件中的application(_:didFinishLaunchingWithOptions:)方法中添加以下代码:
// 自定义全局的Status Bar为Light Style
UIApplication.sharedApplication().statusBarStyle = .LightContent

Segue的类型

  • Segue是连接两个View Controller的桥梁,在iOS9之后定义了下面几种Segue的类型
    • Show - when the show style is used, the content is pushed on top of the current view controller stack. A back button will be displayed in the navigation bar for navigating back to the original view controller. (这种类型是有导航栏的)
    • Show detail - similar to the show style, but the content in the detail (or destination) view controller replaces the top of the current view controller stack. (没有导航栏)
    • Present modally - presents the content modally. When used, the detail view controller will be animated up from the bottom and cover the entire screen on iPhone. (类似的例子是日历中添加Event时的效果。)
    • Present as popover - Present the content as a popover anchored to an existing view. Popover is commonly found in iPad apps. (多用于iPad)

通过Segues传递数据

  • Segue起着连接作用,在从一个View Controller到另一个时,可以在SourceViewController中使用prepareForSegue方法来传递数据。
  • 思路:为Segue定义一个独一无二的可识别的名称→确定选择的哪一行→确定目标ViewController→传递数据。
  • 代码片段:
// 向DetailViewController传递信息
  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
    // 通过已经定义的segue这个桥梁来传递信息
    if segue.identifier == "showMovieDetail" {
      
      if let indexPath = tableView.indexPathForSelectedRow {
        let destinationController = segue.destinationViewController as! MoiveDetailViewController
        destinationController.movieBackgroudImage = movieImages[indexPath.row]
        destinationController.movieImage = movieImages[indexPath.row]
        destinationController.movieName = movieNames[indexPath.row]
        destinationController.movieType = movieTypes[indexPath.row]
        destinationController.movieYear = movieYears[indexPath.row]
        destinationController.movieActor = movieActors[indexPath.row]
      }
    }
  }

UIImageView的几种模式

  • UIImageView有几种常用的模式如下,在使用时注意选择:

    • Scale to Fill (默认的模式,会把图片拉伸到指定的尺寸,不能保证图片的原始比率)
    • Aspect Fit (可以保持图片的原始比率,但是会在imageview中留下空白)
    • Aspect Fill (保持图片的原始比率的前提下不会留下空白,但会切掉图片四周的一些细节,注意使用此模式时要开启“Clip Subviews”,否则图片会扩展到其他view中去。)

Content Hugging Priority

  • 对于一个Stack View中的多个view,为了满足指定的constraints,会把某些view拉伸,而拉伸的优先级由Content Hugging Priority定义。Content Hugging Priority的数值越大,级别越高,不会被拉伸。

Self Sizing Cells

  • 设置好cell的Constraints后,并且要把Cell的number of lines的值设置为0,在viewDidLoad方法中添加以下代码:
tableView.estimatedRowHeight = 36.0 
tableView.rowHeight = UITableViewAutomaticDimension