美文网首页iOS开发程序员富文本
iOS10.3系统以后(NSStrikethroughStyle

iOS10.3系统以后(NSStrikethroughStyle

作者: Eddiegooo | 来源:发表于2017-04-06 10:39 被阅读2454次

    在iOS10.3系统上, 删除线(NSStrikethroughStyleAttributeName)富文本不显示,确切的说是在字符串中间某一段文字添加删除线富文本会出现异常。这个可能是苹果系统的bug。

    iOS 10.3 系统以后,给 字符串中的某一段文字添加删除线富文本 是不可以的;

    中文整个字符串添加删除线富文本也不行,只要添加删除线富文本的字符串包含中文就是不行;

    先设置其中一部分字号(NSFontAttributeName)富文本,在一起设置删除线富文本也不行;

        NSMutableAttributedString *markingAttrStr = [[NSMutableAttributedString alloc] initWithString:markingPriceStr];
    //    [markingAttrStr addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:9.0f] range:NSMakeRange(0, 1)]; 必须要注释掉这个
        [markingAttrStr addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, markingPriceStr.length)];
        _markingPriceLab.attributedText = markingAttrStr;
    

    特别注意,这个人民币符号“¥”和“¥”的区别,前面那个就可以,后面直接切换成中文输入法的就不行。

    iOS 10.3以前可以正常显示

        NSString *marketPriceStr = [NSString stringWithFormat:@"¥%.2f", product.marketPrice];
        NSString *showStr = [NSString stringWithFormat:@"¥%.2f %@", product.goodsPrice, marketPriceStr];
        NSMutableAttributedString *showAttrStr = [[NSMutableAttributedString alloc] initWithString:showStr];
        NSRange range = [showStr rangeOfString:marketPriceStr options:NSBackwardsSearch];
        NSDictionary *attr = @{
                               NSFontAttributeName               : [UIFont systemFontOfSize:12],
                               NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid),
                               NSStrikethroughColorAttributeName : [UIColor colorWithRed:230 / 255.0f green:23 / 255.0f blue:115 / 255.0f alpha:1]
                               };
        [showAttrStr addAttributes:attr range:range];
        self.priceLabel.attributedText = showAttrStr;
    

    iOS 10.3上显示异常,需要在添加一个NSBaselineOffsetAttributeName属性才可以。

        NSString *marketPriceStr = [NSString stringWithFormat:@"¥%.2f", product.marketPrice];
        NSString *showStr = [NSString stringWithFormat:@"¥%.2f %@", product.goodsPrice, marketPriceStr];
        NSMutableAttributedString *showAttrStr = [[NSMutableAttributedString alloc] initWithString:showStr];
        NSRange range = [showStr rangeOfString:marketPriceStr options:NSBackwardsSearch];
        NSDictionary *attr = @{
                               NSFontAttributeName               : [UIFont systemFontOfSize:12],
                               NSStrikethroughStyleAttributeName : @(NSUnderlineStyleSingle | NSUnderlinePatternSolid),
                               NSBaselineOffsetAttributeName     : @(NSUnderlineStyleSingle),
                               NSStrikethroughColorAttributeName : [UIColor colorWithRed:230 / 255.0f green:23 / 255.0f blue:115 / 255.0f alpha:1]
                               };
        [showAttrStr addAttributes:attr range:range];
        self.priceLabel.attributedText = showAttrStr;
    

    注意:这个时候在模拟器上是可以的,真机上还是不行。原因就是你设置字符串中的某一段文字下划线富文本。 我的解决办法是:1、将原来的一个label 用两个label合成,单独设置富文本,好麻烦啊。2、添加一个View在要删除的字符串上面,替代下划线。也不太好。。

    朋友们有更好的解决办法没? 求告知,感激不尽啊。O(∩_∩)O谢谢!

    这样直接给某一字符串全体设置下划线富文本是可以的
            NSDictionary *attribtDic = @{
                                         NSStrikethroughStyleAttributeName:[NSNumber numberWithInteger:NSUnderlineStyleSingle],
                                         NSForegroundColorAttributeName:kSubTextFontColor1
                                         };
            NSMutableAttributedString *attribtStr   = [[NSMutableAttributedString alloc]initWithString:priceString attributes:attribtDic];
            self.priceLabel.attributedText  = attribtStr;
    
    这里也要说一下字符串中给某一个特定内容字符串设置富文本的方法,实质是查找这个字符串方法

    //先拿到要设置富文本字符串的位置 这里就是给showStr字符串里的marketPriceStr这些字设置富文本 NSRange range = [showStr rangeOfString:marketPriceStr options:NSBackwardsSearch]; 然后添加富文本 在这个找到的特殊位置 [showAttrStr addAttributes:attr range:range];

    还有UILabel显示文字问题

    UlLabel显示文字,可以选择NSLineBreakMode方式,也可以设置NSTextAlignment文字对齐方式。

    当你在UILabel 正上方设置一个控件,它们都是右对齐方式显示,这时候显示中文可能会出现不是特别右对齐的情况。
    解决办法:

    设置一下NSTextAlignment文字对齐方式,选择两端对齐方式即可:
    self.priceLabel.textAlignment = NSTextAlignmentJustified; //两端对齐

    相关文章

      网友评论

      • 花与少年_:这个博主说的这个方法可以用!!!
        http://www.jianshu.com/p/3190cda53039
        Eddiegooo:@卤小蛋蛋 额 我也测试过好多次了 不可以呢 难道还和版本有关? 见第一个评论 就在讨论不行额
        花与少年_:@Eddiegooo 我测试了呀,真机上可以呀,要保证字符串中没有中文符号
        Eddiegooo:添加这个属性NSBaselineOffsetAttributeName,模拟器上可以,真机上还是不可以。
        第二种方法也要用了两个Label实现额。
      • 静忘:赞一个 解决了刚遇到的问题 我还以为我的锅 10.3系统的锅
        Eddiegooo:@静忘 以前一个label可以解决的控件,现在要分开单独写了 这锅我们不背 😆😆
      • roylly:这个目前有结论了吗?是IOS10.3的bug吗?我也遇到了这个问题。目前只能用两个Label来解决显示部分内容有横线的问题。但这个终究不合适。如果横线出现在文字中间,就得用三个了。一起研究一下吧!
        Eddiegooo:@roylly 我现在也是用两个label一起显示 暂时没有别的办法 也没听说解决 我再看看哈
      • Abekkkkk:NSBackgroundColorAttributeName 这个属性我也遇到了类似的问题。10.3版本之后的无效。
        Eddiegooo:@Abe_BY 对是的 模拟器上正常 真机上不正常
        Abekkkkk:@Eddiegooo 模拟器上好像没事的,真机上出现的
        Eddiegooo:设置背景色吗? 我在模拟器上 10.3上可以 10.3.X 之后不可以了是吗?
      • b34a7a5b3dc8:使用NSBaselineOffsetAttributeName亲测真机和模拟器都可以,是不是value的关系,代码如下
        [attributeString addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
        [attributeString addAttribute:NSBaselineOffsetAttributeName value:@(NSUnderlineStyleNone) range:range];
        b34a7a5b3dc8:@Eddiegooo 不是哦,我是做的价格显示 目前售价+原价 原价需显示删除线,我这边确实可以正常显示的
        Eddiegooo:@泰迪要日天 你是不是设置的整个字符串的删除线富文本啊?? 我这边还是不行呢。。
        Eddiegooo:日天兄: 我的iOS 10.3(14E5239e)系统 ,按着你的这个设置富文本还是不能显示呢。只要是给字符串的某一部分设置删除线富文本 就不行呢。代码如下:
        NSString *str = @"ABCD";
        NSString *subStr = @"CD";
        NSRange range = [str rangeOfString:subStr options:NSBackwardsSearch];

        NSMutableAttributedString *muAttStr = [[NSMutableAttributedString alloc] initWithString:str];
        [muAttStr addAttribute:NSForegroundColorAttributeName value:[UIColor redColor] range:range];
        [muAttStr addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
        [muAttStr addAttribute:NSBaselineOffsetAttributeName value:@(NSUnderlineStyleNone) range:range];
        label.attributedText = muAttStr;

      本文标题:iOS10.3系统以后(NSStrikethroughStyle

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