我将整个项目的复习拆分成了几个部分, 每完成一部分我都会提交一次代码, 大家根据所复习到的部分, 检出对应的分支来看代码就可以了, 代码中的注释已经十分详尽了, 有问题或者疑惑大家可以随时留言沟通.
项目地址
涵盖的知识点:
1.界面介绍
2.梳理整个项目的框架结构
3.配置App Icons和Launch Images
4.占位符 '_'
5.KVC为私有属性赋值
6.自定义tabBar内部子控件约束
7.Swift 中的extension
8.为函数参数设置默认值
9.自定义导航栏
10.问题分析:TabBar文字选中颜色Push一个页面,在pop回来之后就变成系统的蓝色的。
1. 梳理整个项目的框架结构
/** MVVM 文件夹结构
- Model
- ViewModel
- View(nav+tab、首页、消息、发现、我)
- Main (nav+tab等)
- View
- ViewController
- Home (首页)
- View
- ViewController
- Message (消息)
- View
- ViewController
- Discover (发现)
- View
- ViewController
- Mine (我)
- View
- ViewController
*/
2. 配置App Icons和Launch Images
Xcode11之后的图片.png
如上图, 对于App Icons的设置, 直接点击后面的箭头, 跳转后添加对应图片即可; 而在Xcode11之后你会发现缺少了 Launch Images Source选项, 所以导致无法去添加启动资源.
解决办法: 首先在Assets.xcassets添加启动图资源, 然后在工程 targets--Build Settings 搜索 Asset Catalog, 然后设置创建的启动页名字即可如下图所示.
image.png
注意: 据说从2020年4月开始,使⽤ iOS13 SDK 的 App 将必须提供 LaunchScreen,而LaunchImage将退出历史的舞台,说明以后启动页要通过LaunchScreen来设置了
3. 涉及的知识点
知识点1: addChild(_ childController: UIViewController) 是系统原有的方法, 和下面写的只是参数不同, 所以叫重载构造函数!
知识点2: 当方法的参数的外部参数为占位符( _ )的时候, 调用该方法的时候就只显示你传入的数据, 其他的什么也不显示. ( _ )也可以删除, 删除之后再调用就和正常的参数一样显示参数名称了知识点1、2.png
知识点3: 对于控制器设置标题时知识点3.png
知识点4: KVC为私有属性赋值, key就是该类的属性名称!!!知识点4.png
知识点5. 自定义tabBar内部子控件约束
![](https://img.haomeiwen.com/i1197641/c5c6f560c393eeda.png)
override func layoutSubviews() {
super.layoutSubviews()
// 所有添加到tabBar上的item都是subView
// 因为item要均分, 所以计算子控件的宽度 一共五个
let w = UIScreen.main.bounds.size.width * 0.2
// 确定子控件的位置
var index: CGFloat = 0
// 观察图层了解到, 被添加到tabBar上的item 为UITabBarButton类型, 所以遍历所有子控件, 找到在外界添加的item
for view in subviews {
// 判断类型是否为UITabBarButton (注: UITabBarButton为私有属性, .self获取不到该类型的class)
if view .isKind(of: NSClassFromString("UITabBarButton")!) {
// 重新设置item 的宽和x
view.frame.size.width = w
view.frame.origin.x = index * w
index += 1
// 给 加号按钮 预留出中心位置
if index == 2 {
index += 1
}
}
}
// 设置加号按钮的约束
plusButton.center.x = frame.width * 0.5
plusButton.center.y = frame.height * 0.5
}
知识点6: Swift中'分类'的创建及使用
1.command + N 打开创建文件面板
2.选择Swift File
3.填写有关联的命名.png
- 修改import Foundation 为 import UIKit
- 写 extension 要拓展的类 { 自定义操作 }
例如给UIBarButtonItem添加分类.png
知识点7. 为函数参数设置默认值
// MARK: 为UIBarButtonItem 写extension
extension UIBarButtonItem {
/** 构造便利函数 的 拓展
-- UIBarButtonItem 可能有三种类型
-- 纯图片
-- 纯文字
-- 图片 和 文字
*/
// imageName: String? = nil 这种形式 就是参数为可选值 , 外界写不写该参数都可以, 且不写的话默认值为nil
convenience init(imageName: String? = nil, title: String? = nil, target: Any?, action: Selector) {
self.init()
let button: UIButton = UIButton(type: UIButton.ButtonType.custom)
button.addTarget(target, action: action, for: UIControl.Event.touchUpInside)
// 因为传进来的imageName、title 均为可选值,
// 所以需要使用 可选值判断 -> if let/var (注: 不用guard let/var 是因为判断完成之后, 其他参数还会有后续操作)
if let img = imageName {
button.setImage(UIImage(named: img), for: UIControl.State.normal)
button.setImage(UIImage(named: "\(img)_highlighted"), for: UIControl.State.highlighted)
}
if let tit = title {
button.setTitle(tit, for: UIControl.State.normal)
button.setTitleColor(.darkGray, for: UIControl.State.normal)
button.setTitleColor(.orange, for: UIControl.State.highlighted)
}
button.sizeToFit()
// 注: 在外界创建 UIBarButtonItem 的时候是这样赋值的, 所以在这直接为 customView 赋值
// navigationItem.leftBarButtonItem = UIBarButtonItem(customView: button)
customView = button
}
}
例如调用时, 纯文字的item,imageName写不写都可以:
navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: nil, title: "PUSH", target: self, action: #selector(pushButtonClick))
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "PUSH", target: self, action: #selector(pushButtonClick))
知识点8: 系统的导航控制器自定义左侧返回按钮, 会使拖拽屏幕左侧的返回功能失效(拖拽屏幕左侧的返回功能 是 iOS7.0之后才有的)
-- 解决方法: 自定义导航控制器
-- 原因: 当前导航栏的响应左侧拖拽的手势代理, 系统未设置成self
知识点9: UINavigationController 的 children 和 viewControllers
children 和 viewControllers.png
知识点10: 定义 common 文件, 类似于 OC 中的.pch文件
import UIKit
/**
Swift 中所有文件全局共享, 没有 PCH 文件(类似于 OC 的.pch问价)
*/
// MARK: 屏幕尺寸相关
let KSCREENBOUNDS = UIScreen.main.bounds
let KSCREENWIDTH = KSCREENBOUNDS.width
let KSCREENHEIGHT = KSCREENBOUNDS.height
/// app 主题颜色
let THEMECOLOR = UIColor.orange
/// RGB 颜色
func RGB(r: Float, g: Float, b: Float, alpha: Float = 1) -> UIColor {
return UIColor(red: CGFloat(r/Float(255)), green: CGFloat(g/Float(255)), blue: CGFloat(b/Float(255)), alpha: CGFloat(alpha))
}
/// 随机色
func HRandomColor() -> UIColor {
let r = Float(arc4random() % 256)
let g = Float(arc4random() % 256)
let b = Float(arc4random() % 256)
return RGB(r: r, g: g, b: b)
}
知识点11.
问题: TabBar文字选中颜色Push一个页面,在pop回来之后就变成系统的蓝色的。
解决: 是给UITabBarController设置默认值
// 这里的self是UITabBarController
self.tabBar.tintColor = selColor;
.End
网友评论