美文网首页
自定义app字体(原生+h5)

自定义app字体(原生+h5)

作者: 小打小闹hx | 来源:发表于2018-07-05 17:08 被阅读175次

前段时间在开发中遇到一个小问题需要自定义app的字体。当然自定义字体也并不是什么难事,只不过一开始厂商给的字体包有问题。那家伙好一顿纠结,我最开始也发现了是字体包的问题但是他们商务非要说可以用,并且在ps上是可以用的。我又让他们开发试了一下提供给我们的字体包,果不其然他们给的字体包有问题。最终还算顺利的给解决了。最近闲下来简单总结一下方便以后查阅和各位小伙伴使用。

原生实现

首先需要将字体添加到项目工程中,并配置plist

plist.jpg

这里可以添加多个item导入多个字体包

接下来我们需要得到字体的名称

打印查看字体名称

for(NSString *fontfamilyname in [UIFont familyNames])
    {
        NSLog(@"family:'%@'",fontfamilyname);
        for(NSString *fontName in [UIFont fontNamesForFamilyName:fontfamilyname])
        {
            NSLog(@"\tfont:'%@'",fontName);
        }
        NSLog(@"-------------");
    }
font.jpg

我们可以在控制台中查看我们要使用的字体font

下面我们可以调用一下字体看看具体的效果

//自定义字体
label.font = [UIFont fontWithName:@"FZLTXHK--GBK1-0" size:14];
//默认字体
label1.font = [UIFont systemFontOfSize:14];

很明显我们可以对比看不两种字体的不同


原生效果.jpg

这里我们原生的集成就OK了

当然[UIFont fontWithName:@"FZLTXHK--GBK1-0" size:14]这种写法太麻烦了,需要在很多地方修改。并且工程中有用到第三方sdk这种方式显然是不合适的。看到这里的小伙伴可能会说了用runtime来实现,这里我们可以使用类别 实现会更简单。


#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wobjc-protocol-method-implementation"
+ (UIFont *)systemFontOfSize:(CGFloat)fontSize{
    return [UIFont fontWithName:@"FZLTXHK--GBK1-0" size:fontSize];

}
+ (UIFont *)boldSystemFontOfSize:(CGFloat)fontSize{
    return [UIFont fontWithName:@"FZLTXHK--GBK1-0" size:fontSize];
}
#pragma clang diagnostic pop

由于app是混合开发除了原生的页面还会有h5页面。那么问题来了h5如何实现自定义字体?我们有的人肯定会说在h5工程中加入字体包。(⊙o⊙)… 不能不说这种方法是可以实现的,不可否认这将是最糟糕的做法。我们一个字体包有7.7M,可想而知用户体验该有多糟糕(可能会被骂死)......

这里简单说明一下实现的思路

拦截h5字体请求--->将本地的字体库返回给h5 这样可以很轻松的解决上面的一系列的问题

webView实现

自定义NSURLProtocol协议


+ (BOOL)canInitWithRequest:(NSURLRequest *)request{
    NSLog(@"---->%@",request.URL);
    NSString *scheme = [[request URL] scheme];
    if ( ([scheme caseInsensitiveCompare:@"http"] == NSOrderedSame  ||
          [scheme caseInsensitiveCompare:@"https"] == NSOrderedSame ||
          [scheme caseInsensitiveCompare:@"file"] == NSOrderedSame)){
        if ([NSURLProtocol propertyForKey:RCBURLProtocolHandledKey inRequest:request]) {
            return NO;
        }
        return YES;
    }
    return NO;
}

+ (NSURLRequest *)canonicalRequestForRequest:(NSURLRequest *)request{
    return request;
}

- (void)startLoading{
    NSMutableURLRequest *mutableReqeust = [[self request] mutableCopy];
    [NSURLProtocol setProperty:@YES forKey:RCBURLProtocolHandledKey inRequest:mutableReqeust];
    NSLog(@"URL-------->%@",self.request.URL);
    if ([[self.request.URL absoluteString] hasSuffix:@"ttf"] ||
        [[self.request.URL absoluteString] hasSuffix:@"TTF"]) {

        //带格式
        NSString *font = [self.request.URL.absoluteString lastPathComponent];
        
        NSString *path = [[NSBundle mainBundle] pathForResource:font ofType:nil];
        
        NSData *fontData = [NSData dataWithContentsOfFile:path];
        
        NSURLResponse *response = [[NSURLResponse alloc] init];
        
        [self.client URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
        [self.client URLProtocol:self didLoadData:fontData];
        [[self client] URLProtocolDidFinishLoading:self];
    }else{
        self.connection = [NSURLConnection connectionWithRequest:mutableReqeust delegate:self];
    }
}

- (void)stopLoading{
    [self.connection cancel];
}

#pragma mark - NSURLConnection delegate

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response{
    [[self client] URLProtocol:self didReceiveResponse:response cacheStoragePolicy:NSURLCacheStorageNotAllowed];
    //保存网络获取的数据和数据对象
    self.data = [[NSMutableData alloc] init];
    self.response = response;
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
    [[self client] URLProtocol:self didLoadData:data];
    //累加数据
    [self.data appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error{
    [[self client] URLProtocol:self didFailWithError:error];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection{
    [[self client] URLProtocolDidFinishLoading:self];
    if (!self.response || [self.data length] == 0) {
        return;
    }
}

- (NSURLRequest *)connection:(NSURLConnection *)connection willSendRequest:(NSURLRequest *)request redirectResponse:(NSURLResponse *)response{
    if (response) {
        // simply consider redirect as an error
        NSError *error = [NSError errorWithDomain:NSURLErrorDomain code:NSURLErrorResourceUnavailable userInfo:nil];
        [[self client] URLProtocol:self didFailWithError:error];
    }
    return request;
}

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
    [[self client] URLProtocol:self didReceiveAuthenticationChallenge:challenge];
}

- (void)connection:(NSURLConnection *)connection didCancelAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge{
    [[self client] URLProtocol:self didCancelAuthenticationChallenge:challenge];
}

注册协议[NSURLProtocol registerClass:[BJRCBURLProtocol class]];
h5直接调用字体库

  <style>
    @font-face {
      font-family: 'FZLTHK';
      src: url('FZLTHK.TTF') format('truetype')
    }

    .p1 {
      font-family: "FZLTHK";
      font-size: 30pt;
      color: blue;
    }

    .p2 {
      font-size: 30pt;
      color: blue
    }
  </style>

到这里app自定义字体就(原生+webView就全部实现了)
这里我写了一个简单的demo有需要的自己取

相关文章

  • WKWebView 使用自定义字体

    前言 最近公司产品想更改APP整体的字体,并且H5页面的字体也要与APP原生的字体保持一致。 1.APP更改字体 ...

  • 自定义app字体(原生+h5)

    前段时间在开发中遇到一个小问题需要自定义app的字体。当然自定义字体也并不是什么难事,只不过一开始厂商给的字体包有...

  • UIWebView使用app内自定义字体

    最近,做了个小需求。因为app是使用的自定义字体,所以产品想让h5的字体跟app的字体一致,减少脱离感。而一般来说...

  • iOS原生App与H5页面交互笔记

    iOS原生App与H5页面交互笔记 iOS原生App与H5页面交互笔记

  • iOS设置WebView中的字体及型号

    一、前言 近期产品提出要将APP中h5显示的网页正文字体及大小要和APP原生的一致,也就是要修改网页里正文部分的字...

  • 反射方式修改App字体

    自定义Applicaiton,实现全局App修改,对于字体也是同理,通过Typeface设置加载App全局字体,对...

  • Android webView和h5的常用交互场景浅析

    前言 现如今,大部分APP都是原生+h5形式的,原生的流畅+h5的内容多样性,使得APP内容丰富多彩,因此andr...

  • vue与原生app交互

    原生app调用h5方法,首先,app和h5先定义相同的方法名,例如:getParam vue写法如下 h5调用ap...

  • 前端 iPhoneX适配

    一、背景 开发混合App,关于iPhoneX刘海的适配,应该是前端H5做,还是原生APP做呢?个人觉得原生APP做...

  • 浅谈APP与H5对比!优势都有哪些呢?

    很多人再开发一款APP的时候,H5开发相对来说比较便宜一点,原生APP开发则费用较高。那么到底H5跟原生开发有什么...

网友评论

      本文标题:自定义app字体(原生+h5)

      本文链接:https://www.haomeiwen.com/subject/sgilmxtx.html