《省钱达人》与《猎豆优选》UI相同版。域名tbk

MLLinkLabel.h 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. //
  2. // MLLinkLabel.h
  3. // MLLabel
  4. //
  5. // Created by molon on 15/6/6.
  6. // Copyright (c) 2015年 molon. All rights reserved.
  7. //
  8. #import "MLLabel.h"
  9. typedef NS_OPTIONS(NSUInteger, MLDataDetectorTypes) {
  10. MLDataDetectorTypeURL = 1 << 1, // 链接,不用link定义,是因为link作为统称
  11. MLDataDetectorTypePhoneNumber = 1 << 0, // 电话
  12. MLDataDetectorTypeNone = 0, // 禁用
  13. MLDataDetectorTypeAll = NSUIntegerMax, // 所有
  14. //上面4个和UIDataDetectorTypes的对应,下面是自己加的
  15. MLDataDetectorTypeEmail = 1 << 4, // 邮箱
  16. MLDataDetectorTypeUserHandle = 1 << 5, //@
  17. MLDataDetectorTypeHashtag = 1 << 6, //#..#
  18. //上面是个性化的匹配
  19. //这个是对attributedText里带有Link属性的检测,至于为什么31,预留上面空间以添加新的个性化
  20. //这个东西和dataDetectorTypesOfAttributedLinkValue对应起来,会对带有NSLinkAttributeName区间的value进行检测,匹配则给予对应的LinkType,找不到则为Other
  21. MLDataDetectorTypeAttributedLink = 1 << 31,
  22. };
  23. typedef NS_ENUM(NSUInteger, MLLinkType) {
  24. MLLinkTypeNone = 0,
  25. MLLinkTypeURL = 1, // 链接
  26. MLLinkTypePhoneNumber = 2, // 电话
  27. MLLinkTypeEmail = 3, // 邮箱
  28. MLLinkTypeUserHandle = 4, //@
  29. MLLinkTypeHashtag = 5, //#..#
  30. MLLinkTypeOther = 31, //这个一般是和MLDataDetectorTypeAttributedLink对应的,但是也可以自己随意添加啦,不过是一个标识而已,至于为什么31,随便定的,预留上面空间以添加新的个性化
  31. };
  32. #define kDefaultLinkColorForMLLinkLabel [UIColor colorWithRed:0.061 green:0.515 blue:0.862 alpha:1.000]
  33. #define kDefaultActiveLinkBackgroundColorForMLLinkLabel [UIColor colorWithWhite:0.215 alpha:0.300]
  34. @class MLLink,MLLinkLabel;
  35. @protocol MLLinkLabelDelegate <NSObject>
  36. - (void)didClickLink:(MLLink*)link linkText:(NSString*)linkText linkLabel:(MLLinkLabel*)linkLabel;
  37. @optional
  38. - (void)didLongPressLink:(MLLink*)link linkText:(NSString*)linkText linkLabel:(MLLinkLabel*)linkLabel;
  39. @end
  40. @interface MLLinkLabel : MLLabel
  41. //默认为MLDataDetectorTypeURL|MLDataDetectorTypePhoneNumber|MLDataDetectorTypeEmail|MLDataDetectorTypeAttributedLink,自动检测除了@和#话题的全部类型并且转换为链接
  42. @property (nonatomic, assign) MLDataDetectorTypes dataDetectorTypes;
  43. //这个是当dataDetectorTypes的MLDataDetectorTypeAttributedLink可用时候,自动对attributedText里Link属性value检测给予linkType的检测类型,默认为MLDataDetectorTypeNone,也就是默认最终得到的linkType为MLLinkTypeOther
  44. @property (nonatomic, assign) MLDataDetectorTypes dataDetectorTypesOfAttributedLinkValue;
  45. @property (nonatomic, strong) NSDictionary *linkTextAttributes;
  46. @property (nonatomic, strong) NSDictionary *activeLinkTextAttributes;
  47. //这个主要是为了不会在点击非常快速结束触摸的情况下,激活的链接样式基本没体现,这里的delay可以让其多体现那个一会,显得有反馈。
  48. //默认为0.3秒
  49. @property (nonatomic, assign) NSTimeInterval activeLinkToNilDelay;
  50. //是否允许在link内line break,默认为YES,即为允许,这样的话链接会能折行就折行和正常文本一样
  51. @property (nonatomic, assign) BOOL allowLineBreakInsideLinks;
  52. //优先级比delegate高
  53. @property (nonatomic, copy) void(^didClickLinkBlock)(MLLink *link,NSString *linkText,MLLinkLabel *label);
  54. @property (nonatomic, copy) void(^didLongPressLinkBlock)(MLLink *link,NSString *linkText,MLLinkLabel *label);
  55. @property (nonatomic, weak) id<MLLinkLabelDelegate> delegate; //这个优先级没有block高
  56. @property (nonatomic, strong, readonly) NSMutableArray *links; //可以遍历针对自定义
  57. /**
  58. * link在正式add之前可以自定义修改属性的block
  59. */
  60. @property (nonatomic, copy) void(^beforeAddLinkBlock)(MLLink *link);
  61. - (MLLink *)linkAtPoint:(CGPoint)location;
  62. /**
  63. * 设置文本后添加link。注意如果在此之后设置了text、attributedText、dataDetectorTypes或dataDetectorTypesOfAttributedLinkValue属性的话添加的link会丢失。
  64. */
  65. - (BOOL)addLink:(MLLink*)link;
  66. /**
  67. * 设置文本后添加link,注意如果在此之后设置了text、attributedText、dataDetectorTypes或dataDetectorTypesOfAttributedLinkValue属性的话添加的link会丢失。
  68. */
  69. - (MLLink*)addLinkWithType:(MLLinkType)type value:(NSString*)value range:(NSRange)range;
  70. /**
  71. * 设置文本后添加link,注意如果在此之后设置了text、attributedText、dataDetectorTypes或dataDetectorTypesOfAttributedLinkValue属性的话添加的link会丢失。
  72. */
  73. - (NSArray*)addLinks:(NSArray*)links;
  74. //下面俩是为了编写代码时候外部设置block时候不需要自定义名字了,方便。
  75. - (void)setDidClickLinkBlock:(void (^)(MLLink *link, NSString *linkText, MLLinkLabel *label))didClickLinkBlock;
  76. - (void)setDidLongPressLinkBlock:(void (^)(MLLink *link, NSString *linkText, MLLinkLabel *label))didLongPressLinkBlock;
  77. /**
  78. * 一般用在修改了某些link的样式属性之后效果不会立马启用,使用此方法可启用。
  79. */
  80. - (void)invalidateDisplayForLinks;
  81. @end
  82. @interface MLLink : NSObject
  83. @property (nonatomic, assign) MLLinkType linkType;
  84. @property (nonatomic, copy) NSString *linkValue;
  85. @property (readonly, nonatomic, assign) NSRange linkRange;
  86. //可以单独设置且覆盖label的三个参数
  87. @property (nonatomic, strong) NSDictionary *linkTextAttributes;
  88. @property (nonatomic, strong) NSDictionary *activeLinkTextAttributes;
  89. //初始化
  90. + (instancetype)linkWithType:(MLLinkType)type value:(NSString*)value range:(NSRange)range;
  91. + (instancetype)linkWithType:(MLLinkType)type value:(NSString*)value range:(NSRange)range linkTextAttributes:(NSDictionary*)linkTextAttributes activeLinkTextAttributes:(NSDictionary*)activeLinkTextAttributes;
  92. @property (nonatomic, copy) void(^didClickLinkBlock)(MLLink *link,NSString *linkText,MLLinkLabel *label);
  93. @property (nonatomic, copy) void(^didLongPressLinkBlock)(MLLink *link,NSString *linkText,MLLinkLabel *label);
  94. //下面俩是为了编写代码时候外部设置block时候不需要自定义名字了,方便。
  95. - (void)setDidClickLinkBlock:(void (^)(MLLink *link, NSString *linkText, MLLinkLabel *label))didClickLinkBlock;
  96. - (void)setDidLongPressLinkBlock:(void (^)(MLLink *link, NSString *linkText, MLLinkLabel *label))didLongPressLinkBlock;
  97. @end