- 博客(140)
- 资源 (13)
- 收藏
- 关注
原创 applicationDidEnterBackground方法和applicationWillEnterForeground方法不调用
在iOS 10 后 applicationDidEnterBackground和applicationWillEnterForeground已经被SceneDelegate给接管了。所以关于前台后台等的处理操作,不应该写在AppDelegate里。
2022-07-06 11:43:49
1426
原创 iOS基础 获取状态栏的高度
由于各代iPhone对屏幕尺寸以及前置摄像头、传感器等的迭代,对于其状态栏的高度也发生了一些微小的变化,不再是如以前的20高度了。因此在iOS13后,对于状态栏的高度,有这么一个方法可以获取。参考文章:VeggieOrz的文章:iOS 准确获取 iPhone 状态栏、导航栏、TabBar高度,看这篇就够了...
2022-06-12 09:37:56
1772
原创 正则表达式 常用的正则规则汇总
数字:^[0-9]*$n位的数字:^\d{n}$至少n位的数字:^\d{n,}$m-n位的数字:^\d{m,n}$零和非零开头的数字:^(0|[1-9][0-9]*)$非零开头的最多带两位小数的数字:^([1-9][0-9]*)+(.[0-9]{1,2})?$带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$正数、负数、和小数:^(-|+)?\d+(.\d+)?$有两位小数的正实数:^[0-9]+(.[0-9]{2})?$有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
2022-06-07 12:08:20
952
原创 iOS基础 对AFNetworking工具进行封装
封装封装的工具类是继承自:AFHTTPSessionManager创建单例使用static关键字、用let声明一个本类型的常量。(let是线程安全的。如:import UIKitimport AFNetworkingclass GGNetworkTools: AFHTTPSessionManager { static let share = GGNetworkTools()}如此单例就制作好了。解除不安全的网络访问限制封装import AFNetworkingenu
2022-05-26 15:51:34
933
原创 iOS基础 自定义转场控制器上的动画 UIPresentationController
概述约定:底层控制器:在层级较低的控制器,由它创建新控制器转场控制器:就是底层控制器创建的新控制器转场控制器被创建出来,若要自定义转场的动画,比如从中心逐渐放大知道占据满屏,这样系统没有提供的动画,就需要底层控制器来创建新的转场动画。首先需要底层控制器创建新控制器的时候,给新控制器约定管理转场与动画的代理。如:accountVC.transitioningDelegate = self然后底层控制器需要实现相关的协议,即实现控制器转场协议:UIViewControllerTransitio
2022-05-25 12:01:58
674
原创 iOS基础 自定义转场控制器UIPresentationController
概述基本上苹果提供的控制器转场都能满足我们的需求,比如反转、淡入淡出、翻页、从下往上显示等等,这都可以通过设置控制器实现。但如果有一些特殊的需求,比如只在一小块区域显示新控制器的内容。当然你也可以通过一些复杂的方式在原本的控制器上自定义一个小View来实现,但那样会增加原控制器的业务负担。实际上,我们可以通过自定义UIPresentationController来控制新controller的展示形式,这只需要在转场相关的代码部分设置一下代理,原控制器再遵守以下该转场控制器的协议就可以了。具体
2022-05-24 14:38:34
545
原创 iOS基础 Storyboard Reference
然后就会在目录结构中看见刚的两个控制器一起并入到新的Storyboard中了我们回到MainStoryboard。在MainStoryboard中就被映射成功了。
2022-05-21 17:25:30
149
原创 iOS基础 根据类名字符串创建类
命名空间Swift中是有命名空间概念的,我们在通过字符串创建对应的类的时候:NSClassFromString("HomeController")发现并不能按照想象中的那样创建得出来。这时是因为Swift中有命名空间的概念,be like:NSClassFromString("IDB.HomeController")通过命名空间获取的类之后,怎么使用NSClassFromString(<ClassName: String>)->AnyClass?获得得的是一个AnyC
2022-05-21 13:12:32
686
原创 iOS基础 UITabBarController
使用创建子控制器继承自UITabBarController,在viewDidLoad阶段,把各个分页上的控制器给创建好,用UITabBarController的方法addChildControoler相关的方法就可以完成子控制器的添加。be like: private func creatChildController(vc:UIViewController,title:String,image:String,selected:String?){ vc.title = title
2022-05-21 12:35:38
565
原创 iOS基础 Swift纯代码初始化项目(入口引导)
纯代码初始化项目首先在配置也做以下修改:删除Main Interface中的内容,则程序运行时会先去AppDelegate中执行相关的代码。然后在Appdelegate.swift中添加如下代码:class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWit
2022-05-21 10:11:14
746
原创 Gitee基础 远程项目部署
Github国外的服务器,国内访问速度慢免费账户需要公开项目,而私人项目需要收费Gitee原 git.oschina.net国内服务器,访问速度快免费,且能创建私人项目使用Gitee新建仓库就…直接在网页创建就好将新项目同步到本地首先在本地创建好固定项目文件路径。在终端中打开进入到本地该路径:回到Gitee自己的项目中,以下功能处复制仓库位置。如果是私有仓库的话,则会要求输入Gitee账户的用户名及密码,如果是公开仓库的话,则直接完成克隆。由于swift.gitigno
2022-05-20 14:20:27
869
原创 项目初面对
新项目开发公司会提供完整的产品原型图,或者功能设计文档通过这些文档,能够梳理出目标项目的整体框架,从而协助项目框架的搭建。旧项目维护由于很多老项目是缺乏文档的,所以接管旧项目有必要为旧项目梳理一份文档,想要快速上手一个老项目,就需要先梳理一下整个项目的整体框架结构,可以先通过x-mind或者笔记等方式,整理出一套思路。主体框架确认明确好开发目标,能够使项目一直处于推进的状态。明确功能模块,能够使各个模块共同推进,也能较为准确测算工期,方便协同不同的部门参与开会等。在一些项目的重点难点的地方
2022-05-20 12:40:29
114
原创 iOS基础 代码开发中常见助力
注释方法Swift中有两种较为常见的注释方法:用于快捷总览代码功能的注释://MARK:- 用于方法管理用的注释//TODO:- 用于暂缓编写,留作备忘的代码注释用于方法功能说明的注释,对于编程中调用代码显示代码功能很方便:///方法相关功能、属性、调用时间等的备注说明都可以写。...
2022-05-19 15:33:52
286
原创 iOS基础 UIStackView
UIStackViewUIStackView用于组织、布局显示的视图,可用来平铺一系列的视图组合。UIStackView管理着其成员属性arrangedSubviews下的所有视图,以arrangedSubviews数组顺序排序。axis 用于定义子视图的排列方向:横、纵spacing 用于控制子视图的间距alignment 对齐方式distribution 布局规则let view1 = UIView()view1.backgroundColor = UIColor.redlet vi
2022-05-16 11:34:01
3628
1
原创 iOS基础 关于UIKit框架
UIKit框架Cocoa框架含有Foundation框架和UIKit框架。Foundation框架和界面无关,主要包含大量常用的API,如:集合、文件系统、URL、进程通信、通知、归档和序列化、表达式、条件判断等。UIkit框架则是基础的UI类库。...
2022-05-16 11:33:19
955
原创 iOS基础 CALayer
CALayerCALayer = Core Animation Layer ,UIView真正绘图的部分是由CALayer管理的。边框 通过设置CALayer的borderWidth和borderColor可以给视图添加边框效果,值得注意的是,这里设置的Color参数是QuartzCore框架下的CGColorRef类型的,而不是UIKit框架下的UIColor。但我们可以便捷地从UIColor对象获取CGColor属性转换后的CGColorRef值。投影 通过设置CALayer的shadowCol
2022-05-16 11:31:47
354
原创 iOS基础 UIView
UIVIewUIView之所以能显示是因为其内部的CALayer对象,实际上执行绘图的是CALayer对象,UIView其实更像是CALayer对象的管理控制器。UIView的继承关系NSObject > UIResponder > UIViewUIView常用的成员属性backgroundColor背景色alpha 透明度hidden 隐藏clipsToBounds 切边UIView的几何属性Frame:描述UIView的大小以及在父控件上的位置。Bounds:描
2022-05-16 11:30:43
644
原创 Swift基础 throws do-catch 错误的捕获和处理
错误的捕获和处理throws关键字用于抛出错误。do-catch用户捕获代码中可能出现的一场并妥善处理异常。//定义一个错误枚举,遵循Error协议enum PersonError:String,Error{ case PersonErrorDoNotEatBreakfast = "不吃早餐" case PersonErrorDoNotTakeExercise = "不锻炼"}class Person{ var age:Int var name:String
2022-05-16 11:27:13
715
原创 Swift基础 guard
guardguard与if语句功能非常相似,设计出它的目的,其实是为了提高程序的可读性(重点)。guard语句必须在函数中使用,并且必须带有else语句。当条件表达式为真的时候,则跳过else语句。当条件表达式为假的时候,则执行else语句。而且else语句内必须带有return、break、continue、throw语句。let age = 17func allowToMakeCola(){ guard age < 18 else { print("可以瑟瑟
2022-05-16 11:26:17
1150
原创 Swift基础 多态
多态多态指的是,同一个方法在不同的实例中,会有不同的执行效果。swift中有两种引用变量类型,一种是编译时,另一种是运行时。class Person{ var name : String init(personName: String) { name = personName } func eat() -> () { print("\(name)吃饭") } func getup() ->
2022-05-15 18:07:49
385
原创 Swift基础 闭包
闭包闭包是用大括号括起来的,可以没有名字的函数类型的实例。闭包有三种形式:全局函数:具名函数,但不捕获任何值嵌套函数:在函数内部嵌套定义具名函数,可捕获包含函数中的值。闭包表达式:匿名函数类型的实例,不具名代码块,可捕获上下文中的值。闭包是引用类型,闭包变量的拷贝具有引用语义。闭包和函数实例具有同样的内存模型。表达式:{(参数列表1,参数列表2,...)->(返回值) in 函数体执行的内容}示例:var closure = {(number1:Int,number2
2022-05-15 18:07:07
293
原创 Swift基础 函数作为参数类型
函数类型函数类型是一种引用类型,类似于函数指针,可以将函数类型应用在参数、变量、返回值等地方。函数类型的定义:(参数列表1,参数列表2,...)->返回值类型示例代码:class Person{ var name : String init(personName: String) { name = personName }}class Student: Person { var classmate : Student? var
2022-05-15 18:05:00
582
原创 iOS基础 在控制器中添加控件
在控制器中添加控件(以UITableView为例)一般代码添加控件的形式:声明设置frame或者添加布局约束设置数据源 or 代理 and so on添加到view在开发的过程中,苹果官方文档里面的精神是让我们尽量把一些控件留到需要时才加载进内存的,所以我们尽可能合理利用Lazy延迟加载关键字。然后我们在控制器中进行一些控件的声明的时候,如果对于需要初始化控件进行比较多的设置的时候,我们可以直接使用闭包的形式进行初始化,这样就能把相关的代码都存放到一起,便于管理。class ViewCo
2022-05-15 18:03:37
292
原创 Swift基础 循环引用导致内存泄漏
实例对象之间循环强引用ARC并不是绝对安全的,当两个实例对象间相互强引用,就会造成引用循环,导致所占用的内存无法释放。class Person{ var name : String init(personName: String) { name = personName }}class Student: Person { var classmate : Student? override init(personName: String) {
2022-05-15 18:02:52
524
原创 Swift基础 重写父类已有的方法
重写重写方法重写父类已有的方法,需要在方法名前加 override 的关键字。class Person{ var age:Int var name:String init(name:String,age:Int){ self.name = name self.age = age }}class Student:Person{ var classScore:Dictionary<String,Int> =
2022-05-15 18:01:48
982
原创 Swift基础 类型检查、强转、对象的释放
类型检查类型检查通过is与as两个操作符来实现。is 操作符可以判断两个实例是否是同一个类。as 操作符可以将元素转化为想转化的类。Any与AnyObjectswift中针对不确定类型的对象有两种特殊的别名,Any和AnyObject。Any表示任意的类型,包括类、结构体、基本数据类型等等。AnyObject只能表示任意的类的实例对象,结构体对象不能用这个表示。实例对象的销毁析构是实例对象释放前所做的动作,需要释放它所占有的内存资源。析构器 deinitializer 不需要任何参数。
2022-05-15 17:59:50
988
原创 Swift基础 类的属性与特殊方法(监听、延迟加载)
类的willSet()和didSet()通过给类的属性添加willSet()和didSet()方法,可以给类的属性增加观察者。其被设置的新的属性值,如果不进行重命名的话,就是默认名newValue。 static var locationMSVersion : NSNumber = 0 { didSet{ if onlineMSVersion != 0 { compareMSVersion() }
2022-05-15 17:57:52
494
原创 Swift基础 类的初始化方法-构造函数
类的初始化类的初始化是调用init()方法进行的,在 Objective-C 中,init()方法是不安全的,因为init()方法可能被调用不止一次,也不能保证初始化后所有的成员属性都不为空、都有值。对于不需要立刻初始化的属性,需要在声明类型后增加 ? 符号Designated(指定的、标记的)所以 Swift 有了超级严格的初始化方法。一方面,Swift 强化了 designated 初始化方法的地位。Swift 中不加修饰的 init 方法都需要在方法中保证所有非 Optional 的实例变
2022-05-15 17:56:00
431
原创 Swift基础 关于类与类的继承
类类与结构体的区别:类可以有继承关系,子类可以使用父类的特性和方法,而结构体没有。类型转换可以在运行时检查和解释为另一个类的实例。deinit反初始化可以做到释放所占用的内存资源。类的引用计数可以做到不止一个对另一实例的引用。格式:class 类名 : 父类名 { 数据成员(变量)定义 函数成员(方法)定义和实现}案例:class Person { var name : NSString var height : CGFloat var se
2022-05-15 17:54:33
322
原创 Swift基础 map
map用法:let numbers = [1,2,3,4]let result = numbers.map { $0 + 1 }print(result) // [2,3,4,5]map 方法接受一个闭包作为参数, 然后它会遍历整个数组,并对数组中每一个元素执行闭包中定义的操作。
2022-05-08 15:26:55
554
原创 Swift基础 for循环
循环语句下的forloopforloop是标签语句,一般用于结束循环(主要是外循环) var i,j:Int var s:Int forloop:for i in 1...10 { for j in 1...10 { s = i*j print("i*j=\(s)") if (s>50) { print("i*j>50,退出外循环");
2022-05-08 15:26:15
2712
原创 Swift基础 泛型
泛型在程序设计中,要实现任意数据类型执行统一的一段操作,可以运用模版,对于整型、字符型、浮点型或者其他类型,均可以实现,这就叫泛型,可以重复利用。编写泛型函数的步骤是:将涉及不同代码的部分用T表示。 struct Student { var name = "name" var height = 160.00 } override func viewDidLoad() { super.viewDidLoad()
2022-05-08 15:25:47
174
原创 Swift基础 some关键字不透明结果类型
some关键字 不透明结果类型在某一些情况下,我们需要返回接受一个遵守了某协议的对象,该对象可以是任何类,但需要遵守某个协议即可,并不限定类的类型。这个时候就会有以下问题:协议:protocol ProtocaltTalk{ associatedtype words func say(words:words)}该协议定义了说话,遵守该协议的可以是人类,可以是动物,可以是机器人。遵守ProtocaltTalk协议的两个类型(简单举例):class Person:Protocal
2022-05-08 15:25:19
641
原创 Swift基础 协议
协议协议的关键字是protocal。协议只需定义,没有实现的部分。协议也分两种,属性协议和方法协议。属性协议属性协议的声明用var声明,在声明后,要设置get方法或者set方法、get方法一起设置。//协议class Person{ var age:Int var name:String init(name:String,age:Int){ self.name = name self.age = age }}prot
2022-05-08 15:24:56
281
原创 Swift基础 扩展
扩展关键字extension,扩展的目的就是衍生原来没有的功能,可以扩展属性、方法、索引。并且可以在没有获得原始代码的情况下扩展。在oc中是以runtime来实现动态调用和添加功能的。现有的类、结构体、枚举可以在扩展的方式下添加方法,但重写的方法不能使用扩展。属性扩展extension Double{ var q:Double{return self/1000} var w:Double{return self/10000}}override func viewDidLoad(
2022-05-08 13:05:15
231
原创 Swift基础 函数
函数函数的声明方式: func 函数名(参数列表) -> 返回值 { 参数列表里的数据表示方式: 参数名:参数类型 函数体 }案例: struct Student { var name = "name" var index = 202100 var height = 160.00 var profession = "profession" var sex = "男"
2022-05-08 13:05:02
381
原创 Swift基础 结构体
结构体声明结构体的关键字是struct,使用起来和类相似,但类的成员是引用类型,而结构体的成员是值类型。值类型在传递和赋值的时候,是进行复制的,那也就是说在修改一处复制体的时候,原来被复制的对象是不受影响的。引用类型在传递和赋值的时候,是传递引用对象的一个“指向”,所以当对该引用进行修改的时候,是直接直接修改到最原始的对象,即,一旦修改值,则对该原始对象的所有引用都会被同步修改。在内存中,引用类型的变量是在堆上存储和操作的。值类型的变量是在栈上存储和操作的。两者相比起来,在堆上的变量操作会比较复杂和
2022-05-08 13:04:26
511
原创 Swift基础 枚举
枚举使用枚举会使得编程的过程更加安全,因为一旦使用了不是枚举的值,系统就会立刻给出反馈。 enum Direction{ case North case South case East case West } let directuin = Direction.South switch directuin { case .North: print("North") case .South:
2022-05-08 13:03:54
181
原创 Swift基础 Switch分支语句
Switch分支语句在swift中的Switch语句是没有穿透效果的,也就是匹配到对应的值之后,运行完代码所属的代码块就结束了。相较于传统的不同,传统的匹配完之后,还会一一往下再与每个case比较。switch还可以匹配多个值: let index = "A" switch index { case "A","B","C": print("通过,及格") case "D","E": print("不通过,不及格") default
2022-05-08 13:03:18
686
原创 Swift基础 Dictionary字典
字典字典和数组都是集合类型,字典元素可以是值类型也可以是引用类型。键名不允许重复。字典的声明方式(三种)显式: var studentList : Dictionary<String,Float> = ["xiaoMing":172.5,"xiaoHong":168.5] for (name,height) in studentList { print("\(name):\(height)"); }运行结果:xiaoMing:172.5xi
2022-05-06 11:45:27
668
XGColletcionView
2015-09-13
libqrencode
2015-05-25
framework-RegexKitLite
2015-03-01
RegularExpression04
2015-03-01
RegularExpression03
2015-03-01
RegularExpression02
2015-03-01
RegularExpressionCode01
2015-03-01
getScreenViewCode
2015-02-25
Quartz2D-根据路径绘制
2015-02-25
cutPictureCode
2015-02-25
WaterMakeImageCode
2015-02-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人