ios 使用自动收缩在 UILabel 中垂直居中
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/17972036/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Center vertically in UILabel with autoshrink
提问by Paul Cezanne
This is a little different from all the other "How do I center the text in a UILabel
" questions here...
这与UILabel
此处的所有其他“我如何将文本居中”问题略有不同......
I have a UILabel
with some text in it, I want to center the text vertically in the UILabel
. What's the big deal, right? That's the default. The problem comes because my text is dynamic and I have autoshrink turn on. As the text grows larger, the font size shrinks. You get this behavior.
我有UILabel
一些文本,我想将文本垂直居中在UILabel
. 有什么大不了的,对吧?这是默认设置。问题出现是因为我的文本是动态的,而且我打开了自动收缩。随着文本变大,字体大小会缩小。你会得到这种行为。
Notice that the font baseline has not moved, I want it to move so the numbers are centered vertically in the UILabel's
frame.
请注意,字体基线没有移动,我希望它移动以便数字在UILabel's
框架中垂直居中。
Easy, right? I just remember the frame's original center in viewDidLoad
很简单,对吧?我只记得框架的原始中心viewDidLoad
self.workoutTimeCenter = _workoutTimeLabel.center;
and then I call sizeToFit
after I change the the text, right?
然后我sizeToFit
在更改文本后调用,对吗?
[_workoutTimeLabel sizeToFit];
_workoutTimeLabel.center = _workoutTimeCenter;
Well, sizeToFit
did, I guess, exactly what it was supposed to do, resize the frame so the text fits without shrinking!
好吧,sizeToFit
我想,正是它应该做的,调整框架的大小,使文本适合而不收缩!
How can I vertically center the text in a UILabel
while respecting baselines and autoshrink? (Note, an iOS5and later solution is fine and I can even deal with an iOS6and later solution.)
如何UILabel
在尊重基线和自动收缩的同时垂直居中文本?(请注意,iOS5及更高版本的解决方案很好,我什至可以处理iOS6及更高版本的解决方案。)
回答by TomSwift
In my experience you can just set the -[UILabel baselineAdjustment]
property to UIBaselineAdjustmentAlignCenters
to achieve the effect you're describing.
根据我的经验,您只需将-[UILabel baselineAdjustment]
属性设置为UIBaselineAdjustmentAlignCenters
即可实现您所描述的效果。
From the docs:
从文档:
baselineAdjustment
Controls how text baselines are adjusted when text needs to shrink to fit in the label.
@property(nonatomic) UIBaselineAdjustment baselineAdjustment
Discussion
If the
adjustsFontSizeToFitWidth
property is set toYES
, this property controls the behavior of the text baselines in situations where adjustment of the font size is required. The default value of this property isUIBaselineAdjustment
AlignBaselines
. This property is effective only when thenumberOfLines
property is set to1
.
基线调整
控制文本需要缩小以适应标签时如何调整文本基线。
@property(nonatomic) UIBaselineAdjustment baselineAdjustment
讨论
如果该
adjustsFontSizeToFitWidth
属性设置为YES
,则在需要调整字体大小的情况下,此属性控制文本基线的行为。此属性的默认值为UIBaselineAdjustment
AlignBaselines
。此属性仅在numberOfLines
设置为 时有效1
。
and
和
UIBaselineAdjustmentAlignCenters
Adjust text based relative to the center of its bounding box.
UIBaselineAdjustmentAlignCenters
相对于其边界框的中心调整文本。
EDIT: adding a full view-controller that demonstrates this:
编辑:添加一个完整的视图控制器来演示这一点:
@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
回答by Peter Lapisu
回答by TheTiger
-(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];
}
How to Use: Call this method after setting the text to your label.
如何使用:将文本设置为标签后调用此方法。
label.text = @"text";
[self fitVerticallyToLabel:label];
Note: I ahev taken UILabel from xib. You can take it programmatically too in that case you will have to set its text alignment NSTextAlignMentCenter
注意:我从 xib 中获取了 UILabel。您也可以以编程方式使用它,在这种情况下,您必须设置其文本对齐方式 NSTextAlignMentCenter
回答by Aniket Kote
Try to implement this logic:
尝试实现这个逻辑:
-(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;
}
It has helped me a lot.Hope it works for you.
它对我帮助很大。希望它对你有用。
回答by Nasir
Try
尝试
yourLabel.textAlignment = UITextAlignmentCenter;