系列文集:爆栈热门 iOS 问题。目录在此。仓薯翻译,欢迎指正:)
问题
我有一个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
详细说明见这里。
系列文集:爆栈热门 iOS 问题
译者:@戴仓薯