中级篇啦🤣开心点咯。虽然最近有点低落,就当发泄了。
小知识点
"""
三引号对"""
可以保留复制来的文本换行- 图片显示方式:
- Scale to fill 拉伸 即拉到和框框一样的比例/大小
- Aspect fit 居中 原图比例不变,但会有白边
- Aspect fill 平铺 ,通常配合下面的裁边Clip to bounds使用
- 属性line设为0. 即自动控制行数
- 内容扩展优先级 Content Hugging Priority 大了就低
- Class 中的属性必须有值。如果你不想给值,可以加个 ! 就是说它一定有值。
- Btn.setTitle(“改标题”)
- 拖新文件到工程里记得选上
Copy item if needed
,不然只拖了个快捷方式 - Didload只会执行一次
- 在整个Controller的属性中,选高度–》Freedom–》可以随意设置。方便查看。
- 转String可以不用
String(a)
用a.description
自定义导航条
颜色(直接改回报错,是Xcode的Bug。只好用代码。):
1 | navigationController?.navigationBar.largeTitleTextAttributes = [ |
背景透明(用一个空图片)
1 | navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default) |
隐藏返回标题
点标题。把Back button改成空格就好啦。
自定义状态栏字体颜色
1 | override var preferredStatusBarStyle: UIStatusBarStyle{ |
没有导航条怎么改状态栏颜色:
在AppDelegate.swift文件中,插入到application函数一行:UIApplication.shared.statusBarStyle = .lightContent
动画
视差
新建一个UIView变量var headerView : UIView!
来替换原生的tableView.tableHeaderView
代码如下
1 | headerView = tableView.tableHeaderView//取出HeaderView |
这时候整个Cell会下移300像素(可以通过输出scrollView.contentOffset.y
的值看到是 -300),需要把headerView的位置上移300个像素。
代码如下
1 | override func scrollViewDidScroll(_ scrollView: UIScrollView) { |
模糊层
- 新建模糊层的 ViewController 。背景选成透明(Clear Color)
- 右键拖到新的 View Controller,选 Present Modally
- 转场效果中选 Over Current Context
点击退场
拖一个手势到 View层 注意拖得不合适可能点击没效果。可以调试下。
然后拖着手势建一个IBAction:
1 | @IBAction func tapBackground(_ sender: Any) { |
入场动画
先在 didLoaded 时把它放到800里之外stackView.transform = .init(translationX: 800, y: 0)
再在 didApeal时 让它飞进来
1 | override func viewDidAppear(_ animated: Bool) { |
进阶版
按钮组在这里拖按钮。
然后把变量分别拖到各个按钮上,这些按钮就是一组的了。
1 | override func viewDidLoad() { |
拖拽手势
1 | @IBAction func dragStackView(_ sender: UIPanGestureRecognizer) { |
反向转场
先写一个转场函数:
1 | @IBAction func backToDetail(segue: UIStoryboardSegue){} |
把按钮拖到这个Exit上。选择上面的函数就好啦。
JSON
Encode JSON
1 | func saveToJson() { |
Decode JSON
func loadJson() {
let coder = JSONDecoder()
do {
let url = Bundle.main.url(forResource: "weapons", withExtension: "json")!
let data = try Data(contentsOf: url)
weapons = try coder.decode([Weapon].self, from: data)
} catch {
print(error)
}
}
数据录入
Picker View
- 每个Picker加一个tag用来标识
- ctrl拖到Controller上选上Delegate和DataSource
- 新建一个PickerViewFill.swift写入以下内容:
1 | import UIKit |
会自动填充出两个函数。
一个控制行,一个控制列。
如何区分不同的列呢。component
就是列数 (从0开始)
联动:打didselect联想出这个函数:
1 | func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { |
Stepper
1 | @IBAction func mvStepper(_ sender: UIStepper) { |
点击单元格
didSelect
1 | override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { |
Alert
Alertsheet
1 | let actionSheet = UIAlertController(title: "总标题", message: nil, preferredStyle: .actionSheet) |