首先,这里说的不是textLayer.contentsScale = [UIScreen mainScreen].scale;
问题。
帮朋友做一个视频中添加文字,并带有文字旋转缩放动效时,遇到了rootLayer放大时,加载在其上面的textLayer会模糊,特别是在放大倍数很大的情况下,模糊会很严重。查了一些资料,也没个头绪,后来就考虑把文字字体设置很大。
先来看下面的代码
CGFloat fontSize = [self adjustedFontSizeForText:textModel.textContent];
这是来算在某个区域里自适应的文字字体,当然除了这个值,我们还会限制最大字号。
CGFloat scaleValue = fontSize/textModel.textFontSize;
这个是后面做缩放动画要用的比例因子
CGSize contentSize = [textModel.textContent boundingRectWithSize:CGSizeMake(kContendWidth, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:textModel.textFontSize]}
context:nil].size;
计算textLayer宽高,以便后面实例化textLayer。
一组文字,处理组合缩放动画,如果直接按scaleValue去缩放的话,放大倍数越大越模糊,后来想了办法把字体设置到最大,比如最大的字体为120pt,我们可以加一个字体缩放比例因子
NSInteger scaleFactor = 120/textModel.textFontSize;
然后上面的处理也要改一下
CGFloat scaleValue = fontSize/textModel.textFontSize/scaleFactor;
CGSize contentSize = [textModel.textContent boundingRectWithSize:CGSizeMake(kContendWidth*scaleFactor, MAXFLOAT)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:textModel.textFontSize]}
context:nil].size;
textLayer.fontSize = textModel.textFontSize* scaleFactor;
这样的话,因为字体虽然变大了,但是scaleValue也相应的变小了,所以最终缩放动画不会受到影响,同时由于计算textLayer宽高时宽度也相应的变化了,所以不会出现单纯改变字体大小引起的换行问题。
最后得注意一点,我在实验中把这个scaleFactor设置了一个很大的数,会导致app运行中崩溃,所以这个因子尽量不要太大,设置一个合适的就行,后面看看有没有其他解决办法,如果小伙伴们有其他解决CATextLayer放大时模糊的方法,也可以告诉我。
网友评论