Xamarin iOS能否按需加载.otf/.ttf字体?求ObjC代码转C#实现
Xamarin iOS 按需加载OTF/TTF字体:兼容性与C#实现
兼容性说明
Xamarin iOS完全支持按需获取.otf和.ttf格式字体,这一特性基于iOS原生CoreText框架实现,和Objective-C版本的功能完全一致,不存在兼容性问题。
对应C#实现代码
以下是你提供的Objective-C代码转换后的C#版本:
using CoreText; using Foundation; using UIKit; using System; public void AsynchronouslySetFontName(string fontName, UITextView textView) { nfloat fontSize = 24.0f; var existingFont = UIFont.FromName(fontName, fontSize); // 检查字体是否已加载,直接使用 if (existingFont != null && (string.Equals(existingFont.FontName, fontName, StringComparison.Ordinal) || string.Equals(existingFont.FamilyName, fontName, StringComparison.Ordinal))) { textView.Font = existingFont; return; } // 构建字体描述符,触发按需加载 var fontAttrs = new NSMutableDictionary(); fontAttrs.SetValueForKey(new NSString(fontName), CTFontDescriptorAttributeName.Name); using var fontDescriptor = CTFontDescriptor.CreateWithAttributes(fontAttrs); var descriptorsArray = new NSMutableArray(); descriptorsArray.Add(fontDescriptor); // 弱引用避免循环引用 WeakReference<UITextView> weakTextViewRef = new WeakReference<UITextView>(textView); CTFontDescriptor.MatchFontDescriptorsWithProgressHandler(descriptorsArray, null, (matchingState, progressParams) => { if (matchingState == CTFontDescriptorMatchingState.DidFinish) { // 切回主队列更新UI DispatchQueue.MainQueue.DispatchAsync(() => { if (weakTextViewRef.TryGetTarget(out var targetTextView)) { targetTextView.Font = UIFont.FromName(fontName, fontSize); } }); } return true; }); }
关键细节说明
- 先校验字体是否已存在,减少不必要的加载请求
- 使用
CTFontDescriptor.MatchFontDescriptorsWithProgressHandler触发CoreText的异步字体匹配逻辑 - 通过
WeakReference持有TextView,避免内存泄漏 - 必须在主队列更新UI,符合iOS的线程安全规则
内容的提问来源于stack exchange,提问作者Snehal Jadhav
相关产品推荐
相关产品推荐

