在 UITableView 中自动布局中带有填充的多行 UILabel
Posted
技术标签:
【中文标题】在 UITableView 中自动布局中带有填充的多行 UILabel【英文标题】:Multiline UILabel with padding in autolayout, in UITableView 【发布时间】:2013-09-01 11:44:32 【问题描述】:我在 UITableView 中有一个 UILabel,它最多应该是 2 行,并且在它周围有一点填充(7 个左右和 2 个顶部和底部)。我正在使用自动布局并仅针对 ios6 及更高版本。正在以编程方式创建和添加所有视图。
我已经对我的 UILabel 进行了子类化,这是 init
方法:
- (id)init
self = [super init];
self.translatesAutoresizingMaskIntoConstraints = NO;
self.numberOfLines = 2;
self.backgroundColor = UIColorFromARGB(0x99000000);
self.textColor = [UIColor whiteColor];
self.font = [UIFont boldSystemFontOfSize:14.0f];
return self;
如果我添加它,我会得到正确的填充,但它只是一行:
- (void)drawTextInRect:(CGRect)rect
UIEdgeInsets insets = 2, 7, 2, 7;
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
我已经看过几次这个答案,但它对我不起作用(没有效果):
- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
UIEdgeInsets insets = 2, 7, 2, 7;
return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,insets) limitedToNumberOfLines:numberOfLines];
它在表格视图中是否有所不同?任何帮助将不胜感激。
【问题讨论】:
这个问题 (***.com/q/12901599/558933) 中的任何解决方案有帮助吗? 不,我了解布局约束的工作原理。我的问题是多行标签的特殊组合,带有填充,使用自动布局(在表格视图中,但我怀疑这无关紧要)。 它做错了什么? 【参考方案1】:正如您在我上面的评论中看到的那样,您并没有真正说出您没想到的事情。我自己刚刚完成了这个,这适用于自动布局:
@implementation InsetLabel
- (void) setInsets:(UIEdgeInsets)insets
_insets = insets ;
[self invalidateIntrinsicContentSize] ;
- (void)drawTextInRect:(CGRect)rect
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.insets)];
- (void)resizeHeightToFitText
CGRect frame = [self bounds];
CGFloat textWidth = frame.size.width - (self.insets.left + self.insets.right);
CGSize newSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(textWidth, 1000000) lineBreakMode:self.lineBreakMode];
frame.size.height = newSize.height + self.insets.top + self.insets.bottom;
self.frame = frame;
- (CGSize) intrinsicContentSize
CGSize superSize = [super intrinsicContentSize] ;
superSize.height += self.insets.top + self.insets.bottom ;
superSize.width += self.insets.left + self.insets.right ;
return superSize ;
@end
【讨论】:
【参考方案2】:@implementation InsetLabel
- (void) setInsets:(UIEdgeInsets)insets
_insets = insets ;
[self invalidateIntrinsicContentSize] ;
- (void)drawTextInRect:(CGRect)rect
return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.insets)];
- (void)resizeHeightToFitText
CGRect frame = [self frame];
CGFloat textWidth = frame.size.width - (self.insets.left + self.insets.right);
CGSize newSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(textWidth, 1000000) lineBreakMode:self.lineBreakMode];
frame.size.height = newSize.height + self.insets.top + self.insets.bottom;
self.frame = frame;
- (CGSize) intrinsicContentSize
CGSize superSize = [super intrinsicContentSize] ;
superSize.height += self.insets.top + self.insets.bottom ;
superSize.width += self.insets.left + self.insets.right ;
return superSize ;
- (void)layoutSubviews
[super layoutSubviews];
[self resizeHeightToFitText];
恕我直言,这效果更好。
【讨论】:
以上是关于在 UITableView 中自动布局中带有填充的多行 UILabel的主要内容,如果未能解决你的问题,请参考以下文章
UITableview 单元格内的 UILabel,自动布局填充问题
使用自动布局强制 UITableView 中的 UIView 填满屏幕
UITableview 没有在 iOS 中使用自动布局调整大小