問題一
如何返回單行文字的高度
font.lineHeight,如label.font.lineHeight,可button.titleLabel.font.lineHeight
問題二
我有一個UILabel高度最多能顯示兩行,如果里面內容只有一行,它是垂直居中的。怎么能讓它頂端對齊呢?
回答
答案1:用sizeToFit改變UILabel的高度
nevan king,1969 贊
沒法直接改變UILabel的垂直對齊方式,但是把 label 的 frame 高度改小也能實現相同的效果。為了看得清楚,我把 label 標為橘黃色了。
最簡單的做法是:
[myLabel sizeToFit];
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
