关于字符串显示长度sizeWithFont要说几句

1、在iOS7之前,动态布局场景中,由于初始化UILable的大小与实际需要显示的文字内容有时候会冲突,简单一点讲UILable初始时设小了,文字过多显示不完,或者初始设置太大了,文字较少,显示效果过于空荡。

2、如何解决这个问题呢,一般需要用到NSString的两个相关方法:

– (CGSize)sizeWithFont:(UIFont *)font

– (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size

3、这两个方法相信很多人都不陌生,但在iOS7之后此类方法都已过期,官方不推荐使用,取而代之的对应两个方法为:

– (CGSize)sizeWithAttributes:(NSDictionary *)attrs

– (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context

4、这两个方法看起来就很复杂,往往我们习惯了以前的方式,就不愿意去换,然而xCode又总是报警告,很多强迫症患者肯定又无法接受,所以大家都烦,我只能说,呵呵….

5、好了不多扯淡,接下来对这两个方法做个解释,相信你就不会抗拒了:

– (CGSize)sizeWithAttributes:(NSDictionary *)attrs
这个方法其实只是比原方法功能更强大了,原方法只传字号,这里可以传各种参数通过一个字典写入,我不讲复杂了,只说一点:传个什么参数可以实现原方法同样的效果!

@{NSFontAttributeName:[UIFont systemFontOfSize:10]}? ?? ? 相当于原来的? ?? ? [UIFont systemFontOfSize:10]
sizeWithFont:[UIFont systemFontOfSize:10] ??等同于? ?sizeWithAttribute:@{NSFontAttributeName:[UIFont systemFontOfSize:10]}

– (CGRect)boundingRectWithSize:(CGSize)size options:(NSStringDrawingOptions)options attributes:(NSDictionary *)attributes context:(NSStringDrawingContext *)context
这里同样做个说明:

size 等同于 原来的size
options是个枚举值,一个个去试,换行用 NSStringDrawingUsesLineFragmentOrigin
attributes同样是将字体换成字典,同上类似:@{NSFontAttributeName:[UIFont systemFontOfSize:10]
context直接写nil

这样够简单了吧,懒人们!!

Leave a Reply