iOS13和以前的版本相比,UISegmentedControl
的setTitleTextAttributes
函数的内部实现方式发生了变化。
以代码为例:
- (void)setNeedNavigationBarWithSegment: (NSArray *)titleArray {
...
UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:titleArray];
[segment setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColor whiteColor]} forState:UIControlStateSelected];
[segment setTitleTextAttributes:@{NSForegroundColorAttributeName:[Color standardBlue]} forState:UIControlStateNormal];
...
}
我们在基类控制器中自行绘制头部视图,上述函数是一个快速构造头部带有UISegmentedControl
的头部视图,我们在快速构造函数中配置了segment
的选中文本颜色和普通状态文本颜色。
然后在一个特殊的控制器中我们需要配置segemnt
的字体大小小于我们默认的字体大小。
if ([self.titleView isKindOfClass:[UISegmentedControl class]]) {
UIFont *font = [UIFont systemFontOfSize:12];
NSMutableDictionary *normalAttributes = [NSMutableDictionary dictionary];
normalAttributes[NSFontAttributeName] = font;
[((UISegmentedControl *)self.titleView) setTitleTextAttributes:normalAttributes forState:UIControlStateNormal];
}
在iOS13以下的版本通过setTitleTextAttributes
函数配置相关属性时,上述代码对字体大小的修改能与更上面对字体颜色的修改共存。
而在iOS13中,setTitleTextAttributes
则会覆盖掉字体颜色,使得Segment
会显示默认的黑色文本。
于是就需要
UIFont *font = [UIFont systemFontOfSize:12];
NSMutableDictionary *normalAttributes = [NSMutableDictionary dictionary];
NSMutableDictionary *selectedAttributes = [NSMutableDictionary dictionary];
normalAttributes[NSFontAttributeName] = font;
normalAttributes[NSForegroundColorAttributeName] = [Color standardBlue];
selectedAttributes[NSFontAttributeName] = font;
selectedAttributes[NSForegroundColorAttributeName] = [UIColor whiteColor];
[((UISegmentedControl *)self.titleView) setTitleTextAttributes:normalAttributes forState:UIControlStateNormal];
[((UISegmentedControl *)self.titleView) setTitleTextAttributes:selectedAttributes forState:UIControlStateSelected];
重新配置所有属性,或者:
[((UISegmentedControl *)self.titleView) titleTextAttributesForState:<#(UIControlState)#>]
在配置参数前预先获取已有的参数字典。
联想到iOS13苹果官方对UISegmentedControl
的大动作修改,合理地通过Demo进行联想,setTitleTextAttributes
的内部实现已从原来的合并变成了覆盖。
以上。