• css style、css color 转 UIColor


            你能看过来,就说明这个问题很好玩!IT开发是一个兴趣,更是一个挑战!兴趣使你工作有热情。挑战使让你工作充满刺激拉满的状态!我们日复一日年复一年的去撸代码,那些普普通通的功能代码,已经厌倦了!要的就是这种充满挑战最终攻克而带来快感!这种快感比那种快感让人感觉更得劲。。错了,可能是我老了吧~

            因为业务开发需求,同样的功能三端(WEB、安卓 、iOS),而web端将数据封装成H5对应的标签方式,需要APP端来解析,将其文本提取出来倒没有什么技术难度,但核心问题是要取出相应的样式表渲染成正确的UI,这才是最困难的!

    <span style="color:orange,font-size:15px;">重要告警span>

     要把它显示成如下的原生页面,怎么办呢?来分析一下这些标签的作用:

    1. 意思是将里面的文本加粗显示
    2. 标签普通的文本显示,但是文本的更多属性是在span的内联样式表中存放,我们要取出来颜色,字体大小来渲染为iOS的UILabel,通过setColor,setTextFont等API设置其显示样式!

    我得到的原始数据为:

    1. <a style="color:orange">【重要告警】a>
    2. <b>事件名称:b>CCE-CPU监控;
    3. <b>发生时间:b>2023-11-08 09:48:00 GMT+08:00;
    4. <b>事件源:b>AOM;
    5. <b>资源类型:b>Application;
    6. <b>指标名称:b>aom_container_cpu_usage;
    7. <b>最新指标值: b>45.95425;
    8. <b>命名空间:b>third-party;
    9. <b>容器名称:b>z-canal-test;
    10. <b>告警信息:b><br />阈值规则 CCE-CPU监控 状态从 “超限阈值” 变为 “正常” 。状态变化详细信息:指标名称为“aom_container_cpu_usage”,最新指标数据取值“45.954”,不满足阈值条件“>90”。;
    11. <b>修复建议:b>建议进入容器 z-canal-test查看资源使用情况;

    最终实现的显示效果为:

     

    下面业结合开源的三方库来实现此功能的显示,第三方库:TFHpple 

    1. #if __has_include("TFHpple.h")
    2. #import "TFHpple.h"
    3. #endif
    4. @interface CSSStyleMap : NSObject
    5. + (NSDictionary *)cssColorMap;
    6. #if __has_include("TFHpple.h")
    7. + (UIColor *)colorFromCssText:(NSString *)ctext;
    8. + (NSMutableArray <NSMutableDictionary *>*)stylesFromElement:(TFHppleElement *)e;
    9. #endif
    10. @end
    1. @implementation CSSStyleMap
    2. //将CSS定义的颜色转为十六进制颜色
    3. + (NSDictionary *)cssColorMap
    4. {
    5. NSString *k = @"{\
    6. \"CLEAR\": \"#00000000\",\
    7. \"TRANSPARENT\": \"#00000000\",\
    8. \"\": \"#00000000\",\
    9. \"ALICEBLUE\": \"#F0F8FF\",\
    10. \"ANTIQUEWHITE\": \"#FAEBD7\",\
    11. \"AQUA\": \"#00FFFF\",\
    12. \"AQUAMARINE\": \"#7FFFD4\",\
    13. \"AZURE\": \"#F0FFFF\",\
    14. \"BEIGE\": \"#F5F5DC\",\
    15. \"BISQUE\": \"#FFE4C4\",\
    16. \"BLACK\": \"#000000\",\
    17. \"BLANCHEDALMOND\": \"#FFEBCD\",\
    18. \"BLUE\": \"#0000FF\",\
    19. \"BLUEVIOLET\": \"#8A2BE2\",\
    20. \"BROWN\": \"#A52A2A\",\
    21. \"BURLYWOOD\": \"#DEB887\",\
    22. \"CADETBLUE\": \"#5F9EA0\",\
    23. \"CHARTREUSE\": \"#7FFF00\",\
    24. \"CHOCOLATE\": \"#D2691E\",\
    25. \"CORAL\": \"#FF7F50\",\
    26. \"CORNFLOWERBLUE\": \"#6495ED\",\
    27. \"CORNSILK\": \"#FFF8DC\",\
    28. \"CRIMSON\": \"#DC143C\",\
    29. \"CYAN\": \"#00FFFF\",\
    30. \"DARKBLUE\": \"#00008B\",\
    31. \"DARKCYAN\": \"#008B8B\",\
    32. \"DARKGOLDENROD\": \"#B8860B\",\
    33. \"DARKGRAY\": \"#A9A9A9\",\
    34. \"DARKGREY\": \"#A9A9A9\",\
    35. \"DARKGREEN\": \"#006400\",\
    36. \"DARKKHAKI\": \"#BDB76B\",\
    37. \"DARKMAGENTA\": \"#8B008B\",\
    38. \"DARKOLIVEGREEN\": \"#556B2F\",\
    39. \"DARKORANGE\": \"#FF8C00\",\
    40. \"DARKORCHID\": \"#9932CC\",\
    41. \"DARKRED\": \"#8B0000\",\
    42. \"DARKSALMON\": \"#E9967A\",\
    43. \"DARKSEAGREEN\": \"#8FBC8F\",\
    44. \"DARKSLATEBLUE\": \"#483D8B\",\
    45. \"DARKSLATEGRAY\": \"#2F4F4F\",\
    46. \"DARKSLATEGREY\": \"#2F4F4F\",\
    47. \"DARKTURQUOISE\": \"#00CED1\",\
    48. \"DARKVIOLET\": \"#9400D3\",\
    49. \"DEEPPINK\": \"#FF1493\",\
    50. \"DEEPSKYBLUE\": \"#00BFFF\",\
    51. \"DIMGRAY\": \"#696969\",\
    52. \"DIMGREY\": \"#696969\",\
    53. \"DODGERBLUE\": \"#1E90FF\",\
    54. \"FIREBRICK\": \"#B22222\",\
    55. \"FLORALWHITE\": \"#FFFAF0\",\
    56. \"FORESTGREEN\": \"#228B22\",\
    57. \"FUCHSIA\": \"#FF00FF\",\
    58. \"GAINSBORO\": \"#DCDCDC\",\
    59. \"GHOSTWHITE\": \"#F8F8FF\",\
    60. \"GOLD\": \"#FFD700\",\
    61. \"GOLDENROD\": \"#DAA520\",\
    62. \"GRAY\": \"#808080\",\
    63. \"GREY\": \"#808080\",\
    64. \"GREEN\": \"#008000\",\
    65. \"GREENYELLOW\": \"#ADFF2F\",\
    66. \"HONEYDEW\": \"#F0FFF0\",\
    67. \"HOTPINK\": \"#FF69B4\",\
    68. \"INDIANRED\": \"#CD5C5C\",\
    69. \"INDIGO\": \"#4B0082\",\
    70. \"IVORY\": \"#FFFFF0\",\
    71. \"KHAKI\": \"#F0E68C\",\
    72. \"LAVENDER\": \"#E6E6FA\",\
    73. \"LAVENDERBLUSH\": \"#FFF0F5\",\
    74. \"LAWNGREEN\": \"#7CFC00\",\
    75. \"LEMONCHIFFON\": \"#FFFACD\",\
    76. \"LIGHTBLUE\": \"#ADD8E6\",\
    77. \"LIGHTCORAL\": \"#F08080\",\
    78. \"LIGHTCYAN\": \"#E0FFFF\",\
    79. \"LIGHTGOLDENRODYELLOW\": \"#FAFAD2\",\
    80. \"LIGHTGRAY\": \"#D3D3D3\",\
    81. \"LIGHTGREY\": \"#D3D3D3\",\
    82. \"LIGHTGREEN\": \"#90EE90\",\
    83. \"LIGHTPINK\": \"#FFB6C1\",\
    84. \"LIGHTSALMON\": \"#FFA07A\",\
    85. \"LIGHTSEAGREEN\": \"#20B2AA\",\
    86. \"LIGHTSKYBLUE\": \"#87CEFA\",\
    87. \"LIGHTSLATEGRAY\": \"#778899\",\
    88. \"LIGHTSLATEGREY\": \"#778899\",\
    89. \"LIGHTSTEELBLUE\": \"#B0C4DE\",\
    90. \"LIGHTYELLOW\": \"#FFFFE0\",\
    91. \"LIME\": \"#00FF00\",\
    92. \"LIMEGREEN\": \"#32CD32\",\
    93. \"LINEN\": \"#FAF0E6\",\
    94. \"MAGENTA\": \"#FF00FF\",\
    95. \"MAROON\": \"#800000\",\
    96. \"MEDIUMAQUAMARINE\": \"#66CDAA\",\
    97. \"MEDIUMBLUE\": \"#0000CD\",\
    98. \"MEDIUMORCHID\": \"#BA55D3\",\
    99. \"MEDIUMPURPLE\": \"#9370DB\",\
    100. \"MEDIUMSEAGREEN\": \"#3CB371\",\
    101. \"MEDIUMSLATEBLUE\": \"#7B68EE\",\
    102. \"MEDIUMSPRINGGREEN\": \"#00FA9A\",\
    103. \"MEDIUMTURQUOISE\": \"#48D1CC\",\
    104. \"MEDIUMVIOLETRED\": \"#C71585\",\
    105. \"MIDNIGHTBLUE\": \"#191970\",\
    106. \"MINTCREAM\": \"#F5FFFA\",\
    107. \"MISTYROSE\": \"#FFE4E1\",\
    108. \"MOCCASIN\": \"#FFE4B5\",\
    109. \"NAVAJOWHITE\": \"#FFDEAD\",\
    110. \"NAVY\": \"#000080\",\
    111. \"OLDLACE\": \"#FDF5E6\",\
    112. \"OLIVE\": \"#808000\",\
    113. \"OLIVEDRAB\": \"#6B8E23\",\
    114. \"ORANGE\": \"#FFA500\",\
    115. \"ORANGERED\": \"#FF4500\",\
    116. \"ORCHID\": \"#DA70D6\",\
    117. \"PALEGOLDENROD\": \"#EEE8AA\",\
    118. \"PALEGREEN\": \"#98FB98\",\
    119. \"PALETURQUOISE\": \"#AFEEEE\",\
    120. \"PALEVIOLETRED\": \"#DB7093\",\
    121. \"PAPAYAWHIP\": \"#FFEFD5\",\
    122. \"PEACHPUFF\": \"#FFDAB9\",\
    123. \"PERU\": \"#CD853F\",\
    124. \"PINK\": \"#FFC0CB\",\
    125. \"PLUM\": \"#DDA0DD\",\
    126. \"POWDERBLUE\": \"#B0E0E6\",\
    127. \"PURPLE\": \"#800080\",\
    128. \"RED\": \"#FF0000\",\
    129. \"ROSYBROWN\": \"#BC8F8F\",\
    130. \"ROYALBLUE\": \"#4169E1\",\
    131. \"SADDLEBROWN\": \"#8B4513\",\
    132. \"SALMON\": \"#FA8072\",\
    133. \"SANDYBROWN\": \"#F4A460\",\
    134. \"SEAGREEN\": \"#2E8B57\",\
    135. \"SEASHELL\": \"#FFF5EE\",\
    136. \"SIENNA\": \"#A0522D\",\
    137. \"SILVER\": \"#C0C0C0\",\
    138. \"SKYBLUE\": \"#87CEEB\",\
    139. \"SLATEBLUE\": \"#6A5ACD\",\
    140. \"SLATEGRAY\": \"#708090\",\
    141. \"SLATEGREY\": \"#708090\",\
    142. \"SNOW\": \"#FFFAFA\",\
    143. \"SPRINGGREEN\": \"#00FF7F\",\
    144. \"STEELBLUE\": \"#4682B4\",\
    145. \"TAN\": \"#D2B48C\",\
    146. \"TEAL\": \"#008080\",\
    147. \"THISTLE\": \"#D8BFD8\",\
    148. \"TOMATO\": \"#FF6347\",\
    149. \"TURQUOISE\": \"#40E0D0\",\
    150. \"VIOLET\": \"#EE82EE\",\
    151. \"WHEAT\": \"#F5DEB3\",\
    152. \"WHITE\": \"#FFFFFF\",\
    153. \"WHITESMOKE\": \"#F5F5F5\",\
    154. \"YELLOW\": \"#FFFF00\",\
    155. \"YELLOWGREEN\": \"#9ACD32\"\
    156. }";
    157. NSDictionary *map = [JsonKit jsonObject:k];
    158. return map;
    159. }
    160. #if __has_include("TFHpple.h")
    161. + (UIColor *)colorFromCssText:(NSString *)val
    162. {
    163. NSString *cl = [[CSSStyleMap cssColorMap] stringForKey:val];
    164. UIColor *color = nil;
    165. if (cl.length > 0)
    166. {
    167. color = [UIColor colorFromHex:cl];
    168. }
    169. else
    170. {
    171. val = [val stringByReplacingOccurrencesOfString:@"rgba(" withString:@""];
    172. val = [val stringByReplacingOccurrencesOfString:@"rgb(" withString:@""];
    173. val = [val stringByReplacingOccurrencesOfString:@")" withString:@""];
    174. NSArray *zlist = [val componentsSeparatedByString:@","];
    175. if (zlist.count >= 3)
    176. {
    177. color = [UIColor colorWithRed:[zlist[0] doubleValue]/255.0 green:[zlist[1] doubleValue]/255.0 blue:[zlist[2] doubleValue]/255.0 alpha:zlist.count>3?[zlist[3] doubleValue]:1];
    178. }
    179. }
    180. return color;
    181. }
    182. + (NSMutableArray <NSMutableDictionary *>*)stylesFromElement:(TFHppleElement *)e
    183. {
    184. NSString *b = [e content];
    185. NSArray <TFHppleElement *> *child = [e children];
    186. NSMutableArray *attributesList = [NSMutableArray arrayWithCapacity:0];
    187. [child enumerateObjectsUsingBlock:^(TFHppleElement * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
    188. if (![obj isTextNode])
    189. {
    190. /*企管只关注CSS样式中的color,backgroudColor,fontSize这三个属性,其余根据后期要求再解析展示
    191. CSS对于样式的定义为:color:orange,font-size:16px,background-color:xxx
    192. */
    193. NSDictionary *attrMap = [obj attributes];
    194. [attrMap enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop)
    195. {
    196. if (obj && [obj isKindOfClass:[NSString class]])
    197. {
    198. NSArray *plist = [obj componentsSeparatedByString:@","];
    199. [plist enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
    200. {
    201. NSArray *xlist = [obj componentsSeparatedByString:@":"];
    202. if ([xlist.firstObject isEqualToString:@"color"])
    203. {
    204. NSString *val = [[xlist lastObject] uppercaseString];
    205. UIColor *color = [CSSStyleMap colorFromCssText:val];
    206. if (color)
    207. {
    208. [attributesList addObject:@{@"fontColor":color,@"range":[NSValue valueWithRange:NSMakeRange(0, b.length)]}];
    209. }
    210. }
    211. else if ([xlist.firstObject isEqualToString:@"background-color"])
    212. {
    213. NSString *val = [[xlist lastObject] uppercaseString];
    214. UIColor *color = [CSSStyleMap colorFromCssText:val];
    215. if (color)
    216. {
    217. [attributesList addObject:@{@"backgroundColor":color,@"range":[NSValue valueWithRange:NSMakeRange(0, b.length)]}];
    218. }
    219. }
    220. else if ([xlist.firstObject isEqualToString:@"font-size"])
    221. {
    222. NSInteger val = [[xlist lastObject] integerValue];
    223. [attributesList addObject:@{@"fontSize":intToStr(val),@"range":[NSValue valueWithRange:NSMakeRange(0, b.length)]}];
    224. }
    225. }];
    226. }
    227. }];
    228. }
    229. }];
    230. return attributesList;
    231. }
    232. #endif
    233. @end

     页面使用:

    1. NSData *tdata = [cnt dataUsingEncoding:NSUTF8StringEncoding];
    2. TFHpple *doc = [[TFHpple alloc] initWithHTMLData:tdata];
    3. TFHppleElement *e = [[doc searchWithXPathQuery:@"//b"] firstObject];
    4. //包含解析出来的样式数据列表
    5. NSMutableArray <NSMutableDictionary *>*styleList = [CSSStyleMap stylesFromElement:e];

     

    1. //加粗
    2. NSMutableArray <NSValue *>*btagList = [rMap arrayForKey:@"bTag"];
    3. //a标签,跳转
    4. NSMutableArray <NSDictionary *>*atagList = [rMap arrayForKey:@"aTag"];
    5. //CSS样式
    6. NSMutableArray <NSDictionary *>*styleList = [rMap arrayForKey:@"style"];
    7. //textView是定义的UITextView的实例对象
    8. NSMutableAttributedString *mtext = [[NSMutableAttributedString alloc] initWithAttributedString:textView.attributedText];
    9. NSString *textStr = mtext.string;
    10. // NSArray *ranges = [self mutableRangeOfString:@"®[^\\s]+" targetString:textStr];
    11. [btagList enumerateObjectsUsingBlock:^(NSValue *a, NSUInteger idx, BOOL * _Nonnull stop)
    12. {
    13. [mtext addAttribute:NSFontAttributeName value:[UIFont boldSystemFontOfSize:imTextFont(16)] range:a.rangeValue];
    14. }];
    15. [atagList enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
    16. {
    17. NSRange range = [(NSValue *)[obj objectForKey:@"range"] rangeValue];
    18. [mtext addAttribute:NSForegroundColorAttributeName value:[UIColor colorFromHex:@"#0000ee"] range:range];
    19. [mtext addAttribute:NSLinkTag value:[obj stringForKey:@"href"] range:range];
    20. }];
    21. [styleList enumerateObjectsUsingBlock:^(NSDictionary * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop)
    22. {
    23. UIColor *fcolor = [obj objectForKey:@"fontColor"];
    24. NSRange range = [(NSValue *)[obj objectForKey:@"range"] rangeValue];
    25. [mtext addAttribute:NSForegroundColorAttributeName value:fcolor range:range];
    26. }];
    27. [textView setAttributedText:mtext];

     

    这个示例只是展示其中一部分逻辑,你可以进行二次开发,扩展其功能,支持更多的属性的展示!

    对了,肯定会有人说使用Webview直接加载就行了嘛,兄弟,我使用的场景是会话页面,你使用webview加载,就会存在性能体验问题!如果你全页面只有一个这样的消息,当然首选就是Webview,而我的页面如下,就不得不考虑用户体验!

  • 相关阅读:
    biocParallel学习
    小班中班,随机10以内加法练习题,A4纸可直接打印
    SpringMVC
    ElasticSearch系列——Elasticsearch Java API Client
    map和set
    Java之stream流的详细解析
    springboot实现redisson分布式锁案例
    typedef的四种用法
    oracle 执行计划查看常用sql
    信息化、数字化时代的变局,商业智能BI未来发展前景如何?
  • 原文地址:https://blog.csdn.net/yunhuaikong/article/details/134317079