我有一个包含非常大的表单的应用程序。我将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
方法出现“无可见界面”错误。有没有办法可以用我的自定义覆盖现有的插图?
答案 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)];
}
}
如果您计划进行大量自定义,那么当您创建标签以指示如何标记时,您可以传递某种样式常量...但如果您打算做的只是这个然后我会添加一个简单的属性来切换它。