mirror of
https://github.com/Swiftgram/Telegram-iOS.git
synced 2025-11-28 19:05:49 +00:00
Merge pull request #265 from andyscott/ASTextNode-max-line-count
Add maximumLineCount to ASTextNode
This commit is contained in:
commit
9f6ce8e16e
@ -64,6 +64,12 @@ typedef NS_ENUM(NSUInteger, ASTextNodeHighlightStyle) {
|
||||
*/
|
||||
@property (nonatomic, readonly, assign, getter=isTruncated) BOOL truncated;
|
||||
|
||||
/**
|
||||
@abstract The maximum number of lines to render of the text before truncation.
|
||||
@default 0 (No limit)
|
||||
*/
|
||||
@property (nonatomic, assign) NSUInteger maximumLineCount;
|
||||
|
||||
/**
|
||||
@abstract The number of lines in the text. Text must have been sized first.
|
||||
*/
|
||||
|
||||
@ -243,6 +243,7 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
|
||||
_renderer = [[ASTextNodeRenderer alloc] initWithAttributedString:_attributedString
|
||||
truncationString:_composedTruncationString
|
||||
truncationMode:_truncationMode
|
||||
maximumLineCount:_maximumLineCount
|
||||
constrainedSize:constrainedSize];
|
||||
}
|
||||
return _renderer;
|
||||
@ -905,6 +906,15 @@ ASDISPLAYNODE_INLINE CGFloat ceilPixelValue(CGFloat f)
|
||||
return [[self _renderer] truncationStringCharacterRange].location != NSNotFound;
|
||||
}
|
||||
|
||||
- (void)setMaximumLineCount:(NSUInteger)maximumLineCount
|
||||
{
|
||||
if (_maximumLineCount != maximumLineCount) {
|
||||
_maximumLineCount = maximumLineCount;
|
||||
[self _invalidateRenderer];
|
||||
[self setNeedsDisplay];
|
||||
}
|
||||
}
|
||||
|
||||
- (NSUInteger)lineCount
|
||||
{
|
||||
return [[self _renderer] lineCount];
|
||||
|
||||
@ -54,6 +54,7 @@ typedef NS_ENUM(NSUInteger, ASTextNodeRendererMeasureOption) {
|
||||
- (instancetype)initWithAttributedString:(NSAttributedString *)attributedString
|
||||
truncationString:(NSAttributedString *)truncationString
|
||||
truncationMode:(NSLineBreakMode)truncationMode
|
||||
maximumLineCount:(NSUInteger)maximumLineCount
|
||||
constrainedSize:(CGSize)constrainedSize;
|
||||
#pragma mark - Drawing
|
||||
/*
|
||||
|
||||
@ -29,6 +29,7 @@ static const CGFloat ASTextNodeRendererTextCapHeightPadding = 1.3;
|
||||
NSAttributedString *_attributedString;
|
||||
NSAttributedString *_truncationString;
|
||||
NSLineBreakMode _truncationMode;
|
||||
NSUInteger _maximumLineCount;
|
||||
NSRange _truncationCharacterRange;
|
||||
NSRange _visibleRange;
|
||||
|
||||
@ -45,6 +46,7 @@ static const CGFloat ASTextNodeRendererTextCapHeightPadding = 1.3;
|
||||
- (instancetype)initWithAttributedString:(NSAttributedString *)attributedString
|
||||
truncationString:(NSAttributedString *)truncationString
|
||||
truncationMode:(NSLineBreakMode)truncationMode
|
||||
maximumLineCount:(NSUInteger)maximumLineCount
|
||||
constrainedSize:(CGSize)constrainedSize
|
||||
{
|
||||
if (self = [super init]) {
|
||||
@ -53,6 +55,8 @@ static const CGFloat ASTextNodeRendererTextCapHeightPadding = 1.3;
|
||||
_truncationMode = truncationMode;
|
||||
_truncationCharacterRange = NSMakeRange(NSNotFound, truncationString.length);
|
||||
|
||||
_maximumLineCount = maximumLineCount;
|
||||
|
||||
_constrainedSize = constrainedSize;
|
||||
}
|
||||
return self;
|
||||
@ -90,6 +94,8 @@ static const CGFloat ASTextNodeRendererTextCapHeightPadding = 1.3;
|
||||
_textContainer.lineFragmentPadding = 0;
|
||||
// Translate our truncation mode into a line break mode on the container
|
||||
_textContainer.lineBreakMode = _truncationMode;
|
||||
// Set maximum number of lines
|
||||
_textContainer.maximumNumberOfLines = _maximumLineCount;
|
||||
|
||||
[_layoutManager addTextContainer:_textContainer];
|
||||
|
||||
|
||||
@ -18,6 +18,7 @@
|
||||
@property (nonatomic, copy, readwrite) NSAttributedString *attributedString;
|
||||
@property (nonatomic, copy, readwrite) NSAttributedString *truncationString;
|
||||
@property (nonatomic, readwrite, assign) NSLineBreakMode truncationMode;
|
||||
@property (nonatomic, readwrite, assign) NSUInteger maximumLineCount;
|
||||
@property (nonatomic, readwrite, assign) CGFloat lineSpacing;
|
||||
|
||||
@property (nonatomic, readwrite, assign) CGSize constrainedSize;
|
||||
@ -50,6 +51,7 @@
|
||||
_renderer = [[ASTextNodeRenderer alloc] initWithAttributedString:_attributedString
|
||||
truncationString:_truncationString
|
||||
truncationMode:_truncationMode
|
||||
maximumLineCount:_maximumLineCount
|
||||
constrainedSize:_constrainedSize];
|
||||
|
||||
}
|
||||
@ -71,6 +73,19 @@
|
||||
XCTAssertTrue(numberOfLines == 1 , @"If constrained height (%f) is float max, then there should only be one line of text. Size %@", _constrainedSize.width, NSStringFromCGSize(size));
|
||||
}
|
||||
|
||||
- (void)testMaximumLineCount
|
||||
{
|
||||
NSArray *lines = [NSArray arrayWithObjects:@"Hello!", @"world!", @"foo", @"bar", @"baz", nil];
|
||||
_maximumLineCount = 2;
|
||||
for (int i = 0; i <= [lines count]; i++) {
|
||||
NSString *line = [[lines subarrayWithRange:NSMakeRange(0, i)] componentsJoinedByString:@"\n"];
|
||||
_attributedString = [[NSAttributedString alloc] initWithString:line];
|
||||
[self setUpRenderer];
|
||||
[_renderer size];
|
||||
XCTAssertTrue(_renderer.lineCount <= _maximumLineCount, @"The line count %tu after rendering should be no larger than the maximum line count %tu", _renderer.lineCount, _maximumLineCount);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)testNoTruncationIfEnoughSpace
|
||||
{
|
||||
[self setUpRenderer];
|
||||
@ -124,7 +139,6 @@
|
||||
[_renderer enumerateTextIndexesAtPosition:CGPointZero usingBlock:^(NSUInteger characterIndex, CGRect glyphBoundingRect, BOOL *stop) {
|
||||
XCTFail(@"Shouldn't be any text indexes to enumerate");
|
||||
}];
|
||||
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user