New file |
| | |
| | | // |
| | | // YYTextAttribute.h |
| | | // YYText <https://github.com/ibireme/YYText> |
| | | // |
| | | // Created by ibireme on 14/10/26. |
| | | // Copyright (c) 2015 ibireme. |
| | | // |
| | | // This source code is licensed under the MIT-style license found in the |
| | | // LICENSE file in the root directory of this source tree. |
| | | // |
| | | |
| | | #import <UIKit/UIKit.h> |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | #pragma mark - Enum Define |
| | | |
| | | /// The attribute type |
| | | typedef NS_OPTIONS(NSInteger, YYTextAttributeType) { |
| | | YYTextAttributeTypeNone = 0, |
| | | YYTextAttributeTypeUIKit = 1 << 0, ///< UIKit attributes, such as UILabel/UITextField/drawInRect. |
| | | YYTextAttributeTypeCoreText = 1 << 1, ///< CoreText attributes, used by CoreText. |
| | | YYTextAttributeTypeYYText = 1 << 2, ///< YYText attributes, used by YYText. |
| | | }; |
| | | |
| | | /// Get the attribute type from an attribute name. |
| | | extern YYTextAttributeType YYTextAttributeGetType(NSString *attributeName); |
| | | |
| | | /** |
| | | Line style in YYText (similar to NSUnderlineStyle). |
| | | */ |
| | | typedef NS_OPTIONS (NSInteger, YYTextLineStyle) { |
| | | // basic style (bitmask:0xFF) |
| | | YYTextLineStyleNone = 0x00, ///< ( ) Do not draw a line (Default). |
| | | YYTextLineStyleSingle = 0x01, ///< (──────) Draw a single line. |
| | | YYTextLineStyleThick = 0x02, ///< (━━━━━━━) Draw a thick line. |
| | | YYTextLineStyleDouble = 0x09, ///< (══════) Draw a double line. |
| | | |
| | | // style pattern (bitmask:0xF00) |
| | | YYTextLineStylePatternSolid = 0x000, ///< (────────) Draw a solid line (Default). |
| | | YYTextLineStylePatternDot = 0x100, ///< (‑ ‑ ‑ ‑ ‑ ‑) Draw a line of dots. |
| | | YYTextLineStylePatternDash = 0x200, ///< (— — — —) Draw a line of dashes. |
| | | YYTextLineStylePatternDashDot = 0x300, ///< (— ‑ — ‑ — ‑) Draw a line of alternating dashes and dots. |
| | | YYTextLineStylePatternDashDotDot = 0x400, ///< (— ‑ ‑ — ‑ ‑) Draw a line of alternating dashes and two dots. |
| | | YYTextLineStylePatternCircleDot = 0x900, ///< (••••••••••••) Draw a line of small circle dots. |
| | | }; |
| | | |
| | | /** |
| | | Text vertical alignment. |
| | | */ |
| | | typedef NS_ENUM(NSInteger, YYTextVerticalAlignment) { |
| | | YYTextVerticalAlignmentTop = 0, ///< Top alignment. |
| | | YYTextVerticalAlignmentCenter = 1, ///< Center alignment. |
| | | YYTextVerticalAlignmentBottom = 2, ///< Bottom alignment. |
| | | }; |
| | | |
| | | /** |
| | | The direction define in YYText. |
| | | */ |
| | | typedef NS_OPTIONS(NSUInteger, YYTextDirection) { |
| | | YYTextDirectionNone = 0, |
| | | YYTextDirectionTop = 1 << 0, |
| | | YYTextDirectionRight = 1 << 1, |
| | | YYTextDirectionBottom = 1 << 2, |
| | | YYTextDirectionLeft = 1 << 3, |
| | | }; |
| | | |
| | | /** |
| | | The trunction type, tells the truncation engine which type of truncation is being requested. |
| | | */ |
| | | typedef NS_ENUM (NSUInteger, YYTextTruncationType) { |
| | | /// No truncate. |
| | | YYTextTruncationTypeNone = 0, |
| | | |
| | | /// Truncate at the beginning of the line, leaving the end portion visible. |
| | | YYTextTruncationTypeStart = 1, |
| | | |
| | | /// Truncate at the end of the line, leaving the start portion visible. |
| | | YYTextTruncationTypeEnd = 2, |
| | | |
| | | /// Truncate in the middle of the line, leaving both the start and the end portions visible. |
| | | YYTextTruncationTypeMiddle = 3, |
| | | }; |
| | | |
| | | |
| | | |
| | | #pragma mark - Attribute Name Defined in YYText |
| | | |
| | | /// The value of this attribute is a `YYTextBackedString` object. |
| | | /// Use this attribute to store the original plain text if it is replaced by something else (such as attachment). |
| | | UIKIT_EXTERN NSString *const YYTextBackedStringAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextBinding` object. |
| | | /// Use this attribute to bind a range of text together, as if it was a single charactor. |
| | | UIKIT_EXTERN NSString *const YYTextBindingAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextShadow` object. |
| | | /// Use this attribute to add shadow to a range of text. |
| | | /// Shadow will be drawn below text glyphs. Use YYTextShadow.subShadow to add multi-shadow. |
| | | UIKIT_EXTERN NSString *const YYTextShadowAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextShadow` object. |
| | | /// Use this attribute to add inner shadow to a range of text. |
| | | /// Inner shadow will be drawn above text glyphs. Use YYTextShadow.subShadow to add multi-shadow. |
| | | UIKIT_EXTERN NSString *const YYTextInnerShadowAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextDecoration` object. |
| | | /// Use this attribute to add underline to a range of text. |
| | | /// The underline will be drawn below text glyphs. |
| | | UIKIT_EXTERN NSString *const YYTextUnderlineAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextDecoration` object. |
| | | /// Use this attribute to add strikethrough (delete line) to a range of text. |
| | | /// The strikethrough will be drawn above text glyphs. |
| | | UIKIT_EXTERN NSString *const YYTextStrikethroughAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextBorder` object. |
| | | /// Use this attribute to add cover border or cover color to a range of text. |
| | | /// The border will be drawn above the text glyphs. |
| | | UIKIT_EXTERN NSString *const YYTextBorderAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextBorder` object. |
| | | /// Use this attribute to add background border or background color to a range of text. |
| | | /// The border will be drawn below the text glyphs. |
| | | UIKIT_EXTERN NSString *const YYTextBackgroundBorderAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextBorder` object. |
| | | /// Use this attribute to add a code block border to one or more line of text. |
| | | /// The border will be drawn below the text glyphs. |
| | | UIKIT_EXTERN NSString *const YYTextBlockBorderAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextAttachment` object. |
| | | /// Use this attribute to add attachment to text. |
| | | /// It should be used in conjunction with a CTRunDelegate. |
| | | UIKIT_EXTERN NSString *const YYTextAttachmentAttributeName; |
| | | |
| | | /// The value of this attribute is a `YYTextHighlight` object. |
| | | /// Use this attribute to add a touchable highlight state to a range of text. |
| | | UIKIT_EXTERN NSString *const YYTextHighlightAttributeName; |
| | | |
| | | /// The value of this attribute is a `NSValue` object stores CGAffineTransform. |
| | | /// Use this attribute to add transform to each glyph in a range of text. |
| | | UIKIT_EXTERN NSString *const YYTextGlyphTransformAttributeName; |
| | | |
| | | |
| | | |
| | | #pragma mark - String Token Define |
| | | |
| | | UIKIT_EXTERN NSString *const YYTextAttachmentToken; ///< Object replacement character (U+FFFC), used for text attachment. |
| | | UIKIT_EXTERN NSString *const YYTextTruncationToken; ///< Horizontal ellipsis (U+2026), used for text truncation "…". |
| | | |
| | | |
| | | |
| | | #pragma mark - Attribute Value Define |
| | | |
| | | /** |
| | | The tap/long press action callback defined in YYText. |
| | | |
| | | @param containerView The text container view (such as YYLabel/YYTextView). |
| | | @param text The whole text. |
| | | @param range The text range in `text` (if no range, the range.location is NSNotFound). |
| | | @param rect The text frame in `containerView` (if no data, the rect is CGRectNull). |
| | | */ |
| | | typedef void(^YYTextAction)(UIView *containerView, NSAttributedString *text, NSRange range, CGRect rect); |
| | | |
| | | |
| | | /** |
| | | YYTextBackedString objects are used by the NSAttributedString class cluster |
| | | as the values for text backed string attributes (stored in the attributed |
| | | string under the key named YYTextBackedStringAttributeName). |
| | | |
| | | It may used for copy/paste plain text from attributed string. |
| | | Example: If :) is replace by a custom emoji (such as😊), the backed string can be set to @":)". |
| | | */ |
| | | @interface YYTextBackedString : NSObject <NSCoding, NSCopying> |
| | | + (instancetype)stringWithString:(nullable NSString *)string; |
| | | @property (nullable, nonatomic, copy) NSString *string; ///< backed string |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextBinding objects are used by the NSAttributedString class cluster |
| | | as the values for shadow attributes (stored in the attributed string under |
| | | the key named YYTextBindingAttributeName). |
| | | |
| | | Add this to a range of text will make the specified characters 'binding together'. |
| | | YYTextView will treat the range of text as a single character during text |
| | | selection and edit. |
| | | */ |
| | | @interface YYTextBinding : NSObject <NSCoding, NSCopying> |
| | | + (instancetype)bindingWithDeleteConfirm:(BOOL)deleteConfirm; |
| | | @property (nonatomic) BOOL deleteConfirm; ///< confirm the range when delete in YYTextView |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextShadow objects are used by the NSAttributedString class cluster |
| | | as the values for shadow attributes (stored in the attributed string under |
| | | the key named YYTextShadowAttributeName or YYTextInnerShadowAttributeName). |
| | | |
| | | It's similar to `NSShadow`, but offers more options. |
| | | */ |
| | | @interface YYTextShadow : NSObject <NSCoding, NSCopying> |
| | | + (instancetype)shadowWithColor:(nullable UIColor *)color offset:(CGSize)offset radius:(CGFloat)radius; |
| | | |
| | | @property (nullable, nonatomic, strong) UIColor *color; ///< shadow color |
| | | @property (nonatomic) CGSize offset; ///< shadow offset |
| | | @property (nonatomic) CGFloat radius; ///< shadow blur radius |
| | | @property (nonatomic) CGBlendMode blendMode; ///< shadow blend mode |
| | | @property (nullable, nonatomic, strong) YYTextShadow *subShadow; ///< a sub shadow which will be added above the parent shadow |
| | | |
| | | + (instancetype)shadowWithNSShadow:(NSShadow *)nsShadow; ///< convert NSShadow to YYTextShadow |
| | | - (NSShadow *)nsShadow; ///< convert YYTextShadow to NSShadow |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextDecorationLine objects are used by the NSAttributedString class cluster |
| | | as the values for decoration line attributes (stored in the attributed string under |
| | | the key named YYTextUnderlineAttributeName or YYTextStrikethroughAttributeName). |
| | | |
| | | When it's used as underline, the line is drawn below text glyphs; |
| | | when it's used as strikethrough, the line is drawn above text glyphs. |
| | | */ |
| | | @interface YYTextDecoration : NSObject <NSCoding, NSCopying> |
| | | + (instancetype)decorationWithStyle:(YYTextLineStyle)style; |
| | | + (instancetype)decorationWithStyle:(YYTextLineStyle)style width:(nullable NSNumber *)width color:(nullable UIColor *)color; |
| | | @property (nonatomic) YYTextLineStyle style; ///< line style |
| | | @property (nullable, nonatomic, strong) NSNumber *width; ///< line width (nil means automatic width) |
| | | @property (nullable, nonatomic, strong) UIColor *color; ///< line color (nil means automatic color) |
| | | @property (nullable, nonatomic, strong) YYTextShadow *shadow; ///< line shadow |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextBorder objects are used by the NSAttributedString class cluster |
| | | as the values for border attributes (stored in the attributed string under |
| | | the key named YYTextBorderAttributeName or YYTextBackgroundBorderAttributeName). |
| | | |
| | | It can be used to draw a border around a range of text, or draw a background |
| | | to a range of text. |
| | | |
| | | Example: |
| | | ╭──────╮ |
| | | │ Text │ |
| | | ╰──────╯ |
| | | */ |
| | | @interface YYTextBorder : NSObject <NSCoding, NSCopying> |
| | | + (instancetype)borderWithLineStyle:(YYTextLineStyle)lineStyle lineWidth:(CGFloat)width strokeColor:(nullable UIColor *)color; |
| | | + (instancetype)borderWithFillColor:(nullable UIColor *)color cornerRadius:(CGFloat)cornerRadius; |
| | | @property (nonatomic) YYTextLineStyle lineStyle; ///< border line style |
| | | @property (nonatomic) CGFloat strokeWidth; ///< border line width |
| | | @property (nullable, nonatomic, strong) UIColor *strokeColor; ///< border line color |
| | | @property (nonatomic) CGLineJoin lineJoin; ///< border line join |
| | | @property (nonatomic) UIEdgeInsets insets; ///< border insets for text bounds |
| | | @property (nonatomic) CGFloat cornerRadius; ///< border corder radius |
| | | @property (nullable, nonatomic, strong) YYTextShadow *shadow; ///< border shadow |
| | | @property (nullable, nonatomic, strong) UIColor *fillColor; ///< inner fill color |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextAttachment objects are used by the NSAttributedString class cluster |
| | | as the values for attachment attributes (stored in the attributed string under |
| | | the key named YYTextAttachmentAttributeName). |
| | | |
| | | When display an attributed string which contains `YYTextAttachment` object, |
| | | the content will be placed in text metric. If the content is `UIImage`, |
| | | then it will be drawn to CGContext; if the content is `UIView` or `CALayer`, |
| | | then it will be added to the text container's view or layer. |
| | | */ |
| | | @interface YYTextAttachment : NSObject<NSCoding, NSCopying> |
| | | + (instancetype)attachmentWithContent:(nullable id)content; |
| | | @property (nullable, nonatomic, strong) id content; ///< Supported type: UIImage, UIView, CALayer |
| | | @property (nonatomic) UIViewContentMode contentMode; ///< Content display mode. |
| | | @property (nonatomic) UIEdgeInsets contentInsets; ///< The insets when drawing content. |
| | | @property (nullable, nonatomic, strong) NSDictionary *userInfo; ///< The user information dictionary. |
| | | @end |
| | | |
| | | |
| | | /** |
| | | YYTextHighlight objects are used by the NSAttributedString class cluster |
| | | as the values for touchable highlight attributes (stored in the attributed string |
| | | under the key named YYTextHighlightAttributeName). |
| | | |
| | | When display an attributed string in `YYLabel` or `YYTextView`, the range of |
| | | highlight text can be toucheds down by users. If a range of text is turned into |
| | | highlighted state, the `attributes` in `YYTextHighlight` will be used to modify |
| | | (set or remove) the original attributes in the range for display. |
| | | */ |
| | | @interface YYTextHighlight : NSObject <NSCoding, NSCopying> |
| | | |
| | | /** |
| | | Attributes that you can apply to text in an attributed string when highlight. |
| | | Key: Same as CoreText/YYText Attribute Name. |
| | | Value: Modify attribute value when highlight (NSNull for remove attribute). |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSDictionary<NSString *, id> *attributes; |
| | | |
| | | /** |
| | | Creates a highlight object with specified attributes. |
| | | |
| | | @param attributes The attributes which will replace original attributes when highlight, |
| | | If the value is NSNull, it will removed when highlight. |
| | | */ |
| | | + (instancetype)highlightWithAttributes:(nullable NSDictionary<NSString *, id> *)attributes; |
| | | |
| | | /** |
| | | Convenience methods to create a default highlight with the specifeid background color. |
| | | |
| | | @param color The background border color. |
| | | */ |
| | | + (instancetype)highlightWithBackgroundColor:(nullable UIColor *)color; |
| | | |
| | | // Convenience methods below to set the `attributes`. |
| | | - (void)setFont:(nullable UIFont *)font; |
| | | - (void)setColor:(nullable UIColor *)color; |
| | | - (void)setStrokeWidth:(nullable NSNumber *)width; |
| | | - (void)setStrokeColor:(nullable UIColor *)color; |
| | | - (void)setShadow:(nullable YYTextShadow *)shadow; |
| | | - (void)setInnerShadow:(nullable YYTextShadow *)shadow; |
| | | - (void)setUnderline:(nullable YYTextDecoration *)underline; |
| | | - (void)setStrikethrough:(nullable YYTextDecoration *)strikethrough; |
| | | - (void)setBackgroundBorder:(nullable YYTextBorder *)border; |
| | | - (void)setBorder:(nullable YYTextBorder *)border; |
| | | - (void)setAttachment:(nullable YYTextAttachment *)attachment; |
| | | |
| | | /** |
| | | The user information dictionary, default is nil. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSDictionary *userInfo; |
| | | |
| | | /** |
| | | Tap action when user tap the highlight, default is nil. |
| | | If the value is nil, YYTextView or YYLabel will ask it's delegate to handle the tap action. |
| | | */ |
| | | @property (nullable, nonatomic, copy) YYTextAction tapAction; |
| | | |
| | | /** |
| | | Long press action when user long press the highlight, default is nil. |
| | | If the value is nil, YYTextView or YYLabel will ask it's delegate to handle the long press action. |
| | | */ |
| | | @property (nullable, nonatomic, copy) YYTextAction longPressAction; |
| | | |
| | | @end |
| | | |
| | | NS_ASSUME_NONNULL_END |