背景色でを作成する必要があり、UILabel
左/右の先頭/末尾の水平パディングを追加したいと思います。
しかし、私が見つけたすべての解決策は厄介なハックのようです.
iOS 5 以降でこれを達成するための「標準的な」方法は何ですか?
私のシナリオを説明するスクリーンショット:
最も重要な部分は、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))
}
文字列にもスペース文字を追加します。それは貧乏人のパディングです:)
また
カスタムの背景ビューを使用しますが、それが必要ない場合は、スペースだけが他の簡単なオプションです...
または、カスタム ラベルを作成します。coretext を介してテキストをレンダリングする
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 ではなくスクリーンショットです。スペースをカット アンド ペーストする場合は、リンク先のページにアクセスしてください。
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 ;
この問題を克服するために私が行ったことの 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を使用しているため、調査しなかった何らかの理由で機能しない場合がありました。
これはまだ回避策ですが、ハイライトが気にならなければ非常にうまく機能します。役に立つことを願っています
テキストの左側にスペースを追加するよりも具体的なテキストの配置が必要な場合は、必要なインデントの正確な量を示す 2 つ目の空白のラベルをいつでも追加できます。
テキストが 10px のインデントで左に配置されたボタンがあり、インラインで表示するには下にラベルが必要でした。ラベルにテキストと左揃えを付けて x=10 に配置し、同じ背景色で幅 = 10 の小さな秒のラベルを作成し、実際のラベルの横に並べました。
最小限のコードで見栄えがします。すべてを機能させるために AutoLayout をもう少し面倒にするだけです。