69

背景色でを作成する必要があり、UILabel左/右の先頭/末尾の水平パディングを追加したいと思います。

しかし、私が見つけたすべての解決策は厄介なハックのようです.

iOS 5 以降でこれを達成するための「標準的な」方法は何ですか?

私のシナリオを説明するスクリーンショット:

左パディングが必要

4

13 に答える 13

29

最も重要な部分は、AutoLayout を説明するためにintrinsicContentSize()との両方をオーバーライドする必要があることです。drawTextInRect()

var contentInset: UIEdgeInsets = .zero {
    didSet {
        setNeedsDisplay()
    }
}

override public var intrinsicContentSize: CGSize {
    let size = super.intrinsicContentSize
    return CGSize(width: size.width + contentInset.left + contentInset.right, height: size.height + contentInset.top + contentInset.bottom)
}

override public func drawText(in rect: CGRect) {
    super.drawText(in: UIEdgeInsetsInsetRect(rect, contentInset))
}
于 2016-04-20T07:21:20.210 に答える
25

文字列にもスペース文字を追加します。それは貧乏人のパディングです:)

また

カスタムの背景ビューを使用しますが、それが必要ない場合は、スペースだけが他の簡単なオプションです...

または、カスタム ラベルを作成します。coretext を介してテキストをレンダリングする

于 2013-10-17T21:43:55.143 に答える
16

UNICODE 部分スペースを使用して、プロトタイピング中に位置合わせを行うと便利な場合があります。これは、プロトタイピング、概念実証、または単にグラフィックス アルゴリズムの実装を延期する場合に便利です。

利便性のために UNICODE スペースを使用する場合、少なくとも 1 つの UNICODE スペースには、表示されるフォント、特に実際のスペース文字 (U+0020、ASCII 32) に基づくサイズがあることに注意してください。

UILabel で既定の iOS システム フォントを使用している場合、既定のシステム フォントの特性は、その後の iOS リリースで変更され、アプリの正確な間隔を変更することで、不要な位置ずれが突然発生する可能性があります。これは発生する可能性があり、実際に発生します。たとえば、iOS リリースで以前の iOS システム フォントが "San Francisco" フォントに置き換えられました。

Swift では UNICODE を簡単に指定できます。たとえば、次のようになります。

let six_per_em_space = "\u{2006}"

または、HTML ページのスペースを Interface Builder の UILabel のテキスト フィールドに直接カット アンド ペーストします。

注:添付の写真はHTML ではなくスクリーンショットです。スペースをカット アンド ペーストする場合は、リンク先のページにアクセスしてください。

UNICODE スペース

于 2015-02-11T00:42:51.167 に答える
5

I had a couple of issues with the answers here, such as when you added in the padding, the width of the content was overflowing the box and that I wanted some corner radius. I solved this using the following subclass of UILabel:

#import "MyLabel.h"

#define PADDING 8.0
#define CORNER_RADIUS 4.0

@implementation MyLabel

- (void)drawRect:(CGRect)rect {
 self.layer.masksToBounds = YES;
 self.layer.cornerRadius = CORNER_RADIUS;
 UIEdgeInsets insets = {0, PADDING, 0, PADDING};
 return [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
- (CGSize) intrinsicContentSize {
 CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
 intrinsicSuperViewContentSize.width += PADDING * 2 ;
 return intrinsicSuperViewContentSize ;
}

@end

Hope that's helpful to someone! Note that if you wanted padding on the top and bottom, you would need to change this lines:

UIEdgeInsets insets = {0, PADDING, 0, PADDING};

To this:

UIEdgeInsets insets = {PADDING, PADDING, PADDING, PADDING};

And add this line underneath the similar one for width:

intrinsicSuperViewContentSize.height += PADDING * 2 ;
于 2015-09-14T14:58:48.557 に答える
2

この問題を克服するために私が行ったことの 1 つは、UILabel の代わりに UIButton を使用することでした。次に、Interface Builder の属性インスペクターで、タイトルのエッジをパディングとして使用しました。
ボタンをアクションにアタッチしないと、クリックしても選択されませんが、ハイライトは表示されます。

次のコードを使用して、プログラムでこれを行うこともできます。

UIButton *mButton = [[UIButton alloc] init];
[mButton setTitleEdgeInsets:UIEdgeInsetsMake(top, left, bottom, right)];
[mButton setTitle:@"Title" forState:UIControlStateNormal];
[self.view addSubView:mButton];

このアプローチでも同じ結果が得られますが、可能であればInterface Builderを使用しているため、調査しなかった何らかの理由で機能しない場合がありました。

これはまだ回避策ですが、ハイライトが気にならなければ非常にうまく機能します。役に立つことを願っています

于 2015-01-02T11:11:09.353 に答える
-1

テキストの左側にスペースを追加するよりも具体的なテキストの配置が必要な場合は、必要なインデントの正確な量を示す 2 つ目の空白のラベルをいつでも追加できます。

テキストが 10px のインデントで左に配置されたボタンがあり、インラインで表示するには下にラベルが必要でした。ラベルにテキストと左揃えを付けて x=10 に配置し、同じ背景色で幅 = 10 の小さな秒のラベルを作成し、実際のラベルの横に並べました。

最小限のコードで見栄えがします。すべてを機能させるために AutoLayout をもう少し面倒にするだけです。

于 2014-04-23T18:58:49.673 に答える