fontDescriptorWithMatrix不工作

时间:2014-07-20 09:51:37

标签: ios objective-c uifont

我想更改UIFont属性,如基线或上限。 我试图做的是创建一个字体,获取它的描述符,更改它的矩阵,然后重新创建字体,但我找不到一种方法来做到这一点。

你能解释一下这段代码运行后“size”为(width = 0,height = 0)的原因:

UIFont *font = [UIFont fontWithName:@"Helvetica-Light" size:40];
UIFontDescriptor *descriptor = [font fontDescriptor];
CGAffineTransform matrix = descriptor.matrix;
descriptor = [descriptor fontDescriptorWithMatrix:matrix];
font = [UIFont fontWithDescriptor:descriptor size:40];

CGSize size = [@"bla bla" sizeWithAttributes:@{NSFontAttributeName:font}];

1 个答案:

答案 0 :(得分:1)

看起来代码中的以下行不会初始化矩阵对象:

UIFont *font = [UIFont fontWithName:@"Helvetica-Light" size:40];
UIFontDescriptor *descriptor = [font fontDescriptor];
CGAffineTransform matrix = descriptor.matrix;

CGAffineTransform变量的所有参数都设置为0.0。您必须独立创建有效的矩阵。如果以下列方式更改您的代码,它会给我一个大小:

UIFont *font = [UIFont fontWithName:@"Helvetica-Light" size:40];
UIFontDescriptor *descriptor = [font fontDescriptor];
CGAffineTransform matrix = CGAffineTransformMake(10.0, 10.0, 10.0, 10.0, 1.0, 1.0);

descriptor = [descriptor fontDescriptorWithMatrix:matrix];
font = [UIFont fontWithDescriptor:descriptor size:40];
CGSize size = [@"bla bla" sizeWithAttributes:@{NSFontAttributeName:font}];

NSLog(@"%@", NSStringFromCGSize(size));

控制台日志为: {1222.3999,459.99997}

UPD:

descriptor.matrix未设置,因为它只是UIFontDescriptor类提供的可选参数中的一个属性,它在Apple Docs上的说法如何:

  

UIFontDescriptor对象提供了一种用a来描述字体的机制   属性字典。   ...   ...属性字典中的所有属性都是可选的。

这意味着如果字体对象可以被其他参数描述,则无法设置某些参数。请参阅[UIFontDescriptor fontAttributes]以获取所有可用的参数。

由于descriptor.matrix未设置,因此CGAffineTransform结构没有描述转换,并将其添加到适当的UIFont对象中。

因此,如果要修改使用转换的字体对象,则必须手动设置矩阵。即矩阵应描述您想要应用于起始字体对象的修改。