iOS UIFont 的学习与使用

2023-11-02

通常,我们使用字体 都是系统默认的字体. 有时候 从阅读体验,美观度 设计师都会考虑用一些 更高大尚的字体. 系统字体库 给英文 各种style的发挥空间很大,但是 中文则不然. 

但是苹果 给使用中文的字体的开发者提供了 动态下载字体库的福利,这个真是好,并且下载到/private/var/mobile/Library/Assets/com_apple_MobileAsset_Font/  这样不会增加app本身的大小. 不失为一种好的选择.

前提:  你首先 要知道 你要使用的字体的官方名字, 用这个名字 当索引下载.

官方竟然有文档和demo 真是方便的不要不要的:

https://developer.apple.com/library/ios/samplecode/DownloadFont/Listings/DownloadFont_ViewController_m.html

 操作基本步骤

1. 首先判断 是否有这种字体 无则用默认的

(如果 要使用一些 iOS8,iOS9才有的字体 一定要考虑低版本用户的情况,会闪退,在 font 类别里面也要做预判断,没有这个字体 就用默认的呗)

+ (UIFont *)normalHfFontWithSize: (CGFloat)fontSize {

    return [UIFont isFontDownloaded:@"FZLTXHK--GBK1-0"] ? [UIFont fontWithName:@"FZLTXHK--GBK1-0" size:fontSize] : [UIFont systemFontWithSize:fontSize];
}

+ (BOOL)isFontDownloaded:(NSString *)fontName {
    UIFont* aFont = [UIFont fontWithName:fontName size:12.0];
    if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame
                  || [aFont.familyName compare:fontName] == NSOrderedSame)) {
        return YES;
    } else {
        return NO;
    }
}

 2. 我的下载策略 是 打开应用 就在父线程里面 处理 需要的字体下载等事宜 , 也有人 是用再下载 ,看需求吧 

    Reachability *r = [Reachability reachabilityForInternetConnection];
    [r startNotifier];
    NetworkStatus netStatus = [r currentReachabilityStatus];
    
    NSArray *fonts = @[@"FZLTZHK--GBK1-0",@"FZLTXHK--GBK1-0"];
    
    for (NSString *font in fonts) {
        NSString *isFontAvailable = [[NSUserDefaults standardUserDefaults] objectForKey:[NSString stringWithFormat:@"FontDownloaded%@",font]];
        if ((netStatus == ReachableViaWiFi && ![isFontAvailable isEqualToString:font]) || [isFontAvailable isEqualToString:font]) {
            [UIFont downloadFont:font];
        }
    }

 


+ (void)downloadFont:(NSString *)fontName { UIFont* aFont = [UIFont fontWithName:fontName size:12.]; // If the font is already downloaded if (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame)) { // Go ahead and display the sample text. return; } // Create a dictionary with the font's PostScript name.

NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil]; // Create a new font descriptor reference from the attributes dictionary. CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs); // 将字体描述对象放到一个NSMutableArray中 NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0]; [descs addObject:(__bridge id)desc]; CFRelease(desc); __block BOOL errorDuringDownload = NO; // Start processing the font descriptor.. // This function returns immediately, but can potentially take long time to process. // The progress is notified via the callback block of CTFontDescriptorProgressHandler type. // See CTFontDescriptor.h for the list of progress states and keys for progressParameter dictionary. CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL, ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) { NSString *errorMessage; DLog( @"state %d - %@", state, progressParameter); // double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue]; if (state == kCTFontDescriptorMatchingDidBegin) { dispatch_async( dispatch_get_main_queue(), ^ { DLog(@"Begin Matching"); }); } else if (state == kCTFontDescriptorMatchingDidFinish) { dispatch_async( dispatch_get_main_queue(), ^ { // Log the font URL in the console CTFontRef fontRef = CTFontCreateWithName((__bridge CFStringRef)fontName, 0., NULL); CFStringRef fontURL = CTFontCopyAttribute(fontRef, kCTFontURLAttribute); DLog(@"%@", (__bridge NSURL*)(fontURL)); CFRelease(fontURL); CFRelease(fontRef); if (!errorDuringDownload) { [[NSUserDefaults standardUserDefaults] setObject:fontName forKey:[NSString stringWithFormat:@"FontDownloaded%@",fontName]]; [[NSUserDefaults standardUserDefaults] synchronize]; DLog(@"%@ downloaded", fontName); } }); } else if (state == kCTFontDescriptorMatchingWillBeginDownloading) { dispatch_async( dispatch_get_main_queue(), ^ { DLog(@"Begin Downloading"); }); } else if (state == kCTFontDescriptorMatchingDidFinishDownloading) { dispatch_async( dispatch_get_main_queue(), ^ { DLog(@"Finish downloading");
// 可以在这里修改UI控件的字体 }); }
else if (state == kCTFontDescriptorMatchingDownloading) { dispatch_async( dispatch_get_main_queue(), ^ { //DLog(@"Downloading %.0f%% complete", progressValue); }); } else if (state == kCTFontDescriptorMatchingDidFailWithError) { // An error has occurred. // Get the error message NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError]; if (error != nil) { errorMessage = [error description]; } else { errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!"; } // Set our flag 设置标志 errorDuringDownload = YES; dispatch_async( dispatch_get_main_queue(), ^ { DLog(@"Download error: %@", errorMessage); }); } return (bool)YES; }); }

妥妥的 满足使用动态下载的字体需求

备注:

其他方法还有 使用字体资源文件(尾缀为.ttf或otf格式文件),上网上搜吧 讲解 一堆 .

但是这里存在的问题 1  需要把这个 .ttf文件 target到工程 不像 动态下载不增加 应用本身的大小 的特点

其次是 如果没有处理版权问题,这个就大发了 是吧... 

看需求 正确使用 恰当的方法解决问题吧

 

参考:

http://www.awnlab.com/archives/2658.html

转载于:https://www.cnblogs.com/someonelikeyou/p/5581677.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS UIFont 的学习与使用 的相关文章

  • Android:基本 UI 组件

    前言 组件是 Android 程序设计的基本组成单元 通过使用组件可以高效地开发 Android 应用程序 文本类组件 Android 中提供了一些与文本显示 输入相关的组件 通过这些组件可以显示或输入文字 TextView 类 用于显示文
  • Qt——用于表格QTableView的模型

    如果想使用表格来呈现数据 Qt提供了一个方便的部件QTableWidget 但是直接用它实现一些功能可能比较困难 这里将介绍一种强大 灵活的方式来操作表格 一 模型 视图架构 在这个架构中 模型用于存储数据 视图用于呈现数据 除此之外 还有
  • UI设计师有钱途还是平面设计师或者是网页设计师呢?

    UI设计 平面设计和网页设计 哪个前景更好呢 其实ui和网页设计都属于平面设计里的一个分支 举个例子 设计一份饭店的点菜单 一样的图案 印刷出来是传统平面设计 放网站上是网页设计 放手机上显示是UI 其实都是一样的平面美术设计 那么有人要问
  • 突破自定义View性能瓶颈

    在Android应用程序中 自定义View是一个非常常见的需求 自定义View可以帮助您创建独特的UI元素 以满足您的应用程序的特定需求 然而 自定义View也可能会导致性能问题 特别是在您的应用程序需要处理大量自定义View的情况下 在本
  • element-ui中$confirm弹出框的确定和取消按钮互换位置

    element ui中 confirm弹出框的确定和取消按钮互换位置 1 定位元素 2 找到元素class 通过flex布局 进行位置更换 3 app vue中 进行全局修改 确认窗 取消确认按钮位置更换 el message box wr
  • Qt信号与槽的链接3种方法详解

    转载自 14条消息 Qt5 9 2 VS2017入门实例 透彻解析 冯爽朗的博客 CSDN博客 vs qt 示例 由于现在书上介绍的大部分都是Qt Creator 并没有介绍Qt VS的教程 虽然说很相似 但是也有很多地方不同 对于初学者特
  • Java课程设计之学习成绩管理系统

    package System import java awt import java awt event import java io import javax swing import javax swing table Abstract
  • 如何创建项目

    1 MvvmLight框架的引用 引用 头部选项卡的 工具栏 NuGet 包管理器 管理解决方案的NuGet 程序包 搜索 MVVM Light MvvmLight 作者 Laurent Bugnion GalaSoft 勾选项目 Do n
  • 极速入门体验Qt5软件开发,从安装到打包,少走弯路,Qt入门指南,串口调试助手开发实战

    文章目录 前言 一 成果先行 二 下载安装 1 安装QT 三 项目开发实战 1 创建新项目 2 UI设计 3 编写widget h头文件 4 编写widget cpp源文件 四 编译运行 五 项目打包 1 编译发布版 2 绿色版打包 3 安
  • element-ui中日期区间组件

    elementui中日期组件使用 最长只能选择3个月 不限制禁用日期 描述 时间组件代码 描述 点击 确定 按钮进行验证 点击 清空 按钮 清空输入框中的数据 时间范围不能超过3个月 并添加快捷选择今天 最近一周 最近一月 最近3个月 以下
  • 关于UI适配的文档

    第一部分 原理 1 根据当前屏幕尺寸与开发预设屏幕尺寸尺寸得出以下参数 1 XRatio 当前屏幕尺寸与开发尺寸的X轴比例 2 YRtaio 当前屏幕尺寸与开发尺寸的Y轴比例 3minRatio XRatio与YRtaio中的较小值 2 之
  • UE4命令行使用,解释

    命令行在外部 从命令行运行编辑项目 1 导航到您的 LauncherInstall VersionNumber Engine Binaries Win64 目录中 2 右键单击上 UE4Editor exe 的可执行文件 并选择创建快捷方式
  • Jquery ligerui下拉框复选,使下拉框中相应值对勾选中

    othertypeCombox ligerGetComboBoxManager selectValue 1 2 3 4 othertypeCombox ligerGetComboBoxManager bulidContent 必须加上后一行
  • android Scroller

    参考 http www linuxidc com Linux 2016 01 127276 htm 以前只知道怎么使用scroller 照猫画虎 复制粘贴 今天遇到使用scroller 还是要去搜索 这样不行 要搞懂原理 上面的博客写的很漂
  • Qt的基本语法及其使用(一)

    Qt的概念 Qt是通用的C 开发界面框架 C 图形用户界面 应用程序开发框架 既可以开发GUI程序也可以开发开发非GUI程序 Qt是面向对象的框架 使用特殊的代码生成扩展 Qt的历史 1991由QT公司研发 2008年被诺基亚收购 2012
  • UI 易用性测试 以及自动化实现!

    GUI 是指图形用户界面 UI 是指用户界面 对于纯软件系统 这两者没有本质的区别 GUI易用性测试与 UI 易用性测试内容一致 但是如果测试的对象是一个产品 这两者则存在区别 对于产品 UI 则不仅仅包括 GUI 还包括产品硬件部分的测试
  • element ui backTop源码解析-逐行逐析

    backTop 回到顶部 组件简介 基础概念 返回页面顶部的操作按钮 代码
  • 创意无限,绘图轻松——Sketch for Mac矢量绘图软件全面介绍

    在现代设计领域 矢量绘图软件是设计师们必不可少的工具之一 而在众多矢量绘图软件中 Sketch for Mac凭借其强大的功能和友好的用户界面脱颖而出 成为众多设计师的首选 Sketch for Mac是一款专为Mac用户开发的矢量绘图软件
  • element ui弹窗在别的弹窗下方,优先级不高的问题

    在 弹窗 的标签中加入append to body即可解决该问题
  • HarmonyOS鸿蒙开发指南:容器组建 tabs开发指导

    目录 创建Tabs 设置Tabs方向 设置样式 显示页签索引 场景示例 创建Tabs 在pages index目录下的hml文件中创建一个Tabs组件 div class container div

随机推荐

  • java爬虫爬取主流房屋网站

    最近博主要做一些分析课题 所以使用java爬取了主流的房屋网站 搞些事情 下面是我搞事情的思路 在结尾处我会投放我的源码文件 供大家下载 导航 设计思路 项目的包与类详解 部分重要代码展示 源码下载 设计思路 想要爬取房屋的网站 就要有以下
  • ELM和RVFL两种网络的超详细介绍

    最近一直在跑程序 在看文章时注意到了这两种网络 ELM和RVFL 自己查阅资料做了简单的总结 希望在大家学习时帮助到大家 一 RVFL Random vector functional link network 首先明确一点 在进行分类的时
  • 【学习记录】win10 + ubuntu 22.04双系统安装

    一 背景 因为家里的台式 Windows 10 最近一直频繁蓝屏 再加上Win10之前经常性的资源管理器未响应 对Windows系统逐渐失去了信心 于是想着安装稳定性较好的Linux 以前抵触Linux是因为其人机交互界面没Windows那
  • Rabbit MQ使用

    rabbitmq支持 net framwork 3 5的最后版本 rabbitmq支持 net framwork 3 5的最后版本是3 4 3 安装步骤 1 工具 gt 库程序包管理器 进入程序包管控制台 2 Install Package
  • Python学习笔记 之 从入门到放弃

    笔记目录 9月22日 基础教程 基础知识 模块导入 用变量引用函数 或者Python中大多数的对象 将数值转换成字符串的方法 str类型 repr函数 9月23日 列表 元组 序列索引可以为负数 序列的分片和步长 序列相加 乘法 列表和字符
  • 深聊性能测试,从入门到放弃之:Locust性能自动化(二)代码实战

    Locust代码实战 1 引言 2 Locust实例展示 2 1 官网代码示例 2 2 Locust 代码模板及执行顺序 3 Locust 类代码分析 3 1 实例代码展示 3 2 classTaskSet 用法及展示 3 2 1 定义 3
  • caffe FCN网络的训练——以SIFT-Flow 数据集为例

    原文 http www cnblogs com xuanxufeng p 6243342 html 我在练习中根据操作稍微修改了一些内容 caffe fcn学习资料收集 可以参考这个训练 http blog csdn net wangkun
  • PyQuery库使用详解

    目录 一 初始化 1 字符串初始化 2 URL初始化 3 文件初始化 二 基本CSS选择器 三 查找元素 查找子元素 查找父元素 祖先节点 兄弟元素 四 遍历 五 获取信息 获取属性 获取文本 获取HTML 六 DOM操作 addClass
  • sql多对多关联查询php,MyBatis多对多关联查询(级联查询)

    其实 MyBatis 没有实现多对多级联 这是因为多对多级联可以通过两个一对多级联进行替换 例如 一个订单可以有多种商品 一种商品可以对应多个订单 订单与商品就是多对多的级联关系 使用一个中间表 订单记录表 就可以将多对多级联转换成两个一对
  • C++面试题(~01)

    冯诺依曼体系结构 冯诺依曼体系结构用于存储程序方式 指令和数据不加区别混合存储在同一存储器中 有如下特点 一律用二进制数表示数据和指令 顺序执行程序 执行前 将需要的程序和数据先放入存储器 PC为内存 当执行时把要执行的程序和要处理的数据按
  • nerf-pytorch3D 代码详细流程 debug

    train nerf py import main config内容 model class RadianceFieldRenderer def init 分 coarse fine 设置函数 if render pass coarse r
  • 在linux上,以root用户打开并且运行vscode

    最好的办法是把要运行的文件夹设置权限为 chmod 777 R dir name 这是我目前的解决办法 还没看到其他的自动保存的方法
  • d3dx9_35.dll如何修复

    使用电脑过程中 弹出d3dx9 35 dll文件的丢失总是让用户非常苦恼 对于第一次遇到这个问题的用户 可能他们并不知道如何处理这样的状况 但如果能上网查一下 解决这个弹窗问题的方法并不难 后续小编整理的内容便将为用户解决dll丢失弹窗问题
  • Maven 6、maven中的工程关系

    maven中的工程关系 Maven工具基于POM Project Object Model 项目对象模型 模式实现的 在Maven中每个项目都相当于是一个对象 对象 项目 和对象 项目 之间是有关系的 关系包含了 依赖 继承 聚合 实现Ma
  • EPOLLONESHOT

    EPOLL的EPOLLONESHOT事件 使一个socket连接任何时刻都只被一个线程所处理 对于注册了EPOLLONESHOT事件的socket 操作系统最多触发其上注册的一个可读 可写 或者异常事件 且只触发一次 触发时此文件描述符不能
  • 第一章:互联网的概述

    第一章 互联网概述 1 互联网是一种计算机网络的集合 以 TCP IP 进行数据通信 把世界各地的计算机网络连接在一起 实现信息交 换和资源共享 互联网是建立在一组共同协议之上的网络设备和线路的物理集合 是一组可共享的资源集 它包括基于 T
  • Java实现数据结构——数组

    数组是一种比较简单的数据结构 而且在大多数高级程序设计语言中都实现了数组 一 无序数组 利用面向过程的思想创建数组 实现数组元素的插入 查找和删除工作 public class Box public static void main Str
  • 软件工程——第12章面向对象实现知识点整理

    本专栏是博主个人笔记 主要目的是利用碎片化的时间来记忆软工知识点 特此声明 文章目录 1 面向对象语言技术的特点
  • MATLAB:用for循环求1、2、……100的和以及用函数文件求前N项和

    MATLAB 用for循环求1 2 100的和以及用函数文件求前N项和 1 A 0 for i 1 100 A A i end A 或 sum 1 100 2 function n A n if n 1 n 1 else n n A n 1
  • iOS UIFont 的学习与使用

    通常 我们使用字体 都是系统默认的字体 有时候 从阅读体验 美观度 设计师都会考虑用一些 更高大尚的字体 系统字体库 给英文 各种style的发挥空间很大 但是 中文则不然 但是苹果 给使用中文的字体的开发者提供了 动态下载字体库的福利 这