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ため、「No visible interface」エラーが発生します。あなたはただ書くべきです:

[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 に答える