iOS UIFont.ByName Exception(Value不能为null。参数名称:value)
在自定义Xamarin Forms iOS渲染器中,我正在从文件加载字体,当我到达UIFont.FromName时,它会消除下面显示的exception。 font var是一个有效的CGFont实例,fontsize是一个有效的nfloat。 有任何想法吗?
var font = CGFont.CreateFromProvider(fontDataProvider); Control.Font = UIFont.FromName(font.FullName, (nfloat)e.NewElement.FontSize);
堆栈跟踪:
System.ArgumentNullException: Value cannot be null. Parameter name: value at UIKit.UILabel.set_Font (UIKit.UIFont value) [0x00011] in /Users/builder/data/lanes/1381/3afb4af5/source/maccore/src/build/ios/native/UIKit/UILabel.g.cs:337 at DecryptRenderFont.iOS.DecryptRenderControlRenderer.OnElementChanged (Xamarin.Forms.Platform.iOS.ElementChangedEventArgs`1[TElement] e) [0x00215] at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x00118] in :0 at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in :0 at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in :0 at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in :0 at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in :0 at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000cc] in :0 at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in :0 at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in :0 at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in :0 at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in :0 at Xamarin.Forms.Platform.iOS.PageRenderer.ViewDidLoad () [0x0007d] in :0 at (wrapper managed-to-native) ObjCRuntime.Messaging:IntPtr_objc_msgSendSuper (intptr,intptr) at UIKit.UIViewController.get_View () [0x00030] in /Users/builder/data/lanes/1381/3afb4af5/source/maccore/src/build/ios/native/UIKit/UIViewController.g.cs:2667
1)我将假设您看到的exception堆栈没有显示实际的底层错误,因为它来自Xamarin.iOS
生成的UILabel.g.cs
文件(这是https:// github中自动生成的包装器.com / xamarin / xamarin-macios )我个人有一些问题跟踪某些低级操作系统exception/抛出因此显示的exception有点(很多?)误导。
2)我再次假设,因为你说你是“从文件中加载字体” ,这些字体没有注册。 假设您通过CGFont.CreateFromProvider
从应用程序包中的文件(或动态下载)加载这些字体,并且由于它们不存在于UIAppFonts
键下的info.plist中,因此它们不会自动注册到iOS。 你需要自己做这个步骤:
NSError error; if (!CTFontManager.RegisterGraphicsFont(customFont, out error)) { // error occurred, checkout the contents of the NSError var }
在使用iOS字体管理器( CTFontManager
)注册CGFont之后,您可以在UIKit
实际使用它们,否则在iOS代码内部会有exception…需要编写一些ObjC / Swift来检查它在Xcode中看看是什么抛出的实际错误是……
您的字体是否已注册:
在exception之前但在CreateFromProvider
之后的某个地方,您可以执行以下操作:
foreach (var familyNames in UIFont.FamilyNames.OrderBy(c => c).ToList()) { D.WriteLine(" * " + familyNames); foreach (var familyName in UIFont.FontNamesForFamilyName(familyNames).OrderBy(c => c).ToList()) { D.WriteLine(" *-- " + familyName); } }
注意: D
只是using D = System.Diagnostics.Debug;
我敢打赌,你的字体不在列表中,但在调用CTFontManager.RegisterGraphicsFont
,它将在该列表中并且有效供UIKit
。
更新:
有趣的是,使用基于Swift的应用程序而不注册字体不会导致应用程序崩溃。 当然没有显示字体,但是通过UIFont(name: "XXXXX", size: 35)
引用它只是一个无声的失败。
因此,我只是建议您使用自定义字体进行一些防御性try{} catch{}
以确保安全。
Xamarin.iOS – 自定义字体
- iOS仅支持.TTF和.OTF字体类型。
- 将字体添加到’Resources / Fonts /’文件夹(任何文件夹都可以,但让它保持井井有条)。
- 右键单击添加的字体“属性”,将“复制到输出目录”更改为“始终复制”。
- 打开Info.plist文件,然后选择视图底部的“Source”。
- “添加新条目”,选择“应用程序提供的字体”。
- 输入字体’Fonts / FontName.ttf’的位置。
- 使用它:
lab1.Font = UIFont.FromName("FontName", 20f);
所有功劳都归功于迈克詹姆斯 – 自定义字体in-ios 。