美文网首页
iOS13 UISegmentedControl关于setTit

iOS13 UISegmentedControl关于setTit

作者: 茄子星人 | 来源:发表于2019-11-27 15:47 被阅读0次

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

    以上。

    相关文章

      网友评论

          本文标题:iOS13 UISegmentedControl关于setTit

          本文链接:https://www.haomeiwen.com/subject/vkipwctx.html