iOS
文章平均质量分 62
基于UiKit
kicinio
这个作者很懒,什么都没留下…
展开
-
SPM(Swift Package Manager)开发及常见事项
spm还可引入oc / c / c++,至于二进制化或者静态库大家可以共同探讨,这方面的网上资料较少。原创 2023-08-06 22:02:28 · 4406 阅读 · 0 评论 -
iOS性能优化-异步绘制与异步底层View处理
基于UIKit的性能优化似乎已经到了瓶颈,无论是使用frame代理snpakit,缓存高度,减少布局层次,diff刷新,压缩图片,选择合适队列,选择高性能锁,也不能满足当前庞大而又复杂的项目优化。每次加载刷新的时候过长时间的VC加载,或者collectionView刷新的时候卡顿,真是有点不知所措。那么,有没有比上述内容更高级的优化方法呢?答案是有的,那就是异步绘制。(有关异步绘制内容,更好的处理是选择YYText或者AsyncKit这些成熟的作品,本文仅限于介绍入门,请不要将示例直接用于生产环境!原创 2023-06-04 21:55:36 · 4231 阅读 · 0 评论 -
LRU在UIImageView的extension中简单应用
方法时候根据url作为key先判断缓存里面是否存在image对象,如果有,直接显示即可,而没有的话,先走placeholder的路径,然后异步执行Session的任务,下载完后将image对象放入缓存里面,再设置image即可。,叫做“最近最久使用”。这是不可接受的,因此,自然而言地想到了使用hash字典来充当缓存。有了LRU的实现,就可以把普通的hash字典换成LRU缓存了,在设置完指定最大容量后,新的url请求过来就会把最久远未使用的image对象移除缓存,达到了动态使用、动态平衡的结果。原创 2023-03-04 15:12:23 · 548 阅读 · 0 评论 -
UITableView内输入框(UITextView)换行
因为如果在Cell的init方法里面设置UITextView的contentOffset,是只对那一时刻的UITextView生效,一旦有文字内容变换,其contentOffset又会重新计算,导致前面失效。当然,不是所有的人的业务都是相同的,设置完成后可能发现并不符合自己的业务需求,发现文字不是竖直方向的居中。UITableView内存在一个Cell,该Cell内有一输入框可以输入文字,超出输入框宽度则换行展示,即该Cell高度要增加。3:判断是否换行后更新UITableView即可。原创 2023-01-16 17:09:43 · 1844 阅读 · 0 评论 -
iOS: 禁用屏幕旋转功能后获取屏幕方向
项目本身支持横竖屏,但是要在特定ViewController下禁用该VC的方向,即对屏幕旋转不敏感;但又要满足能获取到当前屏幕的方向原创 2023-01-08 22:51:48 · 1019 阅读 · 0 评论 -
一种子模块化的基于Hash刷新机制的iOS端数据驱动的MVVM架构思考
iOS端的架构基准无非就是苹果推荐的MVC,经典MVVM,解耦性极好的MVP,新生代的VIPER及Uber推出的Ribs,当然还有臭名昭著的CCC(所有代码都放在ViewController里面)。架构的实施标准无非就是解决软件工程中两个重要问题:如何加快软件开发速度;如何解决软件工程后期维护问题。原创 2022-09-04 15:50:16 · 1465 阅读 · 0 评论 -
GCD简单了解
一:基础名称GCD的创建依赖于任务与队列这两个概念。任务就是block内执行的操作,block内调用的某个方法。任务有两种方式,一为同步执行,二为异步执行。二者的区别在于是否具备开启子线程的能力,执行的任务在队列中执行的方式(顺序)。同步执行的特点同步添加任务到指定的队列中,在添加的任务执行结束之前,会一直等待,直到队列里面的任务完成之后再继续执行。只能在当前线程中执行任务,不具备开启新线程的能力。异步执行的特点:异步添加任务到指定的队列中,它不会做任何等待,可以继续执行任务。原创 2022-07-23 16:55:44 · 1103 阅读 · 0 评论 -
Swift 自定义日志类 Log
前言:iOS并没有像Android那样提供Log类进行日子管理,自带的print与NSLog也显得很朴素。第三方框架想XG等也很优秀,但是也需要添加依赖和学习成本。这里我们利用Swift的关键字保留(类似于c语言的预编译命令),可以很简单实现超轻量但却功能强大的日志管理工具,考虑到大多数项目不像服务端进行持久化管理,这里仅输出控制台即可。这里我们提供五个级别,即琐碎(Verbose)、调试(Debug)、信息(Info)、警告(Warning)、错误(Error),再辅以时间、文件名、行数、方法名及颜色原创 2021-11-25 20:47:47 · 2581 阅读 · 0 评论 -
Swift 简易封装URLSession
协议:import Foundationprotocol NetworkProtocol { static func postRequest(URLString: String, parameters : [String : Any]?, callback: @escaping (_ result: Any) -> ()) static func getRequest(URLString: String, parameters : [String : Any]?,callback原创 2021-09-27 22:40:46 · 1384 阅读 · 0 评论 -
简单封装Alamofire
前言:第三方库提供的API有时候并不能直接提供在项目里面直接调用,为了避免第三方库的不稳定性带来的影响,将其封装使用是个很好的做法。类似于JPA或MyBatis这样的“三层架构”实际上可以变换思路改成封装第三方库的做法,下面是一个利用协议和闭包简易封装的Alamofire做法,过程非常简单。协议层:协议层定义两个待实现的方法,一个为get请求,一个为post请求。当然,必要的数参数和闭包(数据请求完后将其回调出)也是具备的。内容如下:import Foundationimport SwiftyJS原创 2021-09-12 16:00:41 · 1110 阅读 · 0 评论 -
UIView动画 Swift操作
前言:iOS里使用闭包对UIView对象可进行简洁而又强大的动画效果设置。与Android不同的是,后者需要设置xml及动画类才能完成复杂的动画效果,而iOS仅使用animate与transition属性闭包便可完成。在iOS里动画可简单分为属性过渡动画与转场动画,而属性过渡动画可分为单层闭包动画、双层闭包动画与多参数闭包动画,下面是其具体介绍。属性过度动画:属性过渡是指某UIView (注意所有控件为其派生类)某些属性改变时,将改变过程以渐变效果进行动画展示。单层闭包动画:所谓单层闭包动画即为原创 2021-09-03 21:13:35 · 1173 阅读 · 0 评论 -
浅析iOS中的贝塞尔(Bézier curve)曲线
一:贝塞尔曲线简介二:常见贝塞尔曲线分类三:贝塞尔曲线的绘制过程四:三阶贝塞尔曲线推导五:UIBezierPath类讲解六:延申拓展(n阶贝塞尔, de Casteljau算法)原创 2021-09-02 12:29:30 · 1715 阅读 · 0 评论 -
UIBezierPath类绘制几何图型 直线 折线 曲线 矩形 圆 弧 阴影等 Swift
前言:iOS里进行几何图形绘制大体可分为三类,如下:自定义UIView类,重写draw() 方法并调用UIBezierPath类相关方法UIBezierPath类与CAShaperLayer类搭配自定义UIView类,重写draw() 方法并调用UIGraphicsGetCurrentContext类相关方法以上三种方法几乎可以看作独立的UIView类与Context结合的变体。UIBezierPath类实际上是对Context类的变体。如果不独立View,则须CAShaperLayer类结合原创 2021-08-29 22:08:22 · 1320 阅读 · 0 评论 -
Swift 创建自定义键盘 (金融、聊天等领域)
前言:某些业务领域要求使用自定义键盘而非系统内置的键盘,这时候可选择基于View类来完成一个键盘的开发。这里模拟一个简单的数字键盘,来演示一个自定义键盘的完成。业务模拟:某ViewController内存在一个这样的UITextField,该UITextField点击后可弹出我们自定义的键盘(称之为MyKeyBoard),而系统内置的键盘则不会被弹出。另外,MyKeyBoard内存在0~9内这10个数值,以及一个DEL键(删除键)。每个按键的作用与常见的按键功能相同,不再赘述。当用户输入完后一个特定的原创 2021-08-25 21:25:49 · 1408 阅读 · 0 评论 -
下拉图片放大效果 模仿Apple Music艺人详情页 Swift版
效果预览:思路:一个简单的VC,里面底层是UIScrollView,其上放置一个UIImageView,紧挨着放置UITableView。UIScrollView下滑时在代理方法里面根据offset.y对UIImageView的width与height设置更改。上滑时UIImageView的约束为默认即可。View层:import UIKitimport SnapKitclass SlideView: UIView { public var CELL_ID = "SL原创 2021-08-10 18:19:04 · 229 阅读 · 0 评论 -
iOS PopupWindow与PopoverPresentationController使用
前言:Android里有个控件叫做PopupWindow,在需要弹出视图的场景下特别方便,无论是布局还是事件响应都很简单。但iOS里面一开始并没有提供原生的类似控件。iPad里可以使用PopoverPresentationController来弹出一个小窗口,之后iOS9以后iPhone也支持该控件。实际上也可以通过使用单独的UIView来完成类似的效果,本文将浅析这些内容。PopupWindow原理:代码:效果:PopoverPresentationController代码:效果:参考链原创 2021-07-16 19:41:17 · 940 阅读 · 1 评论 -
本地通知 UserNotification
本例仅涉及本地通知,远程推送(APNs)鉴于证书的获得性这里不做介绍,网上有很多可供参考。使用:在待使用的类前先import。import UserNotifications首先先在AppDelegate里面申请权限。import UIKitimport UserNotifications@mainclass AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func原创 2021-06-28 22:10:00 · 189 阅读 · 2 评论 -
KVO与KVC使用
KVC:全称Key-Value Code,是一种间接访问对象的方式。类似于Java中的反射。使用KVC需要该类继承与NSObject。获取被访问对象值的方法是:value(forKey:) , 设置被访问对象的方法是:setValue(, forKey: )。其中value(forKey:)这个方法或得到的是任意值,需要我们手动转型。class Person: NSObject { var name: String = "" var age: Int = 0}import UIK原创 2021-06-27 15:44:33 · 240 阅读 · 0 评论 -
Swift使用UIImagePickerController 从相册选择图片、从相机选择图片
配置:如果是相机使用,需要在info.plist文件增加使用前应用程序说明;相机使用也是如此。(第二个是CALENDARS权限,打错了;图片是Photo Library Usage Description)从相册选择图片:使用UIImagePickerController进行图片选择需要实现UIImagePickerControllerDelegate, UINavigationControllerDelegate这两个代理。因为图片选择视图控制器属于系统内定义的NavigationControll原创 2021-06-26 12:59:56 · 3467 阅读 · 0 评论 -
浅析iOS沙盒(SandBox)及常见操作(目录读取、文件读写、文件夹操作等)
沙盒概念:iOS 中的沙盒是一个较为独立和封闭的安全体系。每个应用程序在安装时会生成唯一一个文件夹。在该文件下存在着一个常见的媒体资源、代码、配置文件等。每个应用程序都只能被允许访问自己的沙盒,不能访问其它沙盒。下面是其主要沙盒存在的目录。1、Documents 目录:应用程序主要和必备的数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。用户自己保存的文件在documents文件里2、AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用原创 2021-06-24 22:21:27 · 3638 阅读 · 1 评论 -
Swift 调用微信分享
配置:1:先下载微信分享的SDK。再复制到项目里。如图:2: 创建桥接文件。名为bridge.h,内容如下:#ifndef bridge_h#define bridge_h#import "WechatAuthSDK.h"#import "WXApi.h"#import "WXApiObject.h"#endif /* bridge_h */3:引用桥接文件,先点击1,出来一个白框子然后拖动1到白框子里面。4:倒入有关类库。待导入内容如下:CoreTelephony.fram原创 2021-06-23 21:07:58 · 1733 阅读 · 1 评论 -
CryptSwift库之常见加密算法 SHA MD5 AES CRC POLY1305
CryptSwift SPM地址:https://github.com/krzyzanowskim/CryptoSwift使用前先import CryptSwiftMD5:常被用作文件有效性的验证。MD5本不是加密算法,而是信息摘要算法。其最大的特点是原文本无论长度为多少,最后都会生成一个128位的散裂值。即使两个很相似的文本经过MD5操作后其结果可能发生翻天覆地的变化。算法描述:MD5码以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四原创 2021-06-21 23:48:26 · 831 阅读 · 0 评论 -
基于SpringBoot与iOS(Swift)的电商平台设计
技术栈:Server:SpringBootSpring Data JPARedis简易分词Client:MVC架构SnpakitAlamofireSwiftyJSONkingfser(过小的第三方库不阐述)系统亮点:二进制数据采用CDN方式分发Redis非关系式数据库减少MySQL的I/O视频带货分词搜索待改进:服务端设计从工程性而言较为合理,经分析验证,可拆分为微服务架构以进一步提高TPS数据管理无B端,管理较为麻烦可增添在线聊天功能(功能较为复杂)原创 2021-06-19 22:52:38 · 3130 阅读 · 6 评论 -
基于iOS与SpringBoot的“E-金融“小额借贷平台开发
前言:本系统基于基于iOS与SpringBoot,使用技术栈如下:iOS端:MVC架构MVVM架构Swift & Objective-C大量开源库的运用后端:S原创 2021-05-31 21:26:30 · 3648 阅读 · 11 评论 -
FMDB Swift版使用
FMDB是使用C语言对原生的SQLite的包装库,可使用原生SQLite语句对其进行操作,且支持多线程从而保证线程安全性。一:安装使用步骤SPM: https://github.com/ccgus/fmdb使用时导入包即可。例如 import FMDB二:创建DBHelper类创建单例工具类供访问。import Foundationimport FMDB class SQLiteManager: NSObject { // Create Single instance原创 2021-04-26 23:08:18 · 1870 阅读 · 1 评论 -
直接使用SQL语句--SQLiteDB与Swift使用
前言:在iOS开发里面有关数据库的第三方库以ORM居多,直接使用SQL且配置简单的第三方库少知甚少。SQLiteDB便可较为轻易地配置且可直接使用SQL语句。由于其语法和使用流程与JDBC较为接近,熟悉JDBC的读者甚至可略读一番便可直接上手。一:导入步骤很可惜SQLiteDB没有提供SPM版本,否则一个URL便可直接导入完成。SQLiteDB官网:https://github.com/fahimf/sqlitedb1:下载工程文件如图所示,选择Download ZIP。2:创建db文件没原创 2021-03-22 16:12:31 · 1076 阅读 · 0 评论 -
UIGesture子类的Swift应用
滑动:UISwipeGestureRecognizerdirection属性为滑动的方向,可选值有上下左右 func addGestureSwipe(){ let swipe = UISwipeGestureRecognizer(target: self, action: #selector(swipeListener)) swipe.direction = .left self.view.addGestureRecognizer(swipe)原创 2021-03-11 15:54:21 · 149 阅读 · 0 评论 -
iOS14 修改启动视图为全屏模式
iOS14里面启动一个视图其会默认以非全屏模式打开,有些时候需要全屏展示,该如何修改?修改示例:let secondVC = SecondViewController()secondVC.modalPresentationStyle = .fullScreenself.present(secondVC, animated: true, completion: nil)modalPresentationStyle可选值如下:.fullScreen 全屏.pageSheet 类似sheet的效原创 2021-03-01 20:39:25 · 994 阅读 · 0 评论 -
Swift 闪光灯的使用
在iOS里面闪光灯的使用依赖于AVFoundation,创建具体媒体对象,然后加锁设备、调用、解锁即可。正文:import UIKitimport SnapKitimport AVFoundationclass SecondViewController: UIViewController { // 创建Device实例对象 let device = AVCaptureDevice.default(for: AVMediaType.video) let butt原创 2021-02-28 17:01:12 · 1070 阅读 · 0 评论 -
Swift定时器的实现
Swift的定时器实现是基于Timer类(以前被称作NSTimer),其scheduledTimer方法的三个参数分别为启动时间间隔,执行者(self),执行方法,userInfo,是否重复。@objc func testListener(){ print("REPEAT TASK.")}var myTimer = Timer.scheduledTimer(timeInterval: 0.3, target:self,selector:Selector("testLis原创 2021-02-28 16:51:21 · 2806 阅读 · 0 评论 -
在UITabBarController内调用init()方法进行初始化
引言:UIViewController类及其子类的初始化方法调用不同于普通的swift类,不是简单的init()即可,下面来看其初始化的调用写法。代码:class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from原创 2021-02-13 21:48:38 · 396 阅读 · 1 评论 -
Swift注释写法
相对比Java而言,Swift也提供了类似于Javadoc的内容。使用规定的注释语法来完成文档的撰写。但有点需要提及的是, Swift中的注释写法虽然能生成文档效果,但与Java的注解还是有区别的。MARK:该语法常用于文件结构。首字母要大写。// MARK: - FUNC_ONEprivate func displayContentOne(){ }效果:可以看到右侧预览区高亮FUNC_ONE。TODO:该语法常用于未完成功能的方法或类中。// TODO: - Need to原创 2021-01-23 22:12:00 · 544 阅读 · 0 评论 -
浅析在iOS中有关视图传值、启动/返回、监听的几种方法
前言:与Android相比较而言,iOS的视图传值、启动/返回、监听的方式显得似乎有些繁多。在此略微总结提及下,仅供参考。视图传值:有以下几种方式:正向:直接访问被访问视图的属性反向:使用闭包或协议这里暂不提及KVO方式。正向传值示例:设现存一名为ViewController.swift的启动视图,内有一Button,单击该Button后将“test”传值到另一个名为SecondViewController.swift的视图内的一个Label。ViewController.swift:原创 2021-01-17 20:41:02 · 532 阅读 · 0 评论 -
Swift Alamofire简单使用
一:SPM导入依赖https://github.com/Alamofire/Alamofire二:GET请求func getRequest(){ let url = "http://www.baidu.com" Alamofire.AF.request(url).responseJSON { (response) in switch response.result { case .success(let json): print原创 2020-12-30 21:12:35 · 2445 阅读 · 0 评论 -
Swift 使用SwiftyJSON解析JSON数据
前言:在iOS里面解析json数据某种程度上并没有Android上面使用JOSN方便。但第三方开源框架诸如SwiftyJSON的到来,尤其是配合Swift5等以上版本,对应用程序而言数据安全性方面有很大的提升。SPM导入依赖:https://github.com/SwiftyJSON/SwiftyJSON使用步骤:首先先模拟一下JSON数据的获取,这里直接定义。然后把json数据转换成Data。接着就使用SwiftyJSON直接把数据解析。需要说明的是,如果没有把解析放在if里面那么解析的数原创 2020-12-28 19:48:24 · 2522 阅读 · 0 评论 -
Failed to start remote service “com.apple.debugserver“ on device.
今天用真机调试时报出“Failed to start remote service “com.apple.debugserver” on device.”百思不得解。遂关机重启,果然运行成功。猜测可能是真机长时间没关机,一些服务被关闭了。原创 2020-12-21 17:08:10 · 6975 阅读 · 0 评论 -
Swift 如何使用AVAudioPlayer播放音频
前言:iOS里面导入AVFoundation包进行音频使用管理,调用AVAudioPlayer对象进行音频操作。这里有个小方法,直接粘贴即可使用。调用方法:private func playAudio(forResource: String, ofType: String){ if let bundlePath = Bundle.main.path(forResource: forResource, ofType: ofType) { let url = URL.ini原创 2020-12-21 15:48:37 · 4795 阅读 · 0 评论 -
iOS GCD常见名词及解释
qos:quality of service,队列优先级Serial:串行,让任务一个接一个地执行Concurrent:并行,多个任务同时执行(异步下才有效)Synchronous:同步,在当前线程执行任务,不具备开启新线程的能力Asynchronous:异步,在新的线程执行任务,具备开启新线程的能力label:队列的标签名称,方便调试...原创 2020-11-21 14:22:42 · 187 阅读 · 0 评论 -
iOS GCD简单使用
一:从异步线程切换主线程//Async to append block.DispatchQueue.global(qos: .default).async { // Deal with time-consuming tasks here. var para_3: Int = 0; para_3 = para_3 + 1; NSLog("Executed OK. And Parametermn is :\(para_3)"); // Whe原创 2020-11-21 14:10:07 · 187 阅读 · 0 评论 -
Swift 视图控制器之间的反向传值
ViewController.swiftimport UIKitclass ViewController: UIViewController{ // Create a class variable for designation method to visit its attributes. let labelOne = UILabel(); // Create a class variable for clourse to visit. var m原创 2020-11-20 22:08:48 · 349 阅读 · 0 评论