53

これは、他のすべての「テキストを中央に配置するにはどうすればよいですか」という質問とは少し異なりUILabelます...

テキストを含む がUILabelあり、テキストを の垂直方向の中央に配置したいUILabel。大したことですよね?それがデフォルトです。テキストが動的で、自動縮小がオンになっているため、問題が発生します。テキストが大きくなるにつれて、フォント サイズが縮小されます。この動作が発生します。

ここに画像の説明を入力

UILabel'sフォントのベースラインが移動していないことに注意してください。数値がフレームの垂直方向の中央に配置されるように移動したいと考えています。

簡単ですよね?フレームの元の中心を覚えていますviewDidLoad

    self.workoutTimeCenter = _workoutTimeLabel.center;

そしてsizeToFit、テキストを変更した後に呼び出しますよね?

    [_workoutTimeLabel sizeToFit];
    _workoutTimeLabel.center = _workoutTimeCenter;

そうですね、sizeToFitフレームのサイズを変更して、テキストが縮小せずに収まるようにしました。

ここに画像の説明を入力

UILabelベースラインと自動縮小を考慮しながら、テキストを垂直方向に中央揃えするにはどうすればよいですか? (注、iOS5以降のソリューションは問題なく、 iOS6以降のソリューションにも対応できます。)

4

5 に答える 5

114

私の経験では、-[UILabel baselineAdjustment]プロパティを設定するだけで、UIBaselineAdjustmentAlignCenters説明している効果を得ることができます。

ドキュメントから:

ベースライン調整

ラベルに収まるようにテキストを縮小する必要がある場合に、テキストのベースラインを調整する方法を制御します。

@property(nonatomic) UIBaselineAdjustment baselineAdjustment

討論

adjustsFontSizeToFitWidthプロパティが に設定されている場合YES、このプロパティは、フォント サイズの調整が必要な状況でのテキスト ベースラインの動作を制御します。このプロパティのデフォルト値は ですUIBaselineAdjustmentAlignBaselines。このプロパティは、numberOfLinesプロパティが に設定されて いる場合にのみ有効1です。

UIBaselineAdjustmentAlignCenters
境界ボックスの中心を基準にしてテキストを調整します。

編集:これを示す完全なビューコントローラーを追加します:

@interface TSViewController : UIViewController
@end

@implementation TSViewController

- (void) addLabelWithFrame: (CGRect) f baselineAdjustment: (UIBaselineAdjustment) bla
{
    UILabel* label = [[UILabel alloc] initWithFrame: f];
    label.baselineAdjustment = bla;
    label.adjustsFontSizeToFitWidth = YES;
    label.font = [UIFont fontWithName: @"Courier" size: 200];
    label.text = @"00";
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = [UIColor lightGrayColor];
    label.userInteractionEnabled = YES;
    [self.view addSubview: label];

    UIView* centerline = [[UIView alloc] initWithFrame: CGRectMake(f.origin.x, f.origin.y+(f.size.height/2.0), f.size.width, 1)];
    centerline.backgroundColor = [UIColor redColor];
    [self.view addSubview: centerline];

    UITapGestureRecognizer* tgr = [[UITapGestureRecognizer alloc] initWithTarget: self action: @selector(onTap:)];
    [label addGestureRecognizer: tgr];
}

- (void) viewDidLoad
{
    [super viewDidLoad];

    [self addLabelWithFrame: CGRectMake(0, 0, 320, 200)
         baselineAdjustment: UIBaselineAdjustmentAlignCenters];

    [self addLabelWithFrame: CGRectMake(0, 220, 320, 200)
         baselineAdjustment: UIBaselineAdjustmentAlignBaselines];
}

- (void) onTap: (UITapGestureRecognizer*) tgr
{
    UILabel* label = (UILabel*)tgr.view;
    NSString* t = [label.text stringByAppendingString: @":00"];
    label.text = t;
}

@end
于 2013-08-06T18:20:47.927 に答える
2
-(void)fitVerticallyToLabel:(UILabel *)lbl
{
    CGFloat fontSize = lbl.frame.size.width / lbl.text.length;
    [lbl setFont:[UIFont fontWithName:@"Helvetica-Bold" size:fontSize]];

    CGRect rect = lbl.frame;
    rect.origin.y += rect.size.height - fontSize;
    rect.size.height = fontSize;
    [lbl setFrame:rect];
}

使用方法: テキストをラベルに設定した後、このメソッドを呼び出します。

    label.text = @"text";
    [self fitVerticallyToLabel:label];

ここに画像の説明を入力ここに画像の説明を入力

注: UILabel を xib から取得しました。その場合、テキストの配置を設定する必要があります NSTextAlignMentCenter

于 2013-08-06T10:36:12.193 に答える
1

このロジックを実装してみてください:

-(void)adjustLabel1Text1:(NSString *)text1 
{
    UILabel *lbl_first = [UIFont fontWithName:@"Helvetica" size:12];



    text1 = [text1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];


    float hedingLblHeight = [self calculateHeightOfTextFromWidth:text1 : [UIFont fontWithName:@"Helvetica" size:12] :118 :UILineBreakModeWordWrap];

    lbl_first.text=text1;


    [lbl_first setFrame:CGRectMake(lbl_first.frame.origin.x, lbl_first.frame.origin.y, 118, hedingLblHeight)];
    lbl_first.lineBreakMode = UILineBreakModeWordWrap;
    lbl_first.numberOfLines = 0;
    [lbl_first sizeToFit];




//////////Adjust the lable or any UIControl below this label accordingly.

    float endResultHeight=[self calculateHeightOfTextFromWidth:text2 : [UIFont fontWithName:@"Helvetica" size:15] :299 :UILineBreakModeWordWrap];

    if(hedingLblHeight>secondImgTitleHeight)
    {
    [lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];
    }
    else
    {
        [lbl_endResult setFrame:CGRectMake(lbl_endResult.frame.origin.x, lbl_first.frame.origin.y+lbl_first.frame.size.height+5, 299, endResultHeight)];

    }

    lbl_endResult.lineBreakMode=UILineBreakModeWordWrap;
    lbl_endResult.numberOfLines = 0;
    [lbl_endResult sizeToFit];



}

-(float) calculateHeightOfTextFromWidth:(NSString*)text : (UIFont*) withFont:(float)width :(UILineBreakMode)lineBreakMode
{

    CGSize suggestedSize = [text sizeWithFont:withFont constrainedToSize:CGSizeMake(width, FLT_MAX) lineBreakMode:lineBreakMode];

    return suggestedSize.height;
}

それは私を大いに助けました.それがあなたのために働くことを願っています.

于 2013-08-06T09:43:40.117 に答える
-5

試す

yourLabel.textAlignment = UITextAlignmentCenter;
于 2013-07-31T13:48:41.447 に答える