创建: 2018/04/26

完成: 2018/05/03

更新: 2018/05/04 增加UIStackView

更新: 2018/09/18 补充SFSafariViewController需要SafariServeces

视图管理器
   一个画面一个视图管理器, 管理View
   
画面迁移
 segue的transition
 default  Cover Vertical
 Cover Vertical  从下往上覆盖
 Flip Horizontal  水平翻转
 Cross Dissolve  交叉溶解
 Partial Curl  部分卷曲
   
   
   
   
   
   
视图管理器的生命周期
 View-Related Notifications

也叫生命周期方法

 viewDidLoad

读取完View时

● 用code编写View时写这里

 viewWillAppear

即将表示View

● 调整size等初始化

 viewDidAppear  已经表示View
 viewWillDisappear  View即将消失
 viewDidDisappear  View已经消失
 viewWillLayoutSubViews

View即将排列子View

● 可能不止一次

 viewDidLayoutSubViews

View已经排列好子View

● 可能不止一次

 viewWillTransition  屏幕方西即将变化
   
   

顺序:

viewDidLoad -> viewWillAppear -> viewWillLayoutSubViews -> viewDidLayoutSubViews -> viewDidAppear ->

viewWillDisappear -> viewDidDisappear

  1. func lifeCycleDebugTest(string: String) {
  2. print("now in \(string)")
  3. }
  4. // 生命周期测试
  5. override func viewDidLoad() {
  6. super.viewDidLoad()
  7. lifeCycleDebugTest(string: #function)
  8. }
  9.  
  10. override func viewWillAppear(_ animated: Bool) {
  11. super.viewWillAppear(animated)
  12. lifeCycleDebugTest(string: #function)
  13. }
  14.  
  15. override func viewDidAppear(_ animated: Bool) {
  16. super.viewDidAppear(animated)
  17. lifeCycleDebugTest(string: #function)
  18. }
  19.  
  20. override func viewWillDisappear(_ animated: Bool) {
  21. super.viewWillDisappear(animated)
  22. lifeCycleDebugTest(string: #function)
  23. }
  24.  
  25. override func viewDidDisappear(_ animated: Bool) {
  26. super.viewDidDisappear(animated)
  27. lifeCycleDebugTest(string: #function)
  28. }
  29.  
  30. override func viewWillLayoutSubviews() {
  31. super.viewWillLayoutSubviews()
  32. lifeCycleDebugTest(string: #function)
  33. }
  34.  
  35. override func viewDidLayoutSubviews() {
  36. super.viewDidLayoutSubviews()
  37. lifeCycleDebugTest(string: #function)
  38. }
  39.  
  40. override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
  41. super.viewWillTransition(to: size, with: coordinator)
  42. lifeCycleDebugTest(string: #function)
  43. }
   
   
   
   
状态栏
   最上方, 显示时间电量等
 样式

preferredStatusBarStyle

  1. //-------------------------------------------------------
  2. // 状态栏
  3. //-------------------------------------------------------
  4. var style = UIStatusBarStyle.default
  5. override var preferredStatusBarStyle: UIStatusBarStyle {
  6. return style
  7. }
  8. @IBAction func changeStatusBarStyle(_ sender: UIButton) {
  9. style = ((style == UIStatusBarStyle.default) ? .lightContent : .default)
  10. setNeedsStatusBarAppearanceUpdate()
  11. }
 是否隐藏

prefersStatusBarHidden

  1. // 切换显示 prefersStatusBarHidden
  2. var isHidden = false
  3. override var prefersStatusBarHidden: Bool {
  4. return isHidden
  5. }
  6.  
  7. @IBAction func toggleStatusBar(_ sender: UIButton) {
  8. isHidden = !isHidden
  9. setNeedsStatusBarAppearanceUpdate()
  10. }
 app全局设定  info -> Custom iOS Target Properties -> 增加View controller based status bar appearance -> Value设为NO
   
   
   
   
   
   
方向与旋转
 supportedInterfaceOrientations 

 .landscapeLeft  左横
 .landscapeRight  右横
 .portrait  竖直
 .portraitUpsideDown  倒置
   
 代码设定 

重写supportedInterfaceOrientations

  1. override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
  2. return [.landscapeLeft] // 只支持向左横倾
  3. }
 全局设定  General -> Deployment Info -> Device Orientation
   
   
   
导航控制器(navigation controller)
   导航, 上方有导航栏(navigation bar), 自带返回按钮

把已有viewController

插入导航控制器

 选中目标视图控制器 -> Editor -> Embed in -> Navigation Controller 
 使用  按钮等往其他视图控制器走, 自动添加返回按钮
 代码segue移动
  1. navigationController?.pushViewController
   
   
tab bar controller
   直接用
   
   
   
   
   
简易使用table view
   自带UITableViewDataSource, UITableViewDelegate
 增加编辑功能

● 实现编辑按钮 (非必须)

(1)先套进navigation controller

(2)绑定编辑按钮

位置: viewDidLoad

  1. self.navigationItem.rightBarButtonItem = self.editButtonItem

● 实现功能

  1. override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
  2. // 是否可编辑
  3. // Return false if you do not want the specified item to be editable.
  4. return true
  5. }
  6.  
  7. override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle,
    forRowAt indexPath: IndexPath) {
  8. // 编辑row
  9. if editingStyle == .delete {
  10. self.defaultData[indexPath.section].remove(at: indexPath.row) // 从数据源删除数据
  11. // Delete the row from the data source
  12. tableView.deleteRows(at: [indexPath], with: .fade)
  13. } else if editingStyle == .insert {
  14. // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
  15. }
  16. }
   
   
   
   
简易使用collection view
   和CollectionView差不多
   
   
   
   
   
管理page UIPageViewController
 

● 实现协议

  1. extension PageViewController: UIPageViewControllerDataSource {
  2. // 设置当前页面的前一页
  3. func pageViewController(_ pageViewController: UIPageViewController,
  4.     viewControllerBefore viewController: UIViewController) -> UIViewController? {
  5. if let index = self.targetViewControllers.index(of: viewController), index > {
  6. return self.targetViewControllers[index - ]
  7. }
  8. return nil
  9. }
  10. // 设置当前页面的后一页
  11. func pageViewController(_ pageViewController: UIPageViewController,
  12.     viewControllerAfter viewController: UIViewController) -> UIViewController? {
  13. if let index = self.targetViewControllers.index(of: viewController),
  14.        index < self.targetViewControllers.count - {
  15. return self.targetViewControllers[index + ]
  16. }
  17. return nil
  18. }
  19.  
  20. }

●  创建并展示

  1. //ViewDidLoad
  2. override func viewDidLoad() {
  3. // 设置dataSource, delegate
  4. self.dataSource = self
  5. self.delegate = self
  6. super.viewDidLoad()
  7. // 设置pages
  8. self.targetViewControllers = []
  9. for id in self.identifierIDs {
  10. self.targetViewControllers.append((self.storyboard?.instantiateViewController(withIdentifier: id))!)
  11. }
  12. // 设置一开始显示的viewController
  13. setViewControllers([targetViewControllers[]], direction: .forward, animated: true)
  14.  
  15. }
   
   
   
   
   
alert
 
  1. @IBAction func showSampleAlert(_ sender: UIButton) {
  2. // 创建UIAlertController
  3. let alertController = UIAlertController.init(title: "改变背景颜色", message: "真的要改变吗", preferredStyle: .alert)
  4. // 创建取消按钮
  5. let cancelAlertButton = UIAlertAction.init(title: "取消", style: .cancel, handler: nil)
  6. // 创建确定按钮
  7. let okAlertButton = UIAlertAction.init(title: "确定", style: .default, handler: { action in
  8. self.view.backgroundColor = UIColor.red
  9. })
  10. // 添加到alert里
  11. alertController.addAction(okAlertButton)
  12. alertController.addAction(cancelAlertButton)
  13. // 显示alert
  14. present(alertController, animated: true, completion: nil)
  15. }
   
   
   
   
   
action sheet
 
  1. @IBAction func showSampleActionSheet(_ sender: UIButton) {
  2. // 创建UIAlertController
  3. let alertController = UIAlertController.init(title: "动作菜单", message: "随便选一个啊", preferredStyle: .actionSheet)
  4. // 创建选项1, 2, 3
  5. let firstAction = UIAlertAction.init(title: "选项1", style: .default, handler: { action in
  6. self.actionSheetMirror.text = "选了选项1"
  7. })
  8. let secondAction = UIAlertAction.init(title: "选项2", style: .destructive) { (action) in
  9. self.actionSheetMirror.text = "选了选项2"
  10. }
  11. let thirdAction = UIAlertAction.init(title: "选项3", style: .cancel) { (action) in
  12. self.actionSheetMirror.text = "选了选项3"
  13. }
  14. // 添加到action sheet
  15. alertController.addAction(firstAction)
  16. alertController.addAction(secondAction)
  17. alertController.addAction(thirdAction)
  18. // 显示action sheet
  19. present(alertController, animated: true) {
  20. print("ok")
  21. }
  22. }
   
   
   
   
   
选择图象(UIImagePickerController)
 

● 需要允许接入相册

设定请求权限时表示的信息

[Info] -> [Custom iOS Target Properties] -> 添加 [Privacy - Photo Library Usage Description] -> 在值处设置请求权限时表示的信息

● 扩张

  1. extension ImagePickerControllerViewController: UIImagePickerControllerDelegate, UINavigationControllerDelegate {
  2. func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
  3. self.imageView.image = info[UIImagePickerControllerOriginalImage] as? UIImage
  4. dismiss(animated: true, completion: nil)
  5. }
  6. }

● 按钮的处理

  1. @IBAction func chooseImage(_ sender: UIButton) { // 选择图象
  2. let picker = UIImagePickerController.init()
  3. picker.delegate = self
  4. picker.sourceType = .photoLibrary
  5. present(picker, animated: true, completion: nil)
  6. }
   
   
   
   
   
用别的应用来打开(UIActivityViewController)
 
  1. @IBAction func shareSelf(_ sender: UIButton) {
  2. let activityController = UIActivityViewController.init(
  3. activityItems: ["分享"],
  4. applicationActivities: nil
  5. )
  6. present(activityController, animated: true, completion: nil)
  7. }
   
   
   
   
   
显示网页(SFSafariWebViewController)
 需要的头文件
  1. import SafariServeces
 
  1. @IBAction func showWebPage(_ sender: UIButton) { // SFSafariWebViewController
  2. guard let url = URL.init(string: "https://github.com/") else {
  3. return
  4. }
  5. let safariWebViewController = SFSafariViewController.init(url: url)
  6. present(safariWebViewController, animated: true, completion: nil)
  7. }
   
   
   
UIStackView  
   排列子View
   
   
   
   

iOS 管理View的更多相关文章

  1. iOS Programming View Controllers 视图控制器

    iOS Programming View Controllers  视图控制器  1.1  A view controller is an instance of a subclass of UIVi ...

  2. iOS 设置View阴影

    iOS 设置View投影 需要设置 颜色 阴影半径 等元素 UIView *shadowView = [[UIView alloc] init]; shadowView.frame = CGRectM ...

  3. iOS圆角view的Swift实现(利用Core Graphics绘制)

    iOS圆角view的Swift实现(利用Core Graphics绘制) 因为app的列表用用到了圆形图片的头像,所以去探究并思考了一下这个问题.首先这个问题有两个方向的解决方案: 把图片弄成圆形的. ...

  4. iOS Programming View and View Hierarchy 视图和视图等级

    iOS Programming  View and View Hierarchy 视图和视图等级 1.1(1)File → New → Project.. From the iOS section, ...

  5. iOS Container View Controller

    一.UIViewController 做iOS开发的经常会和UIViewController打交道,从类名可知UIViewController属于MVC模型中的C(Controller),说的更具体点 ...

  6. android 和iOS的view上的区别

    android上的view的类叫View, 以下是它的class overview, This class represents the basic building block for user i ...

  7. 图解Android - Android GUI 系统 (2) - 窗口管理 (View, Canvas, Window Manager)

    Android 的窗口管理系统 (View, Canvas, WindowManager) 在图解Android - Zygote 和 System Server 启动分析一 文里,我们已经知道And ...

  8. iOS开发——View的透明属性hidden、alpha、opaque

    Hidden.Alpha.Opaque的区别 在iOS中,每个View都有Hidden.Alpha.Opaque三个关于透明的属性,官方文档介绍如下: 1. @property(nonatomic) ...

  9. ios应用view之间数据传递的方式

    对于不同的viewcontroller之间数据的共享和处理 采用代理的方式,子viewcontroller设计代理协议,并定义协议接口,父viewcontroller实现协议接口,实现子视图控制器退出 ...

随机推荐

  1. 高仿微信实现左滑显示删除button功能

    在实际项目中删除列表中的某一项是很常见的功能.传统的做法能够使用长按监听器等,而如今流行的做法是左滑弹出删除button,微信,QQ等都是这么做的,以下做一个演示样例,代码例如以下: 主页面MainA ...

  2. weex 项目开发(四)项目框架搭建 及 自定义 TabBar 组件

    1.安装  路由模块  及  状态管理模块 npm install vue-router --save npm install vuex --save 2.自定义  TabBar  组件 src / ...

  3. Python正則表達式:怎样使用正則表達式

    正則表達式(简称RE)本质上能够看作一个小的.高度专业化的编程语言,在Python中能够通过re模块使用它.使用正則表達式,你须要为想要匹配的字符串集合指定一套规则,字符串集合能够包括英文句子.e-m ...

  4. Linux在本地使用yum安装软件(转)

    经常遇到有的linux服务器由于特殊原因,不能连接外网,但是经常需要安装一些软件,尤其是在编译一些包的时候经常由于没有安装一些依存包而报的各种各样的错误,当你找到依存的rpm包去安装的时候,又提示你有 ...

  5. RecyclerViewDemo

    https://github.com/eltld/RecyclerViewDemo

  6. SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)

    Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...

  7. openwrt procd 运行的一些log

    void procd_inittab(void) { #define LINE_LEN 128 FILE *fp = fopen(tab, "r"); struct init_ac ...

  8. 检測磁盘驱动的健康程度SMART

    在server中,全部组件中一般最easy坏掉的就是磁盘.所以一般採取RAID来保证系统的稳定性,通过冗余磁盘的方式防止磁盘故障. 现代硬件驱动器一般支持SMART(自我监測分析和报告技术),它可以监 ...

  9. [git] csdn之code平台的使用

    简单的说一下GIT的使用.... 代码和托管平台是csdn刚出来没多久的code.csdn.net [中文的界面什么的简单点,好理解,嗯,易用....] Git 使用最新版:Git-1.8.4-pre ...

  10. IDEA中Git的应用场景

    工作中多人使用版本控制软件协作开发,常见的应用场景归纳如下: 假设小组中有两个人,组长小张,组员小袁 场景一:小张创建项目并提交到远程Git仓库 场景二:小袁从远程git仓库上获取项目源码 场景三:小 ...