iOS基础 --- UILabel的使用及对齐方式
问题一
如何返回单行文字的高度
font.lineHeight,如label.font.lineHeight,可button.titleLabel.font.lineHeight
问题二
我有一个UILabel
高度最多能显示两行,如果里面内容只有一行,它是垂直居中的。怎么能让它顶端对齐呢?
回答
答案1:用sizeToFit
改变UILabel
的高度
nevan king,1969 赞
没法直接改变UILabel
的垂直对齐方式,但是把 label 的 frame 高度改小也能实现相同的效果。为了看得清楚,我把 label 标为橘黄色了。
最简单的做法是:
[myLabel sizeToFit];
如果内容长度超过一行,把numberOfLines
设成 0(就是不限制行数)。
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
有一个问题是,如果你文字是水平居中的,那么执行完sizeToFit
后 frame 宽度也缩小了,文字会缩到左上角。解决方法是把 label 的宽度先存起来,执行完sizeToFit
之后再设回来。
另外要注意,sizeToFit
会把 label 的当前宽度当做最大宽度,执行之后宽度只会比变窄,不会变宽。
对于用 Auto Layout 的 NIB 和 Storyboard,Mark Amery 在评论中补充了解决方案:
如果 nib 或 storyboard 里用了 autoLayout,那么在
viewDidLoad
调sizeToFit
是不管用的,因为实际顺序是先执行viewDidLoad
再执行 autoLayout,执行 autoLayout 的时候会把 sizeToFit 的结果覆盖掉。
不过,在viewDidLayoutSubviews
里调sizeToFit
是管用的。
答案2:末尾补充换行 Purple Ninja Girl ,44 赞 一个更简单的办法(也是比较脏的办法)是把UILabel的 line break mode 设为 Clip,然后直接在末尾加一些换行。 myLabel.lineBreakMode = UILineBreakModeClip;myLabel.text = [displayString stringByAppendingString:"\n\n\n\n"]; 这个方法不是万能的——尤其是如果文字超出范围,需要在末尾显示『…』就不行了。 答案3:用UITextField代替UILabel jowie ,47 赞 用UITextField取代UILabel,默认就是顶端对齐的。可以把userInterationEnabled设为NO,让它不能滚动。 答案4:重写UILabel的drawInRect方法 Martin Wickman,21 赞 创建一个UILabel的子类,用起来非常方便: // TopLeftLabel.h #import <Foundation/Foundation.h> @interface TopLeftLabel : UILabel { } @end // TopLeftLabel.m #import "TopLeftLabel.h" @implementation TopLeftLabel - (id)initWithFrame:(CGRect)frame { return [super initWithFrame:frame]; } - (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines { CGRect textRect = [super textRectForBounds:bounds limitedToNumberOfLines:numberOfLines]; textRect.origin.y = bounds.origin.y; return textRect; } -(void)drawTextInRect:(CGRect)requestedRect { CGRect actualRect = [self textRectForBounds:requestedRect limitedToNumberOfLines:self.numberOfLines]; [super drawTextInRect:actualRect]; } @end
将来的自己,会感谢现在不放弃的自己!