默認UILabel是垂直居中對齊的,如果你的UILabel高度有多行,當內容少的時候,會自動垂直居中。
如下圖所示(圖片來自stackoverflow):
比較郁悶的是,UILabel并不提供設置其垂直對齊方式的選項。所以如果你想讓你的文字頂部對齊,那么就需要自己想辦法了。
stackoverflow.com 上提供了幾種方法來達到頂部對齊的效果。
方法一
在顯示文字時,首先計算顯示當前的文字需要多寬和多高,然后將對應的UILabel的大小改變成對應的寬度和高度。此方法的相示意圖如下:
在顯示文字時,首先計算顯示當前的文字需要多寬和多高,然后將對應的UILabel的大小改變成對應的寬度和高度。此方法的相示意圖如下:
12345678
CGSizemaximumSize=CGSizeMake(300,9999);NSString*dateString=@"The date today is January 1st, 1999";UIFont*dateFont=[UIFontfontWithName:@"Helvetica"size:14];CGSizedateStringSize=[dateStringsizeWithFont:dateFontconstrainedToSize:maximumSizelineBreakMode:self.dateLabel.lineBreakMode];CGRectdateFrame=CGRectMake(10,10,300,dateStringSize.height);self.dateLabel.frame=dateFrame;
方法二
此方法更加簡單粗暴,但是很有效。其方法是在文本后面加多一些\n。
需要注意的是,\n后還得加至少一個空格,否則多余的\n會被UILabel忽略。從這一點上看,UILabel似乎又過于“聰明”了。
該方法的示意圖如下:
該方法的代碼如下:
12
for(inti=0;i<newLinesToPad;i++)self.text=[self.textstringByAppendingString:@"\n"];
方法三
最正統的方法,利用objective-c的category特性,修改UILabel的繪制代碼。示例代碼如下:
1234567891011121314151617181920212223242526272829
// -- file: UILabel+VerticalAlign.h#pragma mark VerticalAlign@interfaceUILabel(VerticalAlign)-(void)alignTop;-(void)alignBottom;@end// -- file: UILabel+VerticalAlign.m@implementationUILabel(VerticalAlign)-(void)alignTop{CGSizefontSize=[self.textsizeWithFont:self.font];doublefinalHeight=fontSize.height*self.numberOfLines;doublefinalWidth=self.frame.size.width;//expected width of labelCGSizetheStringSize=[self.textsizeWithFont:self.fontconstrainedToSize:CGSizeMake(finalWidth,finalHeight)lineBreakMode:self.lineBreakMode];intnewLinesToPad=(finalHeight-theStringSize.height)/fontSize.height;for(inti=0;i<newLinesToPad;i++)self.text=[self.textstringByAppendingString:@"\n"];}-(void)alignBottom{CGSizefontSize=[self.textsizeWithFont:self.font];doublefinalHeight=fontSize.height*self.numberOfLines;doublefinalWidth=self.frame.size.width;//expected width of labelCGSizetheStringSize=[self.textsizeWithFont:self.fontconstrainedToSize:CGSizeMake(finalWidth,finalHeight)lineBreakMode:self.lineBreakMode];intnewLinesToPad=(finalHeight-theStringSize.height)/fontSize.height;for(inti=0;i<newLinesToPad;i++)self.text=[NSStringstringWithFormat:@"\n%@",self.text];}@end
我選了簡單暴力的方法二,你呢?