UILabel
を下から整列する方法。たとえば、ラベルに3行のテキストを含めることができます。入力テキストが1行の場合、この行はラベルの一番下に来るはずです。理解を深めるには、下の画像を参照してください。オレンジ色の領域は、ラベルの完全なフレームです。現在、1つの行があり、中央に揃えられています。私が望むのは、行数に関係なく、常に下に配置することです。
あなたのアイデアを提案してください。
ありがとうございました。
以下に2つの方法を示します...
1。最初にnumberOfLines
を0に設定し、sizeToFit
のUILabel
プロパティを使用して、UILabel
contentSize
とともに表示します。
yourLabel.numberOfLines = 0;
[yourLabel sizeToFit];
このリンクから詳細を参照してください: ILabel内のテキストを垂直方向に整列
2。別のオプションは、UITextField
の代わりにUILabel
を取り、userInteractionEnabled
をNO
に設定することです。以下のような...
[yourTextField setUserInteractionEnabled:NO];
そしてcontentVerticalAlignment
プロパティを以下のようにbottomに設定します...
[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];
[〜#〜] update [〜#〜]
また、UITextField
を使用すると、複数の行を実現できません。そのため、代わりにUITextView
を使用し、そのuserInteractionEnabled
をNO
に設定できます。次に、以下のコードを使用して、下揃えにします。
CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height);
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
サブクラスUILabel
@interface Label : UILabel
@end
次に、drawTextInRectを次のようにオーバーライドします
@implementation Label
- (void)drawTextInRect:(CGRect)rect
{
if(alignment == top) {
rect.size.height = [self sizeThatFits:rect.size].height;
}
if(alignment == bottom) {
CGFloat height = [self sizeThatFits:rect.size].height;
rect.Origin.y += rect.size.height - height;
rect.size.height = height;
}
[super drawTextInRect:rect];
}
@end
contentMode
プロパティを使用して上下を設定するSwift 4.2バージョン:
class VerticalAlignedLabel: UILabel {
override func drawText(in rect: CGRect) {
var newRect = rect
switch contentMode {
case .top:
newRect.size.height = sizeThatFits(rect.size).height
case .bottom:
let height = sizeThatFits(rect.size).height
newRect.Origin.y += rect.size.height - height
newRect.size.height = height
default:
()
}
super.drawText(in: newRect)
}
}
次に、ラベルを次のように設定します。
let label: VerticalAlignedLabel = UILabel()
label.contentMode = .bottom
私はIBのスーパービューにボトム制約のみを設定しますが、これはコードと最大制約の行数を使用せずに機能します。
同じ問題がありました。 UILabelの下部にテキストを配置する方法は次のとおりです。
- (void)alignLabel:(UILabel *)l withText:(NSString *)text verticalAlignOption:(int)vertAlign{
CGSize stringSize = [text sizeWithFont:l.font constrainedToSize:l.frame.size lineBreakMode:l.lineBreakMode];
switch (vertAlign) {
case 0: // align = top
l.frame = CGRectMake(l.frame.Origin.x,
l.frame.Origin.y,
l.frame.size.width,
stringSize.height
);
break;
case 1: // align = bottom
l.frame = CGRectMake(l.frame.Origin.x,
(l.frame.Origin.y + l.frame.size.height) - stringSize.height,
l.frame.size.width,
stringSize.height
);
break;
case 2: // align = middle
// default
break;
}
l.text = text;
}
次のようなメソッドを呼び出して、下に揃えるだけです:
[self alignLabel:self.mediaTitle withText:@"My text to align" verticalAlignOption:1];
別のオプション:背景色に1つのラベルを使用します。これをoriginalLabelと呼び、テキスト用に別のラベルを使用します(この例ではtextLabelと呼びます)。次に、textLabelの高さとY座標を計算します。
[textLabel sizeToFit];
int height = textLabel.frame.size.height;
int yCoord = originalLabel.frame.Origin.y +
originalLabel.frame.size.height - height;
textLabel.frame = CGRectMake( originalLabel.frame.Origin.x, yCoord,
textLabel.frame.size.width, height);