diff --git a/src/TTStyledLayout.m b/src/TTStyledLayout.m index 5c842e7d12..4be6aa1ee6 100644 --- a/src/TTStyledLayout.m +++ b/src/TTStyledLayout.m @@ -82,6 +82,30 @@ - (void)offsetFrame:(TTStyledFrame*)frame by:(CGFloat)y { } } +- (void)expandLineWidth:(CGFloat)width { + _lineWidth += width; + TTStyledInlineFrame* inlineFrame = _inlineFrame; + while (inlineFrame) { + inlineFrame.width += width; + inlineFrame = inlineFrame.inlineParentFrame; + } +} + +- (void)inflateLineHeight:(CGFloat)height { + if (height > _lineHeight) { + _lineHeight = height; + } + if (_inlineFrame) { + TTStyledInlineFrame* inlineFrame = _inlineFrame; + while (inlineFrame) { + if (height > inlineFrame.height) { + inlineFrame.height = height; + } + inlineFrame = inlineFrame.inlineParentFrame; + } + } +} + - (void)addFrame:(TTStyledFrame*)frame { if (!_rootFrame) { _rootFrame = [frame retain]; @@ -114,12 +138,6 @@ - (TTStyledFrame*)addContentFrame:(TTStyledFrame*)frame width:(CGFloat)width { _lineFirstFrame = frame; } _x += width; - - TTStyledInlineFrame* inlineFrame = _inlineFrame; - while (inlineFrame) { - inlineFrame.width += width; - inlineFrame = inlineFrame.inlineParentFrame; - } return frame; } @@ -128,6 +146,11 @@ - (void)addContentFrame:(TTStyledFrame*)frame width:(CGFloat)width height:(CGFlo [self addContentFrame:frame width:width]; } +- (void)addAbsoluteFrame:(TTStyledFrame*)frame width:(CGFloat)width height:(CGFloat)height { + frame.bounds = CGRectMake(_x, _height, width, height); + [self addFrame:frame]; +} + - (TTStyledInlineFrame*)addInlineFrame:(TTStyle*)style element:(TTStyledElement*)element width:(CGFloat)width height:(CGFloat)height { TTStyledInlineFrame* frame = [[[TTStyledInlineFrame alloc] initWithElement:element] autorelease]; @@ -349,13 +372,7 @@ - (void)layoutElement:(TTStyledElement*)elt { } _width -= padding.padding.left+padding.padding.right; _x += padding.padding.left; - _lineWidth += padding.padding.left; - - TTStyledInlineFrame* inlineFrame = _inlineFrame; - while (inlineFrame) { - inlineFrame.width += padding.padding.left; - inlineFrame = inlineFrame.inlineParentFrame; - } + [self expandLineWidth:padding.padding.left]; if (isBlock) { _height += padding.padding.top; @@ -386,7 +403,6 @@ - (void)layoutElement:(TTStyledElement*)elt { _height += padding.margin.bottom; } } else if (!isBlock && style) { - //_inlineFrame.height += _lineHeight; if (padding) { _x += padding.padding.right + padding.margin.right; _lineWidth += padding.padding.right + padding.margin.right; @@ -413,21 +429,6 @@ - (void)layoutElement:(TTStyledElement*)elt { } } -- (void)inflateLineHeight:(CGFloat)height { - if (height > _lineHeight) { - _lineHeight = height; - } - if (_inlineFrame) { - TTStyledInlineFrame* inlineFrame = _inlineFrame; - while (inlineFrame) { - if (height > inlineFrame.height) { - inlineFrame.height = height; - } - inlineFrame = inlineFrame.inlineParentFrame; - } - } -} - - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)element { UIImage* image = imageNode.image; if (!image && imageNode.url) { @@ -446,13 +447,13 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el CGFloat contentWidth = imageWidth; CGFloat contentHeight = imageHeight; - if (padding) { + if (padding && padding.position != TTPositionAbsolute) { _x += padding.margin.left; contentWidth += padding.margin.left + padding.margin.right; contentHeight += padding.margin.top + padding.margin.bottom; } - if (!padding.position && (_lineWidth + contentWidth > _width)) { + if ((!padding || !padding.position) && (_lineWidth + contentWidth > _width)) { if (_lineWidth) { // The image will be placed on the next line, so create a new frame for // the current line and mark it with a line break @@ -465,12 +466,18 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el TTStyledImageFrame* frame = [[[TTStyledImageFrame alloc] initWithElement:element node:imageNode] autorelease]; frame.style = style; - [self addContentFrame:frame width:imageWidth height:imageHeight]; - if (!padding.position) { - _lineWidth += contentWidth; + if (!padding || !padding.position) { + [self addContentFrame:frame width:imageWidth height:imageHeight]; + [self expandLineWidth:contentWidth]; [self inflateLineHeight:contentHeight]; - } else if (padding.position == TTPositionFloatRight) { + } else if (padding.position == TTPositionAbsolute) { + [self addAbsoluteFrame:frame width:imageWidth height:imageHeight]; + frame.x += padding.margin.left; + frame.y += padding.margin.top; + } else if (padding.position == TTPositionFloatLeft) { + [self addContentFrame:frame width:imageWidth height:imageHeight]; + frame.x += _floatLeftWidth; _floatLeftWidth += contentWidth; if (_height+contentHeight > _floatHeight) { @@ -479,6 +486,8 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el _minX += contentWidth; _width -= contentWidth; } else if (padding.position == TTPositionFloatRight) { + [self addContentFrame:frame width:imageWidth height:imageHeight]; + frame.x += _width - (_floatRightWidth + contentWidth); _floatRightWidth += contentWidth; if (_height+contentHeight > _floatHeight) { @@ -488,7 +497,7 @@ - (void)layoutImage:(TTStyledImageNode*)imageNode container:(TTStyledElement*)el _width -= contentWidth; } - if (padding) { + if (padding && padding.position != TTPositionAbsolute) { frame.y += padding.margin.top; _x += padding.margin.right; } @@ -565,7 +574,7 @@ - (void)layoutText:(TTStyledTextNode*)textNode container:(TTStyledElement*)eleme } frameWidth += wordSize.width; - _lineWidth += wordSize.width; + [self expandLineWidth:wordSize.width]; [self inflateLineHeight:wordSize.height]; index = wordRange.location + wordRange.length; diff --git a/src/TTStyledText.m b/src/TTStyledText.m index fe348d65ee..b29320f096 100644 --- a/src/TTStyledText.m +++ b/src/TTStyledText.m @@ -103,8 +103,15 @@ - (void)loadImages { // NSObject - (id)initWithNode:(TTStyledNode*)rootNode { - if (self = [super init]) { + if (self = [self init]) { _rootNode = [rootNode retain]; + } + return self; +} + +- (id)init { + if (self = [super init]) { + _rootNode = nil; _rootFrame = nil; _font = nil; _width = 0; diff --git a/src/TTTableFieldCell.m b/src/TTTableFieldCell.m index 301b570d77..8e731422a0 100644 --- a/src/TTTableFieldCell.m +++ b/src/TTTableFieldCell.m @@ -198,7 +198,6 @@ + (CGFloat)tableView:(UITableView*)tableView rowHeightForItem:(id)item { - (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString*)identifier { if (self = [super initWithFrame:frame reuseIdentifier:identifier]) { _label = [[TTStyledTextLabel alloc] initWithFrame:CGRectZero]; - //_label.contentInset = UIEdgeInsetsMake(kVPadding, kHPadding, kVPadding, kHPadding); [self.contentView addSubview:_label]; } return self;