在自定义Xamarin Forms iOS渲染器中,我正在从文件加载字体,当我到达UIFont.FromName时,它会消除下面显示的异常。 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 <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].SetElement (TElement element) [0x000cc] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementRenderer`1[TElement].Xamarin.Forms.Platform.iOS.IVisualElementRenderer.SetElement (Xamarin.Forms.VisualElement element) [0x00000] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.Platform.CreateRenderer (Xamarin.Forms.VisualElement element) [0x0001b] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementPackager.OnChildAdded (Xamarin.Forms.VisualElement view) [0x00000] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.VisualElementPackager.Load () [0x00023] in <filename unknown>:0
at Xamarin.Forms.Platform.iOS.PageRenderer.ViewDidLoad () [0x0007d] in <filename unknown>: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
答案 0 :(得分:5)
1)我将假设您看到的异常堆栈未显示实际的欠载错误,因为它来自Xamarin.iOS
生成的UILabel.g.cs
文件(即是https://github.com/xamarin/xamarin-macios中的一个自动生成的包装器,我个人有一些问题跟踪某些低级操作系统异常/抛出,因此显示的异常有点(很多?)误导。
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代码内部会有异常...需要写一些ObjC / Swift在Xcode中查看它,看看抛出的实际错误是什么......
在异常之前但在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{}
安全。
答案 1 :(得分:3)
Xamarin.iOS - 自定义字体
lab1.Font = UIFont.FromName("FontName", 20f);
所有功劳都归功于迈克詹姆斯 - custom-fonts-in-ios。
答案 2 :(得分:1)
添加到Eyal / Mike James答案中。使用正确的{
"speaker": {
"id": 2,
"name": "Rafael",
"email": "rafael.almeida@xing.com",
"company": "XING",
"avatar": "/rails/active_storage/blobs/eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaHBCdz09IiwiZXhwIjpudWxsLCJwdXIiOiJibG9iX2lkIn19--515a0de8817b3529b5d3d168871cebf6ccee0463/xing-photo.jpg"
}
}
很重要。如果打开字体文件信息,则可能会看到文件名与FontName
不同。
在下面的图像中,您可以看到文件名是Full Name
,但全名是FranklinGothicMedium.otf
。使用FranklinGothicURW-Med
时必须使用全名。