web-dev-qa-db-ja.com

UILabelテキストを下から揃える方法は?

UILabelを下から整列する方法。たとえば、ラベルに3行のテキストを含めることができます。入力テキストが1行の場合、この行はラベルの一番下に来るはずです。理解を深めるには、下の画像を参照してください。オレンジ色の領域は、ラベルの完全なフレームです。現在、1つの行があり、中央に揃えられています。私が望むのは、行数に関係なく、常に下に配置することです。

enter image description here

あなたのアイデアを提案してください。

ありがとうございました。

33
NSUserDefault

以下に2つの方法を示します...

1。最初にnumberOfLinesを0に設定し、sizeToFitUILabelプロパティを使用して、UILabelcontentSizeとともに表示します。

yourLabel.numberOfLines = 0;

[yourLabel sizeToFit];

このリンクから詳細を参照してください: ILabel内のテキストを垂直方向に整列

2。別のオプションは、UITextFieldの代わりにUILabelを取り、userInteractionEnabledNOに設定することです。以下のような...

[yourTextField setUserInteractionEnabled:NO];

そしてcontentVerticalAlignmentプロパティを以下のようにbottomに設定します...

[yourTextField setContentVerticalAlignment:UIControlContentVerticalAlignmentBottom];

[〜#〜] update [〜#〜]

また、UITextFieldを使用すると、複数の行を実現できません。そのため、代わりにUITextViewを使用し、そのuserInteractionEnabledNOに設定できます。次に、以下のコードを使用して、下揃えにします。

CGFloat topCorrect = ([label bounds].size.height - [label contentSize].height);
topCorrect = (topCorrect <0.0 ? 0.0 : topCorrect);
label.contentOffset = (CGPoint){.x = 0, .y = -topCorrect};
22
Paras Joshi

サブクラス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
19
Dustin

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
11
Dunbar

私はIBのスーパービューにボトム制約のみを設定しますが、これはコードと最大制約の行数を使用せずに機能します。

3
Tobe

同じ問題がありました。 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];
0
barrast

別のオプション:背景色に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);
0
autremoi