New file |
| | |
| | | // |
| | | // YYTextView.h |
| | | // YYText <https://github.com/ibireme/YYText> |
| | | // |
| | | // Created by ibireme on 15/2/25. |
| | | // 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> |
| | | |
| | | #if __has_include(<YYText/YYText.h>) |
| | | #import <YYText/YYTextParser.h> |
| | | #import <YYText/YYTextLayout.h> |
| | | #import <YYText/YYTextAttribute.h> |
| | | #else |
| | | #import "YYTextParser.h" |
| | | #import "YYTextLayout.h" |
| | | #import "YYTextAttribute.h" |
| | | #endif |
| | | |
| | | @class YYTextView; |
| | | |
| | | NS_ASSUME_NONNULL_BEGIN |
| | | |
| | | /** |
| | | The YYTextViewDelegate protocol defines a set of optional methods you can use |
| | | to receive editing-related messages for YYTextView objects. |
| | | |
| | | @discussion The API and behavior is similar to UITextViewDelegate, |
| | | see UITextViewDelegate's documentation for more information. |
| | | */ |
| | | @protocol YYTextViewDelegate <NSObject, UIScrollViewDelegate> |
| | | @optional |
| | | - (BOOL)textViewShouldBeginEditing:(YYTextView *)textView; |
| | | - (BOOL)textViewShouldEndEditing:(YYTextView *)textView; |
| | | - (void)textViewDidBeginEditing:(YYTextView *)textView; |
| | | - (void)textViewDidEndEditing:(YYTextView *)textView; |
| | | - (BOOL)textView:(YYTextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text; |
| | | - (void)textViewDidChange:(YYTextView *)textView; |
| | | - (void)textViewDidChangeSelection:(YYTextView *)textView; |
| | | |
| | | - (BOOL)textView:(YYTextView *)textView shouldTapHighlight:(YYTextHighlight *)highlight inRange:(NSRange)characterRange; |
| | | - (void)textView:(YYTextView *)textView didTapHighlight:(YYTextHighlight *)highlight inRange:(NSRange)characterRange rect:(CGRect)rect; |
| | | - (BOOL)textView:(YYTextView *)textView shouldLongPressHighlight:(YYTextHighlight *)highlight inRange:(NSRange)characterRange; |
| | | - (void)textView:(YYTextView *)textView didLongPressHighlight:(YYTextHighlight *)highlight inRange:(NSRange)characterRange rect:(CGRect)rect; |
| | | @end |
| | | |
| | | |
| | | #if !TARGET_INTERFACE_BUILDER |
| | | |
| | | /** |
| | | The YYTextView class implements the behavior for a scrollable, multiline text region. |
| | | |
| | | @discussion The API and behavior is similar to UITextView, but provides more features: |
| | | |
| | | * It extends the CoreText attributes to support more text effects. |
| | | * It allows to add UIImage, UIView and CALayer as text attachments. |
| | | * It allows to add 'highlight' link to some range of text to allow user interact with. |
| | | * It allows to add exclusion paths to control text container's shape. |
| | | * It supports vertical form layout to display and edit CJK text. |
| | | * It allows user to copy/paste image and attributed text from/to text view. |
| | | * It allows to set an attributed text as placeholder. |
| | | |
| | | See NSAttributedString+YYText.h for more convenience methods to set the attributes. |
| | | See YYTextAttribute.h and YYTextLayout.h for more information. |
| | | */ |
| | | @interface YYTextView : UIScrollView <UITextInput> |
| | | |
| | | |
| | | #pragma mark - Accessing the Delegate |
| | | ///============================================================================= |
| | | /// @name Accessing the Delegate |
| | | ///============================================================================= |
| | | |
| | | @property (nullable, nonatomic, weak) id<YYTextViewDelegate> delegate; |
| | | |
| | | |
| | | #pragma mark - Configuring the Text Attributes |
| | | ///============================================================================= |
| | | /// @name Configuring the Text Attributes |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | The text displayed by the text view. |
| | | Set a new value to this property also replaces the text in `attributedText`. |
| | | Get the value returns the plain text in `attributedText`. |
| | | */ |
| | | @property (null_resettable, nonatomic, copy) NSString *text; |
| | | |
| | | /** |
| | | The font of the text. Default is 12-point system font. |
| | | Set a new value to this property also causes the new font to be applied to the entire `attributedText`. |
| | | Get the value returns the font at the head of `attributedText`. |
| | | */ |
| | | @property (nullable, nonatomic, strong) UIFont *font; |
| | | |
| | | /** |
| | | The color of the text. Default is black. |
| | | Set a new value to this property also causes the new color to be applied to the entire `attributedText`. |
| | | Get the value returns the color at the head of `attributedText`. |
| | | */ |
| | | @property (nullable, nonatomic, strong) UIColor *textColor; |
| | | |
| | | /** |
| | | The technique to use for aligning the text. Default is NSTextAlignmentNatural. |
| | | Set a new value to this property also causes the new alignment to be applied to the entire `attributedText`. |
| | | Get the value returns the alignment at the head of `attributedText`. |
| | | */ |
| | | @property (nonatomic) NSTextAlignment textAlignment; |
| | | |
| | | /** |
| | | The text vertical aligmnent in container. Default is YYTextVerticalAlignmentTop. |
| | | */ |
| | | @property (nonatomic) YYTextVerticalAlignment textVerticalAlignment; |
| | | |
| | | /** |
| | | The types of data converted to clickable URLs in the text view. Default is UIDataDetectorTypeNone. |
| | | The tap or long press action should be handled by delegate. |
| | | */ |
| | | @property (nonatomic) UIDataDetectorTypes dataDetectorTypes; |
| | | |
| | | /** |
| | | The attributes to apply to links at normal state. Default is light blue color. |
| | | When a range of text is detected by the `dataDetectorTypes`, this value would be |
| | | used to modify the original attributes in the range. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSDictionary<NSString *, id> *linkTextAttributes; |
| | | |
| | | /** |
| | | The attributes to apply to links at highlight state. Default is a gray border. |
| | | When a range of text is detected by the `dataDetectorTypes` and the range was touched by user, |
| | | this value would be used to modify the original attributes in the range. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSDictionary<NSString *, id> *highlightTextAttributes; |
| | | |
| | | /** |
| | | The attributes to apply to new text being entered by the user. |
| | | When the text view's selection changes, this value is reset automatically. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSDictionary<NSString *, id> *typingAttributes; |
| | | |
| | | /** |
| | | The styled text displayed by the text view. |
| | | Set a new value to this property also replaces the value of the `text`, `font`, `textColor`, |
| | | `textAlignment` and other properties in text view. |
| | | |
| | | @discussion It only support the attributes declared in CoreText and YYTextAttribute. |
| | | See `NSAttributedString+YYText` for more convenience methods to set the attributes. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSAttributedString *attributedText; |
| | | |
| | | /** |
| | | When `text` or `attributedText` is changed, the parser will be called to modify the text. |
| | | It can be used to add code highlighting or emoticon replacement to text view. |
| | | The default value is nil. |
| | | |
| | | See `YYTextParser` protocol for more information. |
| | | */ |
| | | @property (nullable, nonatomic, strong) id<YYTextParser> textParser; |
| | | |
| | | /** |
| | | The current text layout in text view (readonly). |
| | | It can be used to query the text layout information. |
| | | */ |
| | | @property (nullable, nonatomic, strong, readonly) YYTextLayout *textLayout; |
| | | |
| | | |
| | | #pragma mark - Configuring the Placeholder |
| | | ///============================================================================= |
| | | /// @name Configuring the Placeholder |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | The placeholder text displayed by the text view (when the text view is empty). |
| | | Set a new value to this property also replaces the text in `placeholderAttributedText`. |
| | | Get the value returns the plain text in `placeholderAttributedText`. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSString *placeholderText; |
| | | |
| | | /** |
| | | The font of the placeholder text. Default is same as `font` property. |
| | | Set a new value to this property also causes the new font to be applied to the entire `placeholderAttributedText`. |
| | | Get the value returns the font at the head of `placeholderAttributedText`. |
| | | */ |
| | | @property (nullable, nonatomic, strong) UIFont *placeholderFont; |
| | | |
| | | /** |
| | | The color of the placeholder text. Default is gray. |
| | | Set a new value to this property also causes the new color to be applied to the entire `placeholderAttributedText`. |
| | | Get the value returns the color at the head of `placeholderAttributedText`. |
| | | */ |
| | | @property (nullable, nonatomic, strong) UIColor *placeholderTextColor; |
| | | |
| | | /** |
| | | The styled placeholder text displayed by the text view (when the text view is empty). |
| | | Set a new value to this property also replaces the value of the `placeholderText`, |
| | | `placeholderFont`, `placeholderTextColor`. |
| | | |
| | | @discussion It only support the attributes declared in CoreText and YYTextAttribute. |
| | | See `NSAttributedString+YYText` for more convenience methods to set the attributes. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSAttributedString *placeholderAttributedText; |
| | | |
| | | |
| | | #pragma mark - Configuring the Text Container |
| | | ///============================================================================= |
| | | /// @name Configuring the Text Container |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | The inset of the text container's layout area within the text view's content area. |
| | | */ |
| | | @property (nonatomic) UIEdgeInsets textContainerInset; |
| | | |
| | | /** |
| | | An array of UIBezierPath objects representing the exclusion paths inside the |
| | | receiver's bounding rectangle. Default value is nil. |
| | | */ |
| | | @property (nullable, nonatomic, copy) NSArray<UIBezierPath *> *exclusionPaths; |
| | | |
| | | /** |
| | | Whether the receiver's layout orientation is vertical form. Default is NO. |
| | | It may used to edit/display CJK text. |
| | | */ |
| | | @property (nonatomic, getter=isVerticalForm) BOOL verticalForm; |
| | | |
| | | /** |
| | | The text line position modifier used to modify the lines' position in layout. |
| | | See `YYTextLinePositionModifier` protocol for more information. |
| | | */ |
| | | @property (nullable, nonatomic, copy) id<YYTextLinePositionModifier> linePositionModifier; |
| | | |
| | | /** |
| | | The debug option to display CoreText layout result. |
| | | The default value is [YYTextDebugOption sharedDebugOption]. |
| | | */ |
| | | @property (nullable, nonatomic, copy) YYTextDebugOption *debugOption; |
| | | |
| | | |
| | | #pragma mark - Working with the Selection and Menu |
| | | ///============================================================================= |
| | | /// @name Working with the Selection and Menu |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | Scrolls the receiver until the text in the specified range is visible. |
| | | */ |
| | | - (void)scrollRangeToVisible:(NSRange)range; |
| | | |
| | | /** |
| | | The current selection range of the receiver. |
| | | */ |
| | | @property (nonatomic) NSRange selectedRange; |
| | | |
| | | /** |
| | | A Boolean value indicating whether inserting text replaces the previous contents. |
| | | The default value is NO. |
| | | */ |
| | | @property (nonatomic) BOOL clearsOnInsertion; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver is selectable. Default is YES. |
| | | When the value of this property is NO, user cannot select content or edit text. |
| | | */ |
| | | @property (nonatomic, getter=isSelectable) BOOL selectable; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver is highlightable. Default is YES. |
| | | When the value of this property is NO, user cannot interact with the highlight range of text. |
| | | */ |
| | | @property (nonatomic, getter=isHighlightable) BOOL highlightable; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver is editable. Default is YES. |
| | | When the value of this property is NO, user cannot edit text. |
| | | */ |
| | | @property (nonatomic, getter=isEditable) BOOL editable; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver can paste image from pasteboard. Default is NO. |
| | | When the value of this property is YES, user can paste image from pasteboard via "paste" menu. |
| | | */ |
| | | @property (nonatomic) BOOL allowsPasteImage; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver can paste attributed text from pasteboard. Default is NO. |
| | | When the value of this property is YES, user can paste attributed text from pasteboard via "paste" menu. |
| | | */ |
| | | @property (nonatomic) BOOL allowsPasteAttributedString; |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver can copy attributed text to pasteboard. Default is YES. |
| | | When the value of this property is YES, user can copy attributed text (with attachment image) |
| | | from text view to pasteboard via "copy" menu. |
| | | */ |
| | | @property (nonatomic) BOOL allowsCopyAttributedString; |
| | | |
| | | |
| | | #pragma mark - Manage the undo and redo |
| | | ///============================================================================= |
| | | /// @name Manage the undo and redo |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | A Boolean value indicating whether the receiver can undo and redo typing with |
| | | shake gesture. The default value is YES. |
| | | */ |
| | | @property (nonatomic) BOOL allowsUndoAndRedo; |
| | | |
| | | /** |
| | | The maximum undo/redo level. The default value is 20. |
| | | */ |
| | | @property (nonatomic) NSUInteger maximumUndoLevel; |
| | | |
| | | |
| | | #pragma mark - Replacing the System Input Views |
| | | ///============================================================================= |
| | | /// @name Replacing the System Input Views |
| | | ///============================================================================= |
| | | |
| | | /** |
| | | The custom input view to display when the text view becomes the first responder. |
| | | It can be used to replace system keyboard. |
| | | |
| | | @discussion If set the value while first responder, it will not take effect until |
| | | 'reloadInputViews' is called. |
| | | */ |
| | | @property (nullable, nonatomic, readwrite, strong) __kindof UIView *inputView; |
| | | |
| | | /** |
| | | The custom accessory view to display when the text view becomes the first responder. |
| | | It can be used to add a toolbar at the top of keyboard. |
| | | |
| | | @discussion If set the value while first responder, it will not take effect until |
| | | 'reloadInputViews' is called. |
| | | */ |
| | | @property (nullable, nonatomic, readwrite, strong) __kindof UIView *inputAccessoryView; |
| | | |
| | | /** |
| | | If you use an custom accessory view without "inputAccessoryView" property, |
| | | you may set the accessory view's height. It may used by auto scroll calculation. |
| | | */ |
| | | @property (nonatomic) CGFloat extraAccessoryViewHeight; |
| | | |
| | | @end |
| | | |
| | | |
| | | #else // TARGET_INTERFACE_BUILDER |
| | | IB_DESIGNABLE |
| | | @interface YYTextView : UIScrollView <UITextInput> |
| | | @property (null_resettable, nonatomic, copy) IBInspectable NSString *text; |
| | | @property (nullable, nonatomic, strong) IBInspectable UIColor *textColor; |
| | | @property (nullable, nonatomic, strong) IBInspectable NSString *fontName_; |
| | | @property (nonatomic) IBInspectable CGFloat fontSize_; |
| | | @property (nonatomic) IBInspectable BOOL fontIsBold_; |
| | | @property (nonatomic) IBInspectable NSTextAlignment textAlignment; |
| | | @property (nonatomic) IBInspectable YYTextVerticalAlignment textVerticalAlignment; |
| | | @property (nullable, nonatomic, copy) IBInspectable NSString *placeholderText; |
| | | @property (nullable, nonatomic, strong) IBInspectable UIColor *placeholderTextColor; |
| | | @property (nullable, nonatomic, strong) IBInspectable NSString *placeholderFontName_; |
| | | @property (nonatomic) IBInspectable CGFloat placeholderFontSize_; |
| | | @property (nonatomic) IBInspectable BOOL placeholderFontIsBold_; |
| | | @property (nonatomic, getter=isVerticalForm) IBInspectable BOOL verticalForm; |
| | | @property (nonatomic) IBInspectable BOOL clearsOnInsertion; |
| | | @property (nonatomic, getter=isSelectable) IBInspectable BOOL selectable; |
| | | @property (nonatomic, getter=isHighlightable) IBInspectable BOOL highlightable; |
| | | @property (nonatomic, getter=isEditable) IBInspectable BOOL editable; |
| | | @property (nonatomic) IBInspectable BOOL allowsPasteImage; |
| | | @property (nonatomic) IBInspectable BOOL allowsPasteAttributedString; |
| | | @property (nonatomic) IBInspectable BOOL allowsCopyAttributedString; |
| | | @property (nonatomic) IBInspectable BOOL allowsUndoAndRedo; |
| | | @property (nonatomic) IBInspectable NSUInteger maximumUndoLevel; |
| | | @property (nonatomic) IBInspectable CGFloat insetTop_; |
| | | @property (nonatomic) IBInspectable CGFloat insetBottom_; |
| | | @property (nonatomic) IBInspectable CGFloat insetLeft_; |
| | | @property (nonatomic) IBInspectable CGFloat insetRight_; |
| | | @property (nonatomic) IBInspectable BOOL debugEnabled_; |
| | | @property (nullable, nonatomic, weak) id<YYTextViewDelegate> delegate; |
| | | @property (nullable, nonatomic, strong) UIFont *font; |
| | | @property (nonatomic) UIDataDetectorTypes dataDetectorTypes; |
| | | @property (nullable, nonatomic, copy) NSDictionary *linkTextAttributes; |
| | | @property (nullable, nonatomic, copy) NSDictionary *highlightTextAttributes; |
| | | @property (nullable, nonatomic, copy) NSDictionary *typingAttributes; |
| | | @property (nullable, nonatomic, copy) NSAttributedString *attributedText; |
| | | @property (nullable, nonatomic, strong) id<YYTextParser> textParser; |
| | | @property (nullable, nonatomic, strong, readonly) YYTextLayout *textLayout; |
| | | @property (nullable, nonatomic, strong) UIFont *placeholderFont; |
| | | @property (nullable, nonatomic, copy) NSAttributedString *placeholderAttributedText; |
| | | @property (nonatomic) UIEdgeInsets textContainerInset; |
| | | @property (nullable, nonatomic, copy) NSArray *exclusionPaths; |
| | | @property (nullable, nonatomic, copy) id<YYTextLinePositionModifier> linePositionModifier; |
| | | @property (nullable, nonatomic, copy) YYTextDebugOption *debugOption; |
| | | - (void)scrollRangeToVisible:(NSRange)range; |
| | | @property (nonatomic) NSRange selectedRange; |
| | | @property (nullable, nonatomic, readwrite, strong) __kindof UIView *inputView; |
| | | @property (nullable, nonatomic, readwrite, strong) __kindof UIView *inputAccessoryView; |
| | | @property (nonatomic) CGFloat extraAccessoryViewHeight; |
| | | @end |
| | | #endif // !TARGET_INTERFACE_BUILDER |
| | | |
| | | |
| | | // Notifications, see UITextView's documentation for more information. |
| | | UIKIT_EXTERN NSString *const YYTextViewTextDidBeginEditingNotification; |
| | | UIKIT_EXTERN NSString *const YYTextViewTextDidChangeNotification; |
| | | UIKIT_EXTERN NSString *const YYTextViewTextDidEndEditingNotification; |
| | | |
| | | NS_ASSUME_NONNULL_END |