/***********************************************************************************
|
*
|
* The MIT License (MIT)
|
*
|
* Copyright (c) 2013 Matthew Styles
|
*
|
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
* this software and associated documentation files (the "Software"), to deal in
|
* the Software without restriction, including without limitation the rights to
|
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
* the Software, and to permit persons to whom the Software is furnished to do so,
|
* subject to the following conditions:
|
*
|
* The above copyright notice and this permission notice shall be included in all
|
* copies or substantial portions of the Software.
|
*
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
*
|
***********************************************************************************/
|
|
#import <UIKit/UIKit.h>
|
|
NS_ASSUME_NONNULL_BEGIN
|
|
/**
|
* Constants for identifying link types we can detect
|
*/
|
typedef NS_ENUM(NSUInteger, KILinkType)
|
{
|
/**
|
* Usernames starting with "@" token
|
*/
|
KILinkTypeUserHandle,
|
|
/**
|
* Hashtags starting with "#" token
|
*/
|
KILinkTypeHashtag,
|
|
/**
|
* URLs, http etc
|
*/
|
KILinkTypeURL,
|
};
|
|
/**
|
* Flags for specifying combinations of link types as a bitmask
|
*/
|
typedef NS_OPTIONS(NSUInteger, KILinkTypeOption)
|
{
|
/**
|
* No links
|
*/
|
KILinkTypeOptionNone = 0,
|
|
/**
|
* Specifies to include KILinkTypeUserHandle links
|
*/
|
KILinkTypeOptionUserHandle = 1 << KILinkTypeUserHandle,
|
|
/**
|
* Specifies to include KILinkTypeHashtag links
|
*/
|
KILinkTypeOptionHashtag = 1 << KILinkTypeHashtag,
|
|
/**
|
* Specifies to include KILinkTypeURL links
|
*/
|
KILinkTypeOptionURL = 1 << KILinkTypeURL,
|
|
/**
|
* Convenience contstant to include all link types
|
*/
|
KILinkTypeOptionAll = NSUIntegerMax,
|
};
|
|
|
@class KILabel;
|
|
/**
|
* Type for block that is called when a link is tapped
|
*
|
* @param label The KILabel in which the tap took place
|
* @param string Content of the link that was tapped, includes @ or # tokens
|
* @param range The range of the string within the label's text
|
*/
|
typedef void (^KILinkTapHandler)(KILabel *label, NSString *string, NSRange range);
|
|
extern NSString * const KILabelLinkTypeKey;
|
extern NSString * const KILabelRangeKey;
|
extern NSString * const KILabelLinkKey;
|
|
/**
|
* A UILabel subclass that highlights links, hashtags and usernames and enables response to user
|
* interactions with those links.
|
**/
|
IB_DESIGNABLE
|
@interface KILabel : UILabel <NSLayoutManagerDelegate>
|
|
/** ****************************************************************************************** **
|
* @name Setting the link detector
|
** ****************************************************************************************** **/
|
|
/**
|
* Enable/disable automatic detection of links, hashtags and usernames.
|
*/
|
@property (nonatomic, assign, getter = isAutomaticLinkDetectionEnabled) IBInspectable BOOL automaticLinkDetectionEnabled;
|
|
/**
|
* Specifies the combination of link types to detect. Default value is KILinkTypeAll.
|
*/
|
@property (nonatomic, assign) IBInspectable KILinkTypeOption linkDetectionTypes;
|
|
/**
|
* Set containing words to be ignored as links, hashtags or usernames.
|
*
|
* @discussion The comparison between the matches and the ignored words is case insensitive.
|
*/
|
@property (nullable, nonatomic, strong) NSSet *ignoredKeywords;
|
|
/** ****************************************************************************************** **
|
* @name Format & Appearance
|
** ****************************************************************************************** **/
|
|
/**
|
* The color used to highlight selected link background.
|
*
|
* @discussion The default value is (0.95, 0.95, 0.95, 1.0).
|
*/
|
@property (nullable, nonatomic, copy) IBInspectable UIColor *selectedLinkBackgroundColor;
|
|
/**
|
* Flag sets if the sytem appearance for URLs should be used (underlined + blue color). Default value is NO.
|
*/
|
@property (nonatomic, assign) IBInspectable BOOL systemURLStyle;
|
|
/**
|
* Get the current attributes for the given link type.
|
*
|
* @param linkType The link type to get the attributes.
|
* @return A dictionary of text attributes.
|
* @discussion Default attributes contain colored font using the tintColor color property.
|
*/
|
- (nullable NSDictionary*)attributesForLinkType:(KILinkType)linkType;
|
|
/**
|
* Set the text attributes for each link type.
|
*
|
* @param attributes The text attributes.
|
* @param linkType The link type.
|
* @discussion Default attributes contain colored font using the tintColor color property.
|
*/
|
- (void)setAttributes:(nullable NSDictionary*)attributes forLinkType:(KILinkType)linkType;
|
|
/** ****************************************************************************************** **
|
* @name Callbacks
|
** ****************************************************************************************** **/
|
|
/**
|
* Callback block for KILinkTypeUserHandle link tap.
|
**/
|
@property (nullable, nonatomic, copy) KILinkTapHandler userHandleLinkTapHandler;
|
|
/**
|
* Callback block for KILinkTypeHashtag link tap.
|
*/
|
@property (nullable, nonatomic, copy) KILinkTapHandler hashtagLinkTapHandler;
|
|
/**
|
* Callback block for KILinkTypeURL link tap.
|
*/
|
@property (nullable, nonatomic, copy) KILinkTapHandler urlLinkTapHandler;
|
|
/** ****************************************************************************************** **
|
* @name Geometry
|
** ****************************************************************************************** **/
|
|
/**
|
* Returns a dictionary of data about the link that it at the location. Returns nil if there is no link.
|
*
|
* A link dictionary contains the following keys:
|
*
|
* - **KILabelLinkTypeKey**, a TDLinkType that identifies the type of link.
|
* - **KILabelRangeKey**, the range of the link within the label text.
|
* - **KILabelLinkKey**, the link text. This could be an URL, handle or hashtag depending on the linkType value.
|
*
|
* @param point The point in the coordinates of the label view.
|
* @return A dictionary containing the link.
|
*/
|
- (nullable NSDictionary*)linkAtPoint:(CGPoint)point;
|
|
@end
|
|
NS_ASSUME_NONNULL_END
|