自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(92)
  • 收藏
  • 关注

原创 Swift —— Moya和高阶函数

我们日常都会和网络打交道不管是使用 AFN 还是 Alamofire ,虽然这两者都封装了 URLSession ,不用让我们使用官方繁琐的 API。久而久之我们会发现我们的APP中到处都散落着和 AFN 、 Alamofire 相关的代码,不便于统 一的管理,而且很多代码内容是重复的,于是我们就会新建一个中间层 Network layer 来统一 管理我们代码中 AFN 、 Alamofire 的使用。于此同时我们仅仅希望我们的App只和我们的 Network layer 打交道,不用关系底层使用的那个

2022-07-11 21:54:54 1305 2

原创 Swift ——String 与 Array

先创建一个空的字符串,运行后打印地址,看到只有一个有效消息0xe000000000000000。打开源码查看,看到在String.swift里面有一个初始化空字符串的方法。那么看到StringGuts.swift方法里面,看到初始化空字符串的方法。在看到StringObject.swift里面的empty方法。看到这里根据架构不同调用不同的初始化方法。这里看到arm的结构调用的方法,这里对属性进行赋值。StringObject是一个结构体,这些属性是StringObject的成员变量,那么当对

2022-07-10 23:27:00 960

原创 Swift ——泛型与集合

下面的 multiNumInt 是个非泛型函数,主要用于计算两个数的乘积multiNum 函数很实用,但是它只能用于 Int 值。如果我们想计算两个 Double 或者 其他类型的乘积的值,我们需要在写一些函数,比如 multiNumDouble函数:但是我们发现, 函数体是一样的。唯一的区别是它 们接收值类型不同( Int和double)。这个时候我们想找到一个可以计算任意类型值的函数怎么办?泛型正是能让我们写出这样函数的语法。我们先来看一下泛型的基本写法 ,首先我我们要指定一个占位符 T ,紧挨着写

2022-07-08 17:07:48 575

原创 Swift ——协议

但是这个时候我们接到一个需求: 要为这两个类创建一个 debug 函数来打印当前类的基本信息。从继承的⻆度来说,我们可能会想到抽取一个公共的基类,当然大家都是动物,人也是动 物。从业务逻辑上来说,这么处理不太合理。可能最直观的办法是对于每一个类都写一个单独的 方法函数。如果我们对当前代码中的每个类都需要 debug ,那上面这种方法显然是行不通的,于是我们有 了下面的代码当然看到这里可能大家也会觉得没有问题,如果我们要具体的描述当前类的具体信息,这个时候 我们还需要引入一个公共的基类,同时我们还需要有

2022-07-05 22:52:43 1177 1

原创 Swift ——闭包

之前在代码的书写过程中,我们已经或多或少的接触过函数,函数本身也有自己的类型,它由形式参数类型,返回类型组成。如果将函数传递给a变量,那么就可以借助a来调用方法,这里addTwoInts代表函数类型。如果出现了同名函数,但是返回值或者参数不一样,那么就需要指明函数类型。否则就会报 ambiguous user of *** 错误,因为这个时候编译器不知道要给a赋值哪一个参数。把函数赋值给a,那么a里面储存的是什么呢?运行后打印a,这里看懂存储的是函数类型.这里函数类型也是引用类型,当把函数赋值给a的时候,

2022-07-03 21:46:23 1206

原创 Swift —— 指针

Swift —— 指针1.指针2. 指针类型3. 原始指针的使用4. 泛型指针的使用5. 指针读取macho中的属性名称6. 内存绑定7. 内存管理1.指针为什么说指针是不安全的呢?主要以下几点:比如我们在创建一个对象的时候,是需要在堆区分配内存空间的,但是这个内存空间的生命周期是有限的,也就意味着如果我们使用指针指向这块内存空间,如果当前内存空间的生命周期到了(也就是引用计数为0了),那么当前的指针就成了未定义的行为,也就是野指针。我们创建的内存空间是有边界的,比如创建一个大小为10的数组,这个

2022-06-26 21:13:28 1557 1

原创 数据结构与算法 —— 斐波那契函数 & LRU

数据结构与算法 —— 斐波那契函数 & LRU1. 斐波那契数列1.1 递归1.2 数组1.3 临时变量1.4 数列1.5 数列优化2. LRU2.1 双向链表与哈希表2.2 队列1. 斐波那契数列斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……也就是除了第一个和第二个数字之外,任何数

2022-02-28 15:35:51 1401

原创 Swift —— Enum & optional

Swift —— Enum & optional1. 枚举的基本用法2. 关联值3. 模式匹配3. 枚举的大小1. 枚举的基本用法swift 中通过 enum 关键字来声明一个枚举enum LGEnum{ case test_one case test_two case test_three}在 C 或者 OC中默认受整数支持,也就意味着下面的例子中: A, B, C分别默认代表 0, 1,2typedef NS_ENUM(NSUInteger, LGEnum)

2022-01-25 17:23:21 1730

原创 Swift —— 属性

Swift —— 属性1. 存储属性1.1 let 和 var 的区别代码角度汇编角度SIL角度2. 计算属性1. 存储属性存储属性是一个作为特定类和结构体实例一部分的常量或变量。存储属性要么是变量存储属性 (由 var 关键字引入)要么是常量存储属性(由 let 关键字引入)。存储属性这里没有什么特 别要强调的,因为随处可⻅。 比如这里的 age 和 name 就是我们所说的存储属性,这里我们需要加以区分的是 let 和 var 两者的区别:从定义上: let 用来声明常量,常量的值一旦设置好便不能

2022-01-05 16:06:43 1830

原创 Swift —— 类与结构体的方法

Swift —— 类与结构体的方法1. 异变方法1. 异变方法Swift 中 class 和 struct 都能定义方法。但是有一点区别的是默认情况 下,值类型属性不能被自身的实例方法修改。如果想要自身的实例方法可以修改struct的属性,那么就需要在方法前面加上mutating的关键字。那么mutating做了些什么呢?在结构体里添加一个没有mutating的方法和一个有mutating的方法,这样之后运行生成SIL文件方便进行观察。struct Point { var x = 0.

2021-12-30 17:50:06 1954

原创 Swift —— 类与结构体

Swift —— 类与结构体1. 初识类与结构体1.1 异同点1.2 类(引用类型)1.3 结构体 (值类型)1.4 类和结构体的内存位置1.4.1 结构体的内存位置1.4.2 类的内存位置2. 类的初始化器2.1 指定初始化器&便捷初始化器2.2 可失败初始化器2.3 必要初始化器3. 类的生命周期3.1 SIL文件分析3.2 类的初始化流程1. 初识类与结构体1.1 异同点结构体和类的主要相同点有:定义存储值的属性定义方法定义下标以使用下标语法提供对其值的访问定义初始化器使用

2021-12-28 15:02:36 1834

原创 Flutter —— 混合工程自动化

Flutter —— 混合工程自动化1. 前言2. 混合工程1. 前言作为一个团队来说,会有很多的工程搭配,团队里会有Flutter工程,Android工程和iOS工程,那么这些工程搭配在一起的时候就会有问题,因为每个开发者都有自己的开发环境,那么这个时候如果去配置所有的环境的话就很麻烦,所以就有了混合工程自动化的需求。2. 混合工程先创建一个flutter_module 和 一个 iOS工程。在iOS工程里面创建一个button,响应方法里面展示flutterController, 那么这个时候肯

2021-12-15 16:59:31 2018

原创 Flutter —— Packages 和 Plugin

Flutter —— packages 和 plugin1. Packages1.1 简介1.2 创建 Packages1.3 发布 Package1.4 Package在项目中应用1.5 Package分数1.6 Part2. Plugin1. Packages1.1 简介Dart package 最低要求是包含一个 pubspec.yaml 文件,package只包含dart部分。此外,一个 package 可以包含依赖关系 (在 pubspec.yaml 文件里声明)、 Dart 库、应用、资源

2021-12-03 17:25:08 2832 2

原创 Flutter —— 混合开发

Flutter —— 混合开发1. 混合开发2. 混合开发操作第三方库 imagePicker1. 混合开发混合开发分两种情况Flutter 项目调用原生功能原生的项目嵌入Flutter(比较重,不建议)2. 混合开发操作回到之前的仿微信的我的界面来做一个点击头像通过相册更换图片的功能。在之前的现实头像的地方添加一个GestureDetector,并且添加onTap方法。Flutter里面和原生通讯用的是Flutter专门提供的MethodChannel。这里声明一个_method

2021-11-29 15:37:13 766

原创 Flutter —— key 的原理

Flutter —— key 的原理1. Key 的原理2. Key 的 探究之前的文章中有的类故意没有写Key,那么这个Key有什么作用呢?今天来探究一下。1. Key 的原理key 本身是一个抽象类,有一个工厂构造方法创建ValueKey2. Key 的 探究其实任何的Widget都是有key的,key是可以为空的。创建一个KeyDemo放在MaterialApp的home里面class KeyDemo extends StatefulWidget { const KeyDem

2021-11-25 15:10:31 1812

原创 Flutter —— 渲染原理

Flutter —— 渲染原理1. 渲染原理2. Render 树3. Element 树4. Element 和 Widget 的关系1. 渲染原理在Flutter实战中写道,Flutter 框架的布局、绘制的处理流程是这样的:根据 Widget 树生成一个 Element 树,Element 树中的节点都继承自 Element 类。根据 Element 树生成 Render 树(渲染树),渲染树中的节点都继承自RenderObject 类。根据渲染树生成 Layer 树,然后上屏显示,La

2021-11-25 10:36:32 1884

原创 Flutter —— 生命周期

Flutter —— 生命周期1. 生命周期1. 生命周期一个对象从创建到销毁所经历的过程就是一个生命周期,说白了就是回调方法。在Flutter中已经封装好了,知道widget处于什么样的状态了,然后给你一个对应状态的回调,所以说生命周期其实是一系列的回调方法。那么生命周期有生命作用呢?...

2021-11-23 15:01:57 1734

原创 系统学习iOS动画 —— Stroke和路径动画

这是要完成的动画:先添加需要的代码,这里需要将storyboard的ViewController换成TableViewController,然后为其Embed in Navigation Controllerimport UIKitfunc delay(seconds: Double, completion: @escaping ()-> Void) { DispatchQueue.main.asyncAfter(deadline: .now() + seconds, execute:

2021-11-22 16:09:14 1784

原创 Flutter —— 搜索框

在聊天界面添加一个搜索框。那么就在ListView里面添加一个cell,那么就需要itemCount里面加1。 itemCount: _datas.length + 1,创建一个chat package,然后将chat_page拖进来并且重新创建一个search_cell文件。将ListView里面的itemBuilder的代码抽取成一个方法,然后在里面判断如果index == 0 则返回 SearchCell。这里后面需要index–,否则index就会从1开始。接下来写search ce

2021-11-19 10:33:16 5015

原创 Flutter —— dio

Flutter —— dio1. 关于import2. pubspec1. 关于importimport 中 as关键字来给他起了个别名来避免类名、方法名冲突。导入库,默认是整个库都导入show:执行需要导入的内容。hide:需要隐藏的内容。2. pubspecpubspec 包含:name:项目名称,必填字段description:项目介绍,非必填字段publish_to : 指定包发布的位置version : 发布的工程版本号environment SDK : dar

2021-11-16 16:35:27 3420

原创 系统学习iOS动画 —— 渐变动画

这个是希望达成的效果:先创建需要的控件:class ViewController: UIViewController { let timeLabel = UILabel() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. view.addSubview(timeLabel)

2021-11-12 14:51:54 2506

原创 Flutter —— 异步编程和多线程

Flutter —— 异步编程在网络请求中经常使用异步编程,那么来探索一下Flutter 中的异步编程。dart是单线程的,所以底层没有锁之类的东西,但是这不代表着dart不能异步,异步不代表多线程。下面代码运行后发现做其他事情被堵塞住了,这里async不起作用是因为需要搭配Future使用。将耗时操作使用Future包装起来,这里可以看到做其他事情就不会被堵塞住了,那么现在即使方法不加async也是异步的,因为Future里面已经是异步的了。如果把 print(‘结束data = $_d

2021-11-11 17:38:38 2770

原创 系统学习iOS动画 —— 形状和蒙版

这是今天要完成的动画:先创建好所需要的控件:import UIKitclass ViewController: UIViewController { let screenWidth = UIScreen.main.bounds.size.width let screenHeight = UIScreen.main.bounds.size.height let backgroundImage = UIImageView() let VSLabel = UILabel(

2021-11-10 17:09:52 1002

原创 系统学习iOS动画 —— 动画组, 时间控制, 图层弹簧动画

1. 动画组和时间控制动画组可以对动画进行分组,可以向组中添加多个动画并同时调整持续时间,代理和timingFunction等属性。 对动画进行分组会产生简化的代码,并确保所有动画将作为一个实体单元同步。这里创建一个CAAnimationGroup let formGroup = CAAnimationGroup() formGroup.duration = 0.5 formGroup.fillMode = .backwards然后创建一个向右移动的动画和变化透明度的动画

2021-11-10 11:11:26 1684

原创 Flutter —— 聊天界面

Flutter —— 聊天界面首先做的事右上角的按钮,右上角要弄一个menu,那么这里可以在AppBar的actions添加Flutter封装好的控件PopupMenuButton,用一个container包着调整位置,然后用offset调整自身的位置。actions: [ Container(child: PopupMenuButton( itemBuilder: (BuildContext context) { re

2021-11-09 14:38:34 2278

原创 Flutter —— 通讯录页面&索引条

Flutter —— 通讯录页面&索引条1. 通讯录页面2. 索引条1. 通讯录页面做完了发现页面和我的页面,接下来做通讯录页面。将_currentIndex 改成1方便开发。发现通讯录页面还是要用到之前的_themColor,那么就将_themColor抽取出来以便公用。创建一个文件来存放这些需要公用的常量。然后放入主题色之后,在别的地方import这个文件就能使用了。//主题色const Color weChatThemColor = Color.fromRGBO(220, 220,

2021-11-05 15:43:41 1282

原创 系统学习iOS动画—— BahamaAirLogin(动画的Keys和代理)

系统学习iOS动画—— BahamaAirLogin(动画的Keys和代理)关于视图动画和相应的闭包语法的一个棘手问题是,一旦您创建并运行视图动画,您就无法暂停,停止或以任何方式访问它。但是,使用核心动画,您可以轻松检查在图层上运行的动画,并在需要时停止它们。 此外,您甚至可以在动画上设置委托对象并对动画事件做出反应。接着上一篇文章的工程,这里先添加一个属性info。let info = UILabel()在viewDidLoad里面设置好info的属性info.frame = CGRect(

2021-11-03 17:03:04 263

原创 系统学习iOS动画—— BahamaAirLogin(Layer 动画)

系统学习iOS动画—— BahamaAirLogin(Layer 动画)在我之前到文章 —— 系统学习iOS动画—— BahamaAirLogin(UIKit动画)中,用的是UIView.animate来进行alpha的变化实现添加透明度变化动画。layer 动画的工作方式很像UIView 动画;只需在定义的时间段内,在起始值和结束值之间设置属性的动画,并让Core Animation处理其间的渲染。然而,layer动画比UIView动画有更多的可动画属性;在设计效果时,这给了开发者很多选择和灵活性。许

2021-11-03 15:39:49 332

原创 系统学习iOS动画—— Flight Info(keyframe-animations)

这是要达成的效果:先添加所需要的部件:class ViewController: UIViewController { let screenWidth = UIScreen.main.bounds.size.width let screenHeight = UIScreen.main.bounds.size.height let backgroundImageView = UIImageView() let summaryIcon = UIIma

2021-11-03 10:58:07 389

原创 Flutter ——发现页面和我的页面搭建

Flutter —— 发现页面和我的页面搭建1. 发现页面2. 我的页面上文中进行了基础页面的搭建,并且创建了底部导航栏,那么今天就开始搭建发现页面和我的页面。先来到上次的rootpage中将_currentIndex改为2,这样默认选择的就是发现页面,方便进行页面搭建。要搭建页面,心里就要大概思考要用什么部件来搭建这个页面。1. 发现页面那么看到这个界面,看到有AppBar,那么就想到要用scaffold,然后在body用container包着row来实现。这里将AppBar的Title 颜

2021-11-02 17:30:19 1268 2

原创 Flutter —— 弹性盒子布局&状态管理&项目搭建

Flutter —— 弹性盒子布局&状态管理&项目搭建1. Stack2. Positioned3. AspectRatio4. 状态管理5. 项目搭建5.1 底部导航栏5.2 程序的名字以及图标5.3 Assets1. Stack创建一个StackDemo。class StackDemo extends StatelessWidget { const StackDemo({Key? key}) : super(key: key); @override Widget bu

2021-11-01 09:27:03 328

原创 系统学习iOS动画—— BahamaAirLogin(UIKit动画)

这个部分介绍UIKit动画API,这些API专门用于轻松制作视图动画。UIKit动画API不仅易于使用,而且提供了大量灵活性和强大功能,可以处理大多数动画要求。这个是要达到的效果:首先要添加这些小部件:import UIKitclass ViewController: UIViewController { let screenWidth = UIScreen.main.bounds.size.width let screenHeight = UIScreen.main.bound

2021-10-29 14:51:43 221

原创 IOS —— Crash分析

常见crash类型容器越界使用未初始化的变量用户授权问题选择器方法未定义子线程刷新uiKVO数据类型不匹配内存溢出野指针死循环

2021-10-27 14:33:04 2888

原创 Flutter —— 文本,Container,布局

Flutter —— 文字和弹性盒子布局1. 文本1.1 Text1.2 RichText2. Container3.布局3.1 Row & Column & Stack3.2 Alignment3.3 主轴3.4 交叉轴3.5 Expanded1. 文本1.1 Text首先创建一个简单的Text,然后输入文本后运行。class TextDemo extends StatelessWidget { @override Widget build(BuildContext co

2021-10-26 14:28:55 898

原创 Swift 动画 —— controller转场动画

Controller的转场动画主要是通过UIViewControllerAnimatedTransitioning 和 UIViewControllerTransitioningDelegate 来完成。实现效果:首先,创建一个class PresentViewControllerAnimation,继承自NSObject,遵守UIViewControllerAnimatedTransitioning。然后创建一个初始化方法,声明一个originFrame来保存初始化的frame。这里遵守UIView

2021-10-25 16:24:22 884

原创 Swift动画 —— Lottie

Lottie除了Lottie和我们刚刚做的图像序列方法,我们还可以使用GIF,视频,甚至可以使用贝塞尔路径或者UIView动画功能的组合来实现。但是Lottie是相对来说比较好的方式,将Lottie和其他方式对比。PNG序列图像PNG序列图形的最大缺点之一是它们的尺寸相当大,这使得它们在不同的界面上导出和操作有些麻烦。相比之下,Lottie文件非常小,大小也很方便,因此下载速度很快,并尽可能保持网站或应用程序运行的流畅。GIF格式虽然比PNG图形小,但gif仍然是一种非常占用空间的格式,平均尺寸

2021-10-25 15:16:29 1575

原创 Flutter —— 页面基础

Flutter —— 基础Flutter 和 RNFlutter 页面基础页面自定义widgetMaterialApp & ScaffoldListViewFlutter 和 RNFlutter能够在Android 和iOS 上同时运行的原因是iOS和Android上面都安装了Flutter的渲染引擎,而RN则是在原生UI的基础上进行包装,那么一旦原生的UI更新,RN就也需要更新,进行兼容处理,并且RN让Android的显示Android的控件,iOS显示iOS的控件,那么就不是一套UI。F

2021-10-25 10:43:58 693

原创 Swift —— 有趣的算法

Swift —— 有趣的算法1. FIZZBUZZ2. 二分法检索3. Factorials & Recursion (阶乘和递归)4. 找到array中出现最多的词5. Reverse every other word6. Fibonacci Sequence (斐波纳契数列)7. 高阶函数 (Higher Order Functions)MapFilterReduce8. 二叉树查找值1. FIZZBUZZ写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候,打印“Fizz”替代数

2021-10-11 09:57:28 287

原创 Swift动画 —— 登陆页面动画(二)

下面是想要实现的动画效果:Logo的动画做完了,接下来要做中间画线的动画以及中间Button的浮现动画同样的,在这里声明loginButton属性和所需要的button大小属性。 private let loginButtonSize = CGSize(width: 60, height: 60) var loginButton: UIButton!在setupUI里面设置好loginButton的大小、位置、border、cornerRadius、title等属性并添加到为vie

2021-10-09 17:32:48 314

原创 Swift动画 —— 登陆页面动画(三)

下面是想要实现的动画效果:接下来就剩下????。的动画了。首先需要把????。的图片放到Asset里面。同样的声明一个carImageView属性和期望的图片大小属性,这里需要多创建一个carAnimator来实现动画。 private let carSize = CGSize(width: 50, height: 45) private var carImageView: UIImageView! private var carAnimator: UIViewPropertyA

2021-10-09 17:32:21 273

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除