自动布局下带有内边距的多行UILabel,在UITableView中。

3

我在UITableView中有一个UILabel,它应该最多只有2行,并且周围有一点填充(左右各7个像素,上下各2个像素)。我正在使用autolayout,仅针对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];
}

它在表格视图中有区别吗?任何帮助将不胜感激。


1
这个问题(http://stackoverflow.com/q/12901599/558933)中的任何解决方案有帮助吗? - Robotic Cat
不,我理解布局约束的工作原理。我的问题是多行标签和填充的特定组合,使用自动布局(以及在表视图中,但我怀疑这与问题无关)。 - Mick Byrne
它哪里出了问题? - leftspin
2个回答

10

就像您在我上面的评论中所看到的,您并没有真正说出它正在做什么让您感到意外。我刚刚自己完成了这个过程,并且使用自动布局可以解决:

@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];
}

这在我看来甚至更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接