0

我有一个包含相当大表格的应用程序。我对 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。有没有办法可以用我的自定义插图覆盖现有的插图?

4

2 回答 2

2

setNeedsDisplay由于该方法不带参数,因此您会收到“无可见界面”错误。你应该只写:

[subclassedLabelInstance setNeedsDisplay];

并且该错误应该消失。它也可能解决问题。

于 2012-10-17T15:26:15.987 回答
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)];
    }
}

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

于 2012-10-17T15:26:19.027 回答