Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS:将UILabel子类化并更新其缩进_Ios_Uilabel - Fatal编程技术网

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

iOS:将UILabel子类化并更新其缩进,ios,uilabel,Ios,Uilabel,我有一个包含相当大表单的应用程序。我将UILabel子类化,以便在表单标签中保持一致性。然而,一些标签将是带有背景色的切分器,它们需要缩进 我知道当UILabel使用以下代码进行实例化时,我可以克服它的缩进设置: - (void)drawTextInRect:(CGRect)rect { UIEdgeInsets insets = {0, 5, 0, 5}; return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, inse

我有一个包含相当大表单的应用程序。我将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
方法出现了“无可见界面”错误。有没有一种方法可以用自定义的插入替代现有的插入

由于不接受参数,因此在
setNeedsDisplay
中出现“无可见接口”错误。你应该写:

[subclassedLabelInstance setNeedsDisplay];
这个错误应该会消失。这也可能解决问题。

您会在
setNeedsDisplay
中遇到“无可见接口”错误,因为它不接受参数。你应该写:

[subclassedLabelInstance setNeedsDisplay];

这个错误应该会消失。它还可能解决这个问题。

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

.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)];
    }
}

如果您计划进行大量定制,那么您可以在创建标签时传入某种样式常量,以指示如何标记标签。。。但如果您只打算这样做,那么我只需要添加一个简单的属性来打开它。

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

.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)];
    }
}

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

谢谢……这是一个愚蠢的错误汉克斯……那是个愚蠢的错误DI当然会给你选择的答案,因为我正在传递bool属性(hasInset),所以你提供的实际上更好地解决了我的问题。但另一个用户确实回答了我的setNeedsDisplay问题。谢谢你的推送。是的,我想既然你已经将UILabel子类化了。。。为什么不调整代码,这样就可以避免在外部调用setNeedsDisplay。现在您的视图代码将更具可读性:)我当然会给您选择的答案,因为我正在传递bool属性(hasInset),所以您提供的内容实际上更好地解决了我的问题。但另一个用户确实回答了我的setNeedsDisplay问题。谢谢你的推送。是的,我想既然你已经将UILabel子类化了。。。为什么不调整代码,这样就可以避免在外部调用setNeedsDisplay。现在,您的视图代码将更具可读性:)