用UILabel垂直居中自动收缩
这与其他所有的“我如何在UILabel
文本的中心”这个问题有点不同…
我有一个UILabel
与一些文本,我想在UILabel
垂直居中文本。 有什么大不了的,对吧? 这是默认的。 问题来了,因为我的文字是dynamic的,我有自动打开。 随着文字变大,字号缩小。 你得到这个行为。
请注意,字体基线没有移动,我希望它移动,因此数字在UILabel's
框架中垂直居中。
很简单,对吧? 我只记得viewDidLoad
的框架的原始中心
self.workoutTimeCenter = _workoutTimeLabel.center;
然后我改变文本后调用sizeToFit
,对吧?
[_workoutTimeLabel sizeToFit]; _workoutTimeLabel.center = _workoutTimeCenter;
那么, sizeToFit
,我猜,确切地说,它应该做的,调整框架,使文本适合,而不是缩小!
如何在尊重基线和自动收缩的同时将文本垂直居中放在UILabel
? (注意, iOS5和更高版本的解决scheme是好的,我甚至可以处理iOS6和更高版本的解决scheme。)
根据我的经验,您可以将-[UILabel baselineAdjustment]
属性设置为UIBaselineAdjustmentAlignCenters
以达到您所描述的效果。
从文档 :
baselineAdjustment
当文本需要缩小以适应标签时,控制如何调整文本基线。
@property(nonatomic) UIBaselineAdjustment baselineAdjustment
讨论
如果
adjustsFontSizeToFitWidth
属性设置为YES
,那么在需要调整字体大小的情况下,此属性将控制文本基线的行为。 此属性的默认值是UIBaselineAdjustment
AlignBaselines
。 此属性仅在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
-(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];
注意:我ahev从xib拿到了UILabel。 你也可以以编程方式使用它,在这种情况下,你将不得不设置其文本alignmentNSTextAlignMentCenter
尝试实现这个逻辑:
-(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; }
它帮了我很多,希望它适合你。
在IB工作时,一定要将基线alignment到中心位置
注意:换行符不能用于换行,所以不能用多行(很好,将换行符设置为截尾)
尝试
yourLabel.textAlignment = UITextAlignmentCenter;