iOS13 UISegmentedControl关于setTitleTextAttributes的实现似乎发生了变化

iOS13和以前的版本相比,UISegmentedControlsetTitleTextAttributes函数的内部实现方式发生了变化。

以代码为例:

- (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的内部实现已从原来的合并变成了覆盖。

以上。

你可能感兴趣的:(iOS13 UISegmentedControl关于setTitleTextAttributes的实现似乎发生了变化)