Swiftgram/AsyncDisplayKit/Details/ASTextNodeRenderer.h
2014-06-26 22:32:55 -07:00

182 lines
6.8 KiB
Objective-C

/* Copyright (c) 2014-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the BSD-style license found in the
* LICENSE file in the root directory of this source tree. An additional grant
* of patent rights can be found in the PATENTS file in the same directory.
*/
#import <UIKit/UIKit.h>
typedef void (^as_renderer_index_block_t)(NSUInteger characterIndex,
CGRect glyphBoundingRect,
BOOL *stop);
/*
* Measure options are used to specify which type of line height measurement to
* use.
*
* ASTextNodeRendererMeasureOptionLineHeight is faster and will give the
* height from the baseline to the next line.
*
* ASTextNodeRendererMeasureOptionCapHeight is a more nuanced measure of the
* glyphs in the given range that attempts to produce a visually balanced
* rectangle above and below the glyphs to produce nice looking text highlights.
*
* ASTextNodeRendererMeasureOptionBlock uses the cap height option to
* generate each glyph index, but combines all but the first and last line rect
* into a single block. Looks nice for multiline selection.
*
*/
typedef NS_ENUM(NSUInteger, ASTextNodeRendererMeasureOption) {
ASTextNodeRendererMeasureOptionLineHeight,
ASTextNodeRendererMeasureOptionCapHeight,
ASTextNodeRendererMeasureOptionBlock
};
/*
* This is an immutable textkit renderer that is responsible for sizing and
* rendering text.
*
* @discussion This class implements internal locking to allow it to be used
* safely from background threads. It is recommended that you create and cache a
* renderer for each combination of parameters.
*/
@interface ASTextNodeRenderer : NSObject
/*
* Designated Initializer
*
* @discussion No sizing occurs as a result of initializing a renderer.
* Instead, sizing and truncation operations occur lazily as they are needed,
* so feel free
*/
- (instancetype)initWithAttributedString:(NSAttributedString *)attributedString
truncationString:(NSAttributedString *)truncationString
truncationMode:(NSLineBreakMode)truncationMode
constrainedSize:(CGSize)constrainedSize;
#pragma mark - Drawing
/*
* Draw the renderer's text content into the bounds provided.
*
* @param bounds The rect in which to draw the contents of the renderer.
* @param isRasterizing If YES, the renderer will not draw its background color
* within the bounds.
*
* @discussion Note that if a shadow is to be drawn, then the text will actually
* draw inside a region that is inset from the bounds provided. Use
* shadowPadding to properly transform the bounds such that this is correct for
* your use-case. See shadowPadding docs for more.
*
* Initializes the textkit components lazily if they have not yet been created.
* You may want to consider triggering this cost before hitting the draw method
* if you are sensitive to this cost in drawInRect...
*/
- (void)drawInRect:(CGRect)bounds isRasterizing:(BOOL)isRasterizing;
#pragma mark - Layout
/*
* Returns the computed size of the renderer given the constrained size and
* other parameters in the initializer.
*
* @discussion No actual computation is done in this method. It simply returns
* the cached calculated size from initialization so this is very cheap to call.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (CGSize)size;
/*
* Returns the trailing rect unused by the renderer in the last rendered line.
*
* @discussion In the coordinate space of the renderer.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (CGRect)trailingRect;
/*
* Returns the bounding rect for the given character range.
*
* @param textRange The character range for which the bounding rect will be
* computed. Should be within the range of the attributedString of this
* renderer.
*
* @discussion In the coordinate space of the renderer.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (CGRect)frameForTextRange:(NSRange)textRange;
/*
* Returns an array of rects representing the lines in the given character range
*
* @param textRange The character range for which the rects will be computed.
* should be within the range of the attributedString of this renderer.
* @param measureOption The measure option to use for construction of the rects.
* see ASTextNodeRendererMeasureOption docs for usage.
*
* @discussion This method is useful for providing highlighting text. Returned
* rects are in the coordinate space of the renderer.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (NSArray *)rectsForTextRange:(NSRange)textRange
measureOption:(ASTextNodeRendererMeasureOption)measureOption;
/*
* Enumerate the text character indexes at a position within the coordinate
* space of the renderer.
*
* @param position The point inside the coordinate space of the renderer at
* which text indexes will be enumerated.
* @param block The block that will be executed for each index identified that
* may correspond to the given position. The block is given the character index
* that corresponds to the glyph at each index in question, as well as the
* bounding rect for that glyph.
*
* @discussion Glyph location based on a touch point is not an exact science
* because user touches are not well-represented by a simple point, especially
* in the context of link-heavy text. So we have this method to make it a bit
* easier. This method checks a grid of candidate positions around the touch
* point you give it, and computes the bounding rect of the glyph corresponding
* to the character index given.
*
* The bounding rect of the glyph can be used to identify the best glyph index
* that corresponds to your touch. For instance, comparing centroidal distance
* from the glyph bounding rect to the touch center is useful for identifying
* which link a user actually intended to select.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (void)enumerateTextIndexesAtPosition:(CGPoint)position
usingBlock:(as_renderer_index_block_t)block;
#pragma mark - Text Ranges
/*
* The character range that represents the truncationString provided in the
* initializer. location will be NSNotFound if no truncation occurred.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (NSRange)truncationStringCharacterRange;
/*
* The character range from the original attributedString that is displayed by
* the renderer given the parameters in the initializer.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (NSRange)visibleRange;
/*
* The number of lines shown in the string.
*
* Triggers initialization of textkit components, truncation, and sizing.
*/
- (NSUInteger)lineCount;
@end