UILabelをサブクラス化せずに使い続けたい場合、Mundiは明確な解決策を提供します。
あるいは、UILabelをUIViewでラップするのを避けたい場合は、UITextViewを使用してUIEdgeInsets(パディング)またはサブクラスUILabelの使用を有効にして、UIEdgeInsetsをサポートできます。
UITextViewを使用すると、インセット(OBJ-C)を提供するだけで済みます。
textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);
または、UILabelをサブクラス化する場合、このアプローチの例は、drawTextInRectメソッド
(OBJ-C)をオーバーライドすることです。
- (void)drawTextInRect:(CGRect)uiLabelRect {
UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}
さらに、TOP、LEFT、BOTTOM、RIGHTのインセット変数を使用して、新しいサブクラス化されたUILabelを提供できます。
コードの例は次のとおりです。
.h(OBJ-C)
float topInset, leftInset,bottomInset, rightInset;
.m(OBJ-C)
- (void)drawTextInRect:(CGRect)uiLabelRect {
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}
編集#1:
私が見たことから、それをサブクラス化するとき、UILabelの組み込みコンテンツサイズをオーバーライドする必要があるようです。
したがって、次のように組み込みコンテンツサイズをオーバーライドする必要があります。
- (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のサイズを更新してエッジインセットと一致させ、参照した複数行の必要性をカバーします。
#2を編集
少し検索したところ、このGistがIPInsetLabelで見つかりました。これらのソリューションがどれも機能しない場合は、試してみることができます。
#3を編集
この問題について同様の質問(重複)がありました。
利用可能なソリューションの完全なリストについては、この回答を参照してください:UILabelテキストマージン