iOS:对UILabel进行子类化并更新其缩进

时间:2012-10-17 15:14:49

标签: ios uilabel

我有一个包含非常大的表单的应用程序。我将UILabel子类化,因此我可以在表单标签中保持一致性。然而,一些标签将是具有背景颜色的截面分割器,并且它们将需要缩进。

我知道我可以通过使用此代码实例化UILabel的缩进设置:

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

但是这会为所有标签添加插图。不是我想要的。

所以我所做的是写了一个自定义方法:

- (void) makeInsets
{
    CGRect rect = self.frame;

    if (hasInset) {
        UIEdgeInsets insets = {0, 5, 0, 5};
        return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
    } else {
        UIEdgeInsets insets = {0, 0, 0, 0};
        return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
    }
}

问题是它是在绘制UILabel之后发生的。我尝试[UILabelSubclass setNeedsDisplay:YES],但setNeedsDisplay方法出现“无可见界面”错误。有没有办法可以用我的自定义覆盖现有的插图?

2 个答案:

答案 0 :(得分:2)

setNeedsDisplay出现“无可见界面”错误,因为the method没有参数。你应该写:

[subclassedLabelInstance setNeedsDisplay];

该错误应该消失。它也可以解决这个问题。

答案 1 :(得分:1)

因为你正在对它进行子类化...你不能只添加一个布尔属性来指示是否缩进吗?

.h文件

@property BOOL indentText;

.m文件

- (id) initWithIndent:(BOOL)indent {

    if((self = [super init])) {
        self.indentText = indent;
    }

    return self;
}

- (void)drawTextInRect:(CGRect)rect {

    if( self.indentText ) {
        UIEdgeInsets insets = {0, 5, 0, 5};
        return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
    }
}

如果您计划进行大量自定义,那么当您创建标签以指示如何标记时,您可以传递某种样式常量...但如果您打算做的只是这个然后我会添加一个简单的属性来切换它。