创建: 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

func lifeCycleDebugTest(string: String) {
print("now in \(string)")
}
// 生命周期测试
override func viewDidLoad() {
super.viewDidLoad()
lifeCycleDebugTest(string: #function)
} override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
lifeCycleDebugTest(string: #function)
} override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
lifeCycleDebugTest(string: #function)
} override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
lifeCycleDebugTest(string: #function)
} override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
lifeCycleDebugTest(string: #function)
} override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
lifeCycleDebugTest(string: #function)
} override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
lifeCycleDebugTest(string: #function)
} override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
super.viewWillTransition(to: size, with: coordinator)
lifeCycleDebugTest(string: #function)
}
   
   
   
   
状态栏
   最上方, 显示时间电量等
 样式

preferredStatusBarStyle

//-------------------------------------------------------
// 状态栏
//-------------------------------------------------------
var style = UIStatusBarStyle.default
override var preferredStatusBarStyle: UIStatusBarStyle {
return style
}
@IBAction func changeStatusBarStyle(_ sender: UIButton) {
style = ((style == UIStatusBarStyle.default) ? .lightContent : .default)
setNeedsStatusBarAppearanceUpdate()
}
 是否隐藏

prefersStatusBarHidden

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

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

重写supportedInterfaceOrientations

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

把已有viewController

插入导航控制器

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

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

(1)先套进navigation controller

(2)绑定编辑按钮

位置: viewDidLoad

self.navigationItem.rightBarButtonItem = self.editButtonItem

● 实现功能

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

● 实现协议

extension PageViewController: UIPageViewControllerDataSource {
// 设置当前页面的前一页
func pageViewController(_ pageViewController: UIPageViewController,
    viewControllerBefore viewController: UIViewController) -> UIViewController? {
if let index = self.targetViewControllers.index(of: viewController), index > {
return self.targetViewControllers[index - ]
}
return nil
}
// 设置当前页面的后一页
func pageViewController(_ pageViewController: UIPageViewController,
    viewControllerAfter viewController: UIViewController) -> UIViewController? {
if let index = self.targetViewControllers.index(of: viewController),
       index < self.targetViewControllers.count - {
return self.targetViewControllers[index + ]
}
return nil
} }

●  创建并展示

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

● 需要允许接入相册

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

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

● 扩张

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

● 按钮的处理

@IBAction func chooseImage(_ sender: UIButton) { // 选择图象
let picker = UIImagePickerController.init()
picker.delegate = self
picker.sourceType = .photoLibrary
present(picker, animated: true, completion: nil)
}
   
   
   
   
   
用别的应用来打开(UIActivityViewController)
 
@IBAction func shareSelf(_ sender: UIButton) {
let activityController = UIActivityViewController.init(
activityItems: ["分享"],
applicationActivities: nil
)
present(activityController, animated: true, completion: nil)
}
   
   
   
   
   
显示网页(SFSafariWebViewController)
 需要的头文件
import SafariServeces
 
@IBAction func showWebPage(_ sender: UIButton) { // SFSafariWebViewController
guard let url = URL.init(string: "https://github.com/") else {
return
}
let safariWebViewController = SFSafariViewController.init(url: url)
present(safariWebViewController, animated: true, completion: nil)
}
   
   
   
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. 基于源码学习-fighting

    今天逛着逛着,看到个培训网站,点进去和客服人员聊了一下.接着,看了看他们的培训课程,想了解一下 嵌入式开发的. (人就是要放空自己,把自己当做什么都不会,当着个婴儿[小学生]一般认真,要学什么知识就是 ...

  2. stl_内存基本处理工具

    内存基本处理工具 STL定义5个全局函数.作用于初始化空间上.各自是:用于构造的construct(),用于析构的destroy(),uninitialized_copy(),uninitialize ...

  3. 汉澳sinox不受openssl心血漏洞影响并分析修复其漏洞代码

    OpenSSL 心血(HeartBleed)漏洞 是openssl 在 2014-04-07 发布的重大安全漏洞(CVE-2014-0160)这个漏洞使攻击者可以从server内存中读取64 KB的数 ...

  4. hiberinate二级缓存

    hibernate.cfg.xml配置 <!-- 二级缓存类型 --> <property name="hibernate.cache.region.factory_cla ...

  5. [转载]php中深拷贝浅拷贝

    转自:http://cnn237111.blog.51cto.com/2359144/1283163 PHP中提供了一种对象复制的操作,clone.语法颇为简单: $a = clone $b; 1.浅 ...

  6. Spyder的汉化

    我准备写下spyder的汉化问题:对于英文大佬,从来没得汉化问题,但是对于新手和英语差的来说,汉化还是有必要,至少用汉化过得软件能快速掌握软件等.后期会用软件了在慢慢习惯英文也不迟...哈哈哈哈.本文 ...

  7. ARC机制之__strong具体解释

    ARC机制之__strong具体解释 __strong  解析: 默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用.这意味着,仅仅要引用存在,对象就不能被销毁.这是一种所期望的 ...

  8. Hero In Maze

    Hero In Maze 时间限制(普通/Java):1000MS/10000MS          执行内存限制:65536KByte 描写叙述 500年前,Jesse是我国最卓越的剑客. 他英俊潇 ...

  9. http权威指南(一)-Http概述

    Http概述 在Web中,不管是浏览器还是server都是通过Http相互通信的.那么Http是怎样工作的呢? 首先,client向server发送Http请求,server会在Http响应中回送所请 ...

  10. MapReduce算法形式一:WordCount

    MapReduce算法形式一:WordCount 这种形式可以做一些网站登陆次数,或者某个电商网站的商品销量啊诸如此类的,主要就是求和,但是求和之前还是要好好清洗数据的,以免数据缺省值太多,影响真实性 ...