使用CoreText动态下载更换字体

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #d12f1b }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #703daa }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #ba2da2 }
p.p5 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000 }
span.s1 { color: #78492a }
span.s2 { }
span.s3 { color: #ba2da2 }
span.s4 { color: #000000 }
span.s5 { color: #4f8187 }
span.s6 { color: #703daa }

#import "ViewController.h"

#import <CoreText/CoreText.h>

@interface ViewController ()<UITableViewDataSource,UITableViewDelegate>

@property (weak, nonatomic) IBOutlet UITableView *fTableView;

@property (weak, nonatomic) IBOutlet UITextView *fTextView;

@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *fActivityIndicatorView;

@property (weak, nonatomic) IBOutlet UIProgressView *fProgressView;

@property (strong, nonatomic) NSArray *fontNames;//字体的名字

@property (copy, nonatomic) NSString *fontSamples;//展示的话

@property (copy, nonatomic) NSString *errorMessage;

@end

@implementation ViewController

详细代码如下:

  1 - (void)viewDidLoad
  2 {
  3     [super viewDidLoad];
  4
  5     self.fontNames = [[NSArray alloc] initWithObjects:
  6                       @"STXingkai-SC-Light",
  7                       @"DFWaWaSC-W5",
  8                       @"FZLTXHK--GBK1-0",
  9                       @"STLibian-SC-Regular",
 10                       @"LiHeiPro",
 11                       @"HiraginoSansGB-W3",
 12                       nil];
 13     self.fontSamples = @"让优秀的人拥有值得的归宿。";
 14 }
 15
 16 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
 17     return [_fontNames count];
 18 }
 19
 20
 21 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
 22     static NSString *MyIdentifier = @"MyIdentifier";
 23     UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
 24     if (cell == nil) {
 25         cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
 26     }
 27     cell.textLabel.text = _fontNames[indexPath.row];
 28     return cell;
 29 }
 30
 31
 32 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
 33     [self asynchronouslySetFontName:_fontNames[indexPath.row]];
 34     if ([self.fTextView isFirstResponder])
 35         [self.fTextView resignFirstResponder];
 36 }
 37
 38 - (void)asynchronouslySetFontName:(NSString *)fontName{
 39     if ([self isFontDownloaded:fontName]) {
 40         _fTextView.text = _fontSamples;
 41         _fTextView.font = [UIFont fontWithName:fontName size:24.];
 42         return;
 43     }else{
 44         //如果名为fontName的字体尚未下载,则动态下载。使用UIActivityIndicatorView和UIProgressView辅助完成下载过程
 45         NSMutableDictionary *attrs = [NSMutableDictionary dictionaryWithObjectsAndKeys:fontName, kCTFontNameAttribute, nil];
 46         CTFontDescriptorRef desc = CTFontDescriptorCreateWithAttributes((__bridge CFDictionaryRef)attrs);
 47         NSMutableArray *descs = [NSMutableArray arrayWithCapacity:0];
 48         [descs addObject:(__bridge id)desc];
 49         CFRelease(desc);
 50
 51         __block BOOL errorDuringDownload = NO;
 52         CTFontDescriptorMatchFontDescriptorsWithProgressHandler( (__bridge CFArrayRef)descs, NULL,  ^(CTFontDescriptorMatchingState state, CFDictionaryRef progressParameter) {
 53
 54             double progressValue = [[(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingPercentage] doubleValue];
 55
 56             if (state == kCTFontDescriptorMatchingDidBegin) {
 57                 dispatch_async( dispatch_get_main_queue(), ^ {
 58                     [_fActivityIndicatorView startAnimating];
 59                     _fActivityIndicatorView.hidden = NO;
 60                     _fTextView.text= [NSString stringWithFormat:@"正在下载 %@ 字体", fontName];
 61                     _fTextView.font = [UIFont systemFontOfSize:14.];
 62                 });
 63             } else if (state == kCTFontDescriptorMatchingDidFinish) {
 64                 dispatch_async( dispatch_get_main_queue(), ^ {
 65                     [_fActivityIndicatorView stopAnimating];
 66                     _fActivityIndicatorView.hidden = YES;
 67                     _fTextView.text = _fontSamples;
 68                     _fTextView.font = [UIFont fontWithName:fontName size:24.];
 69                     if (!errorDuringDownload) {
 70                         NSLog(@"字体 %@ 下载完成", fontName);
 71                     }
 72                 });
 73             } else if (state == kCTFontDescriptorMatchingWillBeginDownloading) {
 74                 dispatch_async( dispatch_get_main_queue(), ^ {
 75                     _fProgressView.progress = 0.0;
 76                     _fProgressView.hidden = NO;
 77                 });
 78             } else if (state == kCTFontDescriptorMatchingDidFinishDownloading) {
 79                 dispatch_async( dispatch_get_main_queue(), ^ {
 80                     _fProgressView.hidden = YES;
 81                 });
 82             } else if (state == kCTFontDescriptorMatchingDownloading) {
 83                 dispatch_async( dispatch_get_main_queue(), ^ {
 84                     [_fProgressView setProgress:progressValue / 100.0 animated:YES];
 85                 });
 86             } else if (state == kCTFontDescriptorMatchingDidFailWithError) {
 87                 NSError *error = [(__bridge NSDictionary *)progressParameter objectForKey:(id)kCTFontDescriptorMatchingError];
 88                 if (error != nil) {
 89                     _errorMessage = [error description];
 90                 } else {
 91                     _errorMessage = @"ERROR MESSAGE IS NOT AVAILABLE!";
 92                 }
 93                 errorDuringDownload = YES;
 94                 dispatch_async( dispatch_get_main_queue(), ^ {
 95                     _fProgressView.hidden = YES;
 96                     NSLog(@"下载错误: %@", _errorMessage);
 97                 });
 98             }
 99
100             return (bool)YES;
101         });
102     }
103 }
104
105
106 - (BOOL)isFontDownloaded:(NSString *)fontName{
107     UIFont * aFont = [UIFont fontWithName:fontName size:12.0];
108     return (aFont && ([aFont.fontName compare:fontName] == NSOrderedSame || [aFont.familyName compare:fontName] == NSOrderedSame));
109 }

实现效果:

时间: 2024-11-03 03:32:17

使用CoreText动态下载更换字体的相关文章

ios字体动态下载

一.IOS字体 动态下载字体,不仅可以减少APP包的大小,而且字体在iOS系统中是公共的,可共用的.所以如果自己用到的字体已经下载字体,就不用再次下载.还有就是系统提供的字体是iOS维护的.如果用到第三方字体,不仅字体大小对流量.包大小有影响,而且会有版权等的诸多限制.真机下载后的字体路径是在 file:///private/var/MobileAsset/Assets/com_apple_MobileAsset_Font2/25eb7390708d494864eef0905635e1dc3f2

Struts2实现文件的上传与动态下载功能。

本篇主要使用Struts2实现文件的上传与动态下载功能.出于安全考虑,所以,在硬盘上存储上传的文件的时候,统一都重新命名为随机字符串.用数据库存储真实文件名与随机文件名称之间的关联. 下面的是实体类 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class FileBag implements java.io.Serializable {     // Fields     private Integer id;   //Id编号     privat

(转)Unity3d使用心得(2):Unity3d 动态下载动画资源——AnimationClip 的使用 - 斯玛特琦

引言: 在使用 Unity3d 开发微端.或者网页游戏的时候常常须要将资源打包成 AssetBundle ,然后通过 www 的方式动态的下载资源.今天要分享的是我再动态下载 Animation 骨骼动画的时候走的一些弯路和自己最后的解决方式. 我们的项目中的动画资源有上百套之多,每一套动画大概在300KB 到 900KB 之前,所以有一个非常重要的需求就是动态的下载须要的动画. 错误的方法: 我看到需求后想到的第一种方法是将 FBX 倒入的 Prefab 实例化,将当中的 Animation

文件的下载(静态下载和动态下载)

建立一个Servlet类:FiledownloadServlet: package com.lanqiao.javaweb.filedownloadservlet; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLClassLoader; import java.net.UR

intellig idea中jsp或html数据没有自动保存和更换字体

主题一:保存数据jsp intellig idea是自动保存数据的,看到没有保存 解决方案: 成功解决 主题二:更换字体: 或者快捷键Ctel+Alt+s 成功解决 原文地址:https://www.cnblogs.com/weibanggang/p/9398498.html

一般 -- 动态下载组件

摘要:一般 -- 动态下载组件 http://msdn.microsoft.com/zh-tw/library/system.windows.assemblypart(VS.95).aspx 原文:大专栏  一般 -- 动态下载组件 原文地址:https://www.cnblogs.com/chinatrump/p/11496815.html

Iconfont-阿里巴巴矢量库下载的字体

https://www.cnblogs.com/xiaomingge/articles/5421503.html 一.下载 下载就是先将所选择的图标加入购物车,然后从购物车里下载代码就行,下载下来就是一个压缩包,解压后如 二.如何离线调用 如第一步先将字体下载至本地,且一定要把demo里的两个文件.ttf和.woff引入. 1.打开demo_unicode.html就可以看见unicode码和如何引入. 2.1 引入文件 2.2 html代码 <div> <p class="i

实现GridControl行动态改变行字体和背景色

需求:开发时遇到一个问题, 需要根据GridControl行数据不同,实现不同的效果 在gridView的RowCellStyle的事件中实现,需要的效果 private void gridView1_RowCellStyle(object sender, DevExpress.XtraGrid.Views.Grid.RowCellStyleEventArgs e)        {            string accountQuantity = gridView1.GetRowCell

UGUI怎么获取Image,怎么动态的更换Image

怎么动态来修改UGUI中的image呢,怎么来获取这个组件呢 ,首先我们需要在头文件里面定义一下 我圈中的那***哪里,不能没办法获取到image组件 using UnityEngine;using System.Collections;using UnityEngine.UI;using UnityEngine.Sprites;public class OnButton : MonoBehaviour { private Button button;   private Image image