这是我参加「第四届青训营 -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,挂起状况,假如内存不足,会被杀死
    iOSUIKit和Swift | 青训营笔记

视图

  • UIKit,供给基础视图类库
  • UIView,一切视图的根类
  1. 实践上是CALayer的封装
  2. UIView,处理布局和接触事情;CALayer,担任绘图、动画、改动
  3. 为了职责分离,可是UIView灵活性差,需求进入CALayer层进行处理
  • UIViewController,一切视图控制器的基类,担任视图显现、界面跳转
  1. 生命周期 init -> loadView -> viweDidLoad -> viewWillAppear -> viewDidAppear -> 开始退出 -> viewWillDisappear -> viewDidDisappear -> viewWillUnload -> viewDidUnload -> dealloc
  2. init进行数据初始化,不要出现创建view
  3. loadView进行view创建和初始化
  4. viweDidLoad,附加的view和空间
  5. viewWillAppear,显现前处理,键盘弹出或特别动画
  6. viewDidAppear,显现动画后的操作

图形几何学

  • UIView重要特点,frame,bounds,center,仅仅一个存取的接口,最终是改动CALayer的frame、bounds、position
  1. frame,外框的界面巨细
  2. bounds,长宽
  3. center,中心
  • 锚点,图形移动的中心点/把柄
  • 坐标系,一个图层的position依赖于父图层,相对于父图层树立的直角坐标系
  • 布局,设置(x, y, height, width),放在界面上
  1. 主动布局,关心视图之间的约束,多个视图之间的相对方位
  2. masonry/snapkit
  • zPosition,前后方位,仅仅将制作次序放在最上方,实践的view层仍是在下方,那么实践上接触的仍是依据add次序,需求调用bringSubviewToFront
  • 仿射改动,利用transform特点,再二维空间做旋转、缩放、平移
    iOSUIKit和Swift | 青训营笔记
  • 3D改动,运用矩阵的各个元素进行改动,添加对z轴的改动
    iOSUIKit和Swift | 青训营笔记
  • 视觉效果,圆角、边框、暗影,修正layer的特点;暗影会影响子视图,边框不会
  1. cornerRadius
  2. borderWidth
  3. shadow

Swift

优势

  • nil值
  1. OC,nil代表空目标的指针
  2. swift,有optional的概念,假如是nil,不会进行任何处理
  • 类型安全
  1. OC 隐氏转换,会导致精度缺失
  2. 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
  • 协议润饰
  1. mutating,该办法能够改动协议中的变量
  2. required,完成指定初始化器,满足协议的初始化要求,子类必须要完成
  3. 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> {}
  • 闭包
  1. 利用上下文揣度方式参数和回来值类型 {(s1: String, s2: String) -> Bool in} -> {s1, s2 in return s1 > s2}
  2. 单表达式闭包隐式回来 {arg1, arg2 in arg1 > arg2} 相似java的lmabda表达式,闭包中只有单条句子,直接写
  3. 简写实践参数名 {arg1, arg2 in arg1 > arg2} -> {0>0 > 1}
  4. 简写实践参数名 {0>0 > 1} -> ( > )
  5. 跟随闭包,作为函数参数值传递,需求写在函数参数列表外边
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,声明视图预览
  • 手动设置款式

iOSUIKit和Swift | 青训营笔记

栈视图

  • 三种布局方式
// 笔直
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)
                }
            }
        }
    }
}