换肤 与 静态库

article/2025/6/11 11:53:20

一 换肤

  • 基本的换肤功能实现
  • 选中皮肤保存至系统偏好
  // 记录用户选中的皮肤[[NSUserDefaults standardUserDefaults] setObject:skinColor forKey:@"skinColor"];[[NSUserDefaults standardUserDefaults] synchronize];
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3
  • 抽取SkinTools单例,简化视图控制器的皮肤管理工作 
    • 多控制器换肤
 + (UIImage *)skinToolWithImageName:(NSString *)imageName{NSString *imageNamePath = [NSString stringWithFormat:@"skin/%@/%@", _skinColor, imageName];return [UIImage imageNamed:imageNamePath];}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
 + (void)setSkinColor:(NSString *)skinColor{_skinColor = skinColor;// 记录用户选中的皮肤[[NSUserDefaults standardUserDefaults] setObject:skinColor forKey:@"skinColor"];[[NSUserDefaults standardUserDefaults] synchronize];}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 添加TabBar演练皮肤切换
+ (UIColor *)skinToolWithLabelBgColor
{// 1.找到对应背景的plist文件NSString *bgColorFileName = [NSString stringWithFormat:@"skin/%@/BgColor.plist", _skinColor];NSString *bgColorFilePath = [[NSBundle mainBundle] pathForResource:bgColorFileName ofType:nil];// 2.加载背景颜色// 2.1.加载背景字典NSDictionary *bgColorDict = [NSDictionary dictionaryWithContentsOfFile:bgColorFilePath];// 2.2.取出背景颜色的字符串NSString *bgColorString = bgColorDict[@"LabelBgColor"];// 2.3.取出背景颜色的数组(0,255,0)NSArray *bgColorArray = [bgColorString componentsSeparatedByString:@","];// 2.4.取出对应的RGB值NSInteger red = [bgColorArray[0] integerValue];NSInteger green = [bgColorArray[1] integerValue];NSInteger blue = [bgColorArray[2] integerValue];return [UIColor colorWithRed:red / 255.0 green:green / 255.0 blue:blue / 255.0 alpha:1.0];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
/***  当类第一次使用的时候会调用该方法,该方法只会调用一次*/+ (void)initialize{// 1.先从偏好设置中取出用户之前选中的皮肤_skinColor = [[NSUserDefaults standardUserDefaults] objectForKey:@"skinColor"];// 2.判断skinColor是否为空,如果为空,表示用户之前没有选中皮肤,那么显示蓝色皮肤if (_skinColor == nil) {_skinColor = @"blue";}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

二 静态库

1.介绍静态库

  • 什么是库? 
    • 库是程序代码的集合,是共享程序代码的一种方式
  • 根据源代码的公开情况,库可以分为2种类型

    • 开源库
    • 闭源库 
      • 静态库
      • 动态库
  • 静态库和动态库的存在形式:

    • 静态库:.a 和 .framework
    • 动态库:.dylib 和 .framework
  • 静态库和动态库在使用上的区别 
    • 静态库:链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝
    • 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存

需要注意的是:项目中如果使用了自制的动态库,不能被上传到AppStore

2.制作.a的静态库(Framework&Library)

  • 包含头⽂文件(项⺫⽬目—>build Phase—>copy File—>选中头⽂文件) 
    这里写图片描述

  • 创建项⺫⽬目测试静态库

  • 设备CPU架构—>lipo -info lipo -create 静态库12 -output 静态库

每一个手机都有属于自己的CPU,而每一个CPU都有属于自己的CPU架构(指令集) 
每一个静态库都有自己可以支持的架构:

  • 手机和模拟器使用的CPU架构

    • 模拟器CPU架构: 
      • iPhone4s–>iphone5 : i386
      • iphone5s–>iphone6s plus : x86_64
    • 真机CPU架构

      • iPhone3gs–>iphone4s : armv7
      • iphone5–>iphone5c : armv7s(如果一个静态库支持armv7架构,也可以跑在架构是armv7s的设备,没有对代码进行优化)
      • iPhone5s–>iPhone6s plus : arm64
    • 查看静态库支持的架构:lipo -info 静态库名称

    • 合并静态库:lipo -create 静态库1 静态库2 -output 新的静态库
    • 编译静态库支持所有模拟器CPU架构设置 
      这里写图片描述

3.边开发边制作静态库 
- 添加一个静态库的targets—>点击项⺫⽬目—>targets—>+ 
这里写图片描述

  • 测试静态库: 项⺫⽬目—>项⺫⽬目的target—>general—>linked framework—>添加静态库 
    这里写图片描述

  • 打包静态库—>选中项⺫⽬目静态库—>编译(头⽂文件) 
    这里写图片描述

4.使⽤用静态库的注意点: 

  • 静态库有真机和模拟器(测试阶段可以使⽤模拟器,发布阶段使⽤真机)。好处:资源包变⼩
  • 静态库有Debug版和release版本(测试阶段使⽤用Debug,发布阶段使⽤release)。好处:资源包变⼩/运⾏速度变快/代码进⾏优化

    • 调试版本会包含完整的符号信息,以方便调试
    • 调试版本不会对代码进行优化
    • 发布版本不会包含完整的符号信息
    • 发布版本的执行代码是进行过优化的
    • 发布版本的大小会比调试版本的略小
    • 在执行速度方面,发布版本会更快些,但不意味着会有显著的提升 
  • 编译Debug版或release版本静态库设置

    • StaticLib→Edit Scheme→截图 
      这里写图片描述

    5.制作.framework库 

    • 1>动态库(默认) 
      注意:如果项⺫中⽤到了动态库进⾏设置:项⺫—>项⺫的target—> general— >Embedded—>添加动态库 
      这里写图片描述
    • 2>静态库 
      制作静态库的修改配置:项⺫—>静态库的target—>build setting—>搜索mach —>static library 
      这里写图片描述
    • 3>注意点 
      查看一个.framework静态库⽀持哪些架构:lipo -info framework⽂件下⾯的⼆进制 
      合并静态库:合并framework⽂件下⾯的⼆进制

三 支付宝集成

  1. 向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)和私钥(privateKey)
  2. 下载支付宝SDK
  3. 生成订单信息,签名加密
  4. 调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
  5. 支付完毕后,支付宝客户端会自动跳回到原来的应用程序
  6. 在原来的应用程序中显示支付结果给用户看

    • 如果用户没有安装支付宝客户端,直接在应用程序中添加一个WebView,通过网页让用户进行支付
  // 注意:如果是通过网页支付完成,那么会回调该block:callback[[AlipaySDK defaultService] payOrder:orderString fromScheme:@"jingdong" callback:^(NSDictionary *resultDic) {}];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5
  • 通过支付宝
// 当通过别的应用程序,将该应用程序打开时,会调用该方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{// 当用户通过支付宝客户端进行支付时,会回调该block:standbyCallback[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {NSLog(@"result = %@",resultDic);}];  return YES;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 注意报错:找不到路径时添加路径 
    这里写图片描述

四 内存分析

  • 1.静态内存分析 
    • 不运⾏程序,直接对代码进⾏内存分析,查看代码是否有内存泄露 
    • 优点:分析速度快,并且可以对所有的代码进⾏内存 
    • 缺点:分析不一定准确(没有运⾏程序,根据代码的上下文语法结构)
    • 注意:如果有提⽰有内存泄露,⼀定结合代码查看代码是否有问题.
  • 2.动态内存分析(会使⽤Instruments对APP进⾏行内存分析) 

    • 真正运⾏起来程序,对程序进⾏内存分析(查看内存分配情况/内存泄露) 
    • 优点:分析⾮常准确,如果发现有提⽰内存泄露.基本可以断定代码问题 
    • 缺点:分析效率低(真正运⾏了⼀段代码,才能对该代码进⾏内存分析) 
    • 注意:如果发现有内存泄露,基本需要修改代码(基本有内存泄露)

    • 使⽤Instruments:Product→Profile→打开Instruments工具

    • Allocations:内存分配
    • Leaks: 内存泄露
  • 2种加载图片方法对比:

    • imageName: 
      • 1.加载的图片不会随着对象的销毁
      • 2.如果多个UIImage对象需要使用图片对象,图片对象只会存在一份 
    • imageContentOfFile: 
      • 1.加载的图片会随着对象的销毁一起销毁
      • 2.如果多个UIImage对象需要使用图片对象,那么就会存在多个图片对象
文章来源:https://blog.csdn.net/WUWUWEIWEILONGLONG/article/details/74315832
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/JF88VnIg.shtml

相关文章

C++ QT结合FFmpeg实战开发视频播放器-15换肤功能的后台实现

作者&#xff1a;虚幻私塾 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、换肤功能的后台实现 定义changeBackground函数&#xff0c;让qml去调用这个函数来实现换肤功能&#xff0c; 函数的实现调用了set…

Element UI主题换肤功能(基于vue-element-admin框架)

环境信息&#xff1a; 日期&#xff1a;2022-08-05 node版本&#xff1a;v14.15.4 "sass": "1.26.8", "sass-loader": "8.0.2", 本次实现的是基于花裤衩大佬的 vue-element-admin 或者 vue-admin-template 的前端框架实现的主题换肤功…

JavaScript:演示Ajax的get和post请求,练习选顶卡和换肤案例

JavaScript:演示Ajax的get和post请求&#xff0c;练习选顶卡和换肤案例 Ajax 异步请求 特别提示: 异步请求不要使用live server插件,必须创建一个本地服务器环境 同步与异步 以前端请求,后端响应为例 同步: 前端发请求, 必须等到后端响应完成,才允许发送另一个请求异步: 前端…

Android换肤之Android-skin-support

前言 之前做个APP需要用到换肤&#xff0c;在githup上面找了很久&#xff0c;终于找到一款功能强大、基本能够满足产品需求的换肤框架&#xff0c;那就是Android-skin-support&#xff0c;这个框架换肤功能很强大、不管是白天、黑夜还是任意颜色、图片的皮肤包都可以&#xff…

对 Android 应用换肤方案的总结

作者&#xff1a;me 虽然现在已经有很多不错的换肤方案&#xff0c;但是这些方案或多或少都存在自己的问题。在这篇文章中&#xff0c;我将对 Android 现有的一些动态换肤方案进行梳理&#xff0c;对其底层实现原理进行分析&#xff0c;然后对开发一个新的换肤方案的可能性进行…

前端换肤,聊一聊主题切换那些事

一些网站通常会提供白天、夜间模式&#xff0c;以及自定义主题等等&#xff0c;这种主题切换也就是本文说的前端换肤。 这次案例用的是白天和夜间模式的切换&#xff0c;在做换肤之前&#xff0c;得先知道一件事情&#xff1a;css的变量定义&#xff0c;对变量定义不熟悉的同学…

android 皮肤,Android换肤

前言 之前做个APP需要用到换肤&#xff0c;在githup上面找了很久&#xff0c;终于找到一款功能强大、基本能够满足产品需求的换肤框架&#xff0c;那就是Android-skin-support&#xff0c;这个框架换肤功能很强大、不管是白天、黑夜还是任意颜色、图片的皮肤包都可以&#xff0…

Android 应用换肤方案的总结

虽然现在已经有很多不错的换肤方案&#xff0c;但是这些方案或多或少都存在自己的问题。在这篇文章中&#xff0c;我将对 Android 现有的一些动态换肤方案进行梳理&#xff0c;对其底层实现原理进行分析&#xff0c;然后对开发一个新的换肤方案的可能性进行总结。 1、通过自定…

Android 插件化换肤方案

效果 实现流程 实现LayoutInflater.Factory2这个接口&#xff0c;实现onCreateView方法(主要仿照系统原来LayoutInflater.createView()方法的实现)&#xff0c;此处可以拿到页面中所有的View&#xff0c;判断有没有需要换肤的View&#xff0c;并且保存下来&#xff1b;在Activ…

墨迹天气桌面挂件换肤分析

该篇文章需要准备如下工具&#xff1a; 1、墨迹皮肤文件&#xff0c;下载地址。 Andorid换肤在网上搜索出来的结果&#xff0c;大概有三种&#xff1a; 1、应用本身带有写好的布局 优点&#xff1a;开发难度低 缺点&#xff1a;灵活性低&#xff0c;用户不能自定义皮肤。 2、使…

前端换肤的一些思考

先看看大家怎么做的。下面是两篇别人写的文章&#xff0c;最后是我自己的方法。 第一篇&#xff1a;聊一聊前端换肤 之前在做网站换肤&#xff0c;所以想谈谈网站换肤的实现。网页换肤就是修改颜色值&#xff0c;因此重点就在于怎么来替换。 一般实现 如上图&#xff0c;我们…

Visio保存为网页出错

visio 试图保存文档时出错。已创建的页面可能无效。 试图保存文档时出错。以创建的页面可能无效。最近在用Visio作图的时候时长发生的问题。 经过摸索&#xff0c;不覆盖保存没有问题&#xff0c;如果覆盖保存&#xff0c;有时会有这个问题。解决办法就是把以前生成的网页和相关…

Visio 2016软件

Visio 2016是微软官方最新发布的一款领先的图表解决方案&#xff0c;它可以帮助企业制作定义流程、编辑最佳方案的同时还可以建立可视化计划变革的一款实用工具。这款软件目前提供了&#xff1a;上手图例&#xff08;starter diagrams&#xff09;、成百上千的智能形状、一步数…

解决visio和office365冲突,无法安装visio问题

本教程用于解决office365和visio冲突&#xff0c;无法安装visio问题 目前系统中已经安装Office365 尚未安装visio专业版本 1、下载office增强工具。 office增强工具下载地址 右键解压&#xff0c;此处要记得解压的目录&#xff08;建议在当前目录下&#xff09;。 根据自…

Visio软件

Visio使用小技巧 上标、下标快捷键 上标&#xff1a;CtrlShift“”下标&#xff1a;Ctrl“” 自定义图形旋转角度 当点击菜单栏上的视图——任务窗格——大小和位置选项&#xff0c;在页面编辑区的左下方出现一个大小和位置窗口。 大小和位置窗口如下&#xff1a; 自…

Visio文件编辑查看工具Visio Viewer for Mac

Visio Viewer for Mac可以打开和查看Visio文件&#xff08;.vsd、.vdx和.vsdm文件&#xff09;。它具有简单易用的用户界面&#xff0c;可以快速加载和显示Visio文件。此外&#xff0c;它还支持导出文件为PDF、PNG、JPEG等格式&#xff0c;方便用户进行文件转换和共享。 Visio…

与你一起学习Microsoft Visio——基础篇

Hi&#xff0c;你好&#xff01;我是大黄蜂&#xff0c;非常高兴借此机会与你一起学习MS Visio的相关知识和技能。这一次的分享主要是结合本人在实际使用Visio过程中的一些方法技巧并总结整理其他人分享的知识&#xff0c;其中有一些材料则来源于互联网&#xff0c;期待通过我的…

【Visio】 windows Visio 画图

1、Visio如何画圆形 画圆用 里面的第二个画圆工具 &#xff0c;用这个工具可以画出圆或者椭圆。如果想得到一个正圆&#xff0c;在画的时候按住shift键即可。 画好一个圆之后单击它&#xff0c;再单击 填充选项&#xff0c;选择你想填充的颜色&#xff0c;选黑色的话就会出现一…

visio2019 专业版,两种方法

安装好visio后&#xff0c;有两种方法jihuo&#xff1a;方法2中自带安装包&#xff0c;有需要可以下载 注意:visio版本要和电脑上带的其他office版本保持一致&#xff0c;否则会不兼容。 1.参考这篇文章&#xff0c;使用代码jihuo https://blog.csdn.net/qq_39400113/article…

Microsoft Visio-Microsoft Visio下载

Microsoft Visio 2013可以帮助你以更直观的方式创建图表的新功能。Microsoft Visio 2013提供共同编写功能&#xff0c;可使团队协作变得更加容易。你也可以通过Microsoft Visio 2013软件增强图表的动态性&#xff0c;方法是将形状链接到实时数据&#xff0c;然后使用 SharePoin…