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

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

以代码为例:

- (void)setNeedNavigationBarWithSegment: (NSArray<NSString *> *)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的内部实现已从原来的合并变成了覆盖。

以上。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容