在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
第二种方法也要用了两个Label实现额。
[attributeString addAttribute:NSStrikethroughStyleAttributeName value:@(NSUnderlineStyleSingle) range:range];
[attributeString addAttribute:NSBaselineOffsetAttributeName value:@(NSUnderlineStyleNone) range:range];
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;