MLLinkLabel.h 6.5 KB

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