1. ホーム
  2. ios

[解決済み] UILabelにスペース/パディングを追加する

2022-02-14 14:30:47

質問

を持っています。 UILabel 上と下にスペースを追加したいところ。制約の中で最小の高さで、修正しました。

これを実現するために、私は

override func drawTextInRect(rect: CGRect) {
    var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}

しかし、2行以上書くと問題が同じになるので、別の方法を探さなければなりません。

解決方法は?

UILabelをサブクラス化せず、そのまま使いたい場合。 ムンディが明確な解決策を提示しています .

UIViewでUILabelをラップすることを避けたい場合は、UITextViewを使用してUIEdgeInsets(パディング)を使用できるようにするか、UILabelのサブクラスでUIEdgeInsetsをサポートすることも可能です。

を使うことで UITextView は、インセット(Objective-C)だけを提供すればよいでしょう。

textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);

のサブクラスを作成することもできます。 UILabel をオーバーライドすることです。 drawTextInRect メソッド
(Objective-C)

- (void)drawTextInRect:(CGRect)uiLabelRect {
    UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
    [super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}

さらに、新しいサブクラス化されたUILabelに、TOP、LEFT、BOTTOM、RIGHTのインセット変数を与えることができます。

コード例としては、以下のようなものがあります。

.h(Objective-C)において

float topInset, leftInset,bottomInset, rightInset;

.m(Objective-C)の場合

- (void)drawTextInRect:(CGRect)uiLabelRect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}

見たところ、UILabelをサブクラス化する際に、intrinsicContentSizeをオーバーライドする必要があるようです。

ということは 固有コンテンツサイズ のようにします。

- (CGSize) intrinsicContentSize {
    CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
    intrinsicSuperViewContentSize.height += topInset + bottomInset ;
    intrinsicSuperViewContentSize.width += leftInset + rightInset ;
    return intrinsicSuperViewContentSize ;
}

そして、インセットを個別に編集するのではなく、以下のメソッドを追加してください。

- (void) setContentEdgeInsets:(UIEdgeInsets)edgeInsets {
    topInset = edgeInsets.top;
    leftInset = edgeInsets.left;
    rightInset = edgeInsets.right;
    bottomInset = edgeInsets.bottom;
    [self invalidateIntrinsicContentSize] ;
}

UILabelのサイズを更新して、エッジインセットと一致させ、参照した複数行の必要性をカバーします。

少し探したところ、次のようなものが見つかりました。 要旨 を IPInsetLabel と共に使用します。もし、これらの解決策がうまくいかない場合は、これを試してみてください。

この件に関しては、同様の質問(重複)がありました。
利用可能なソリューションの全リストは、この回答を参照してください。 UILabelのテキストマージン