这是我参加「第四届青训营 -iOS场」笔记创造活动的的第4篇笔记
UIKit
- 控件
UIApplication
- app进口
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
- 单例方式,一个运用程序只会有一个
- 运用实例,担任监听运用级时刻
- AppDelegate,运用级时刻代理,办理运用程序的生命周期、告诉事情、外部调用
在发生不同事情,调用不同的回调办法
App生命周期
- Not Running,未运行
- Inactive,前台非活动状况,处于前台,可是不能承受事情处理
- Active,前台活动状况,能承受事情处理
- Background,后台状况,假如有可执行代码就进行执行,否则挂起
- Suspended,挂起状况,假如内存不足,会被杀死
视图
- UIKit,供给基础视图类库
- UIView,一切视图的根类
- 实践上是CALayer的封装
- UIView,处理布局和接触事情;CALayer,担任绘图、动画、改动
- 为了职责分离,可是UIView灵活性差,需求进入CALayer层进行处理
- UIViewController,一切视图控制器的基类,担任视图显现、界面跳转
- 生命周期 init -> loadView -> viweDidLoad -> viewWillAppear -> viewDidAppear -> 开始退出 -> viewWillDisappear -> viewDidDisappear -> viewWillUnload -> viewDidUnload -> dealloc
- init进行数据初始化,不要出现创建view
- loadView进行view创建和初始化
- viweDidLoad,附加的view和空间
- viewWillAppear,显现前处理,键盘弹出或特别动画
- viewDidAppear,显现动画后的操作
图形几何学
- UIView重要特点,frame,bounds,center,仅仅一个存取的接口,最终是改动CALayer的frame、bounds、position
- frame,外框的界面巨细
- bounds,长宽
- center,中心
- 锚点,图形移动的中心点/把柄
- 坐标系,一个图层的position依赖于父图层,相对于父图层树立的直角坐标系
- 布局,设置(x, y, height, width),放在界面上
- 主动布局,关心视图之间的约束,多个视图之间的相对方位
- masonry/snapkit
- zPosition,前后方位,仅仅将制作次序放在最上方,实践的view层仍是在下方,那么实践上接触的仍是依据add次序,需求调用
bringSubviewToFront
- 仿射改动,利用transform特点,再二维空间做旋转、缩放、平移
- 3D改动,运用矩阵的各个元素进行改动,添加对z轴的改动
- 视觉效果,圆角、边框、暗影,修正layer的特点;暗影会影响子视图,边框不会
- cornerRadius
- borderWidth
- shadow
Swift
优势
- nil值
- OC,nil代表空目标的指针
- swift,有optional的概念,假如是nil,不会进行任何处理
- 类型安全
- OC 隐氏转换,会导致精度缺失
- swift 显氏转换,在类型转换时需求指出
- 运行快
基础知识
- 变量界说,存在类型主动揣度
// 不可变
let a = 10
// 可变
var b = 20
// 数组
var names: [String] = ["Tom"]
// 字典
var classes: [String : String] = ["class" : "Tom"]
// 合集,无序set
var id: Set<String> = ["1", "2", "3"]
- 可选值
var name: String?
- 循环
for idx in 0..<10 {}
while(condition) {}
- 函数
// inout 表明参数传递为引证传递,调用时传入地址
// 参数前面加 _,表明参数名能够省略
func funcName(argName: aryType, ...) -> returnType {code...}
- 类
class ClassName: FatherClass {}
- 类的扩展,添加办法
extension ClassName {}
- 协议
protocol ProrocalName: NSObjectProtocal {}
// 界说变量
var name: String {get set}
// 界说函数,不必完成
func funcName(argName: aryType, ...) -> returnType
- 协议润饰
- mutating,该办法能够改动协议中的变量
- required,完成指定初始化器,满足协议的初始化要求,子类必须要完成
- required & override,父类和协议有相同的结构器,且父类的结构器没有用required润饰,那么重写的子类结构器就要运用required override润饰;假如子类带final,就不需求用required,final表明不会被任何类承继,也就不会有子类是否需求承继的问题
- 泛型
// 函数
func swap<T>(_ a: **inout** T, _ b: **inout** T) {
let temp = a
a = b
b = temp
}
// 类
class ClassName<Element> {}
- 闭包
- 利用上下文揣度方式参数和回来值类型 {(s1: String, s2: String) -> Bool in} -> {s1, s2 in return s1 > s2}
- 单表达式闭包隐式回来 {arg1, arg2 in arg1 > arg2} 相似java的lmabda表达式,闭包中只有单条句子,直接写
- 简写实践参数名 {arg1, arg2 in arg1 > arg2} -> {0>0 > 1}
- 简写实践参数名 {0>0 > 1} -> ( > )
- 跟随闭包,作为函数参数值传递,需求写在函数参数列表外边
var block: (argType, ...) -> returnType = {arg... in
//code...
return ...
}
// 简写
var block: (String) -> String = {
print($0)
return $0 + "1232"
}
// sort
let s1 = Student(name: "Tom", score: 300)
let s2 = Student(name: "Anna", score: 100)
let s3 = Student(name: "Aana", score: 100)
var students = [s2, s1, s3]
students = students.sorted {
if $0.score != $1.score {
// 大于降序
return $0.score > $1.score
}
// 小于升序
return $0.name < $1.name
}
swfitUI
- 仅仅一个工程方式,与storyboard是平级的
- contentView,办理页面布局
- PreviewProvider,声明视图预览
- 手动设置款式
栈视图
- 三种布局方式
// 笔直
VStack {
}
// 水平
HStack {
}
// 覆盖布局
ZStack {
}
- 嵌套布局
VStack {
Text("Hello, world!")
.padding()
HStack {
Text("Hello, world!")
.font(.headline)
.foregroundColor(Color.red)
.padding()
Text("Hello, world!")
.padding()
}
}
Button
struct CaseView: View {
@State var change = false
var body: some View {
VStack {
Text(change ? "欢迎关注" : "下次再来")
.padding()
Button {
// 取反change
self.change.toggle()
} label: {
Text("button")
.padding()
}
}
}
}
页面push跳转
- 第一个页面
struct ContentView: View {
var body: some View {
NavigationView() {
VStack {
Text("Hello, world!")
.padding()
HStack {
Text("Hello, world!")
.font(.headline)
.foregroundColor(Color.red)
.padding()
Text("Hello, world!")
.padding()
}
NavigationLink(destination: NextView()) {
Text("go to next")
.foregroundColor(.yellow)
}
}
}
}
}