您的位置:首页 > 产品设计 > UI/UE

[爆栈热门 iOS 问题] 让 UILabel 顶端对齐

2017-01-24 14:45 531 查看
系列文集:爆栈热门 iOS 问题目录在此。仓薯翻译,欢迎指正:)


问题

我有一个
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


详细说明见这里

原文地址:Vertically align text within a UILabel

本文地址:http://www.jianshu.com/p/429470186933

系列文集:爆栈热门 iOS 问题

译者:@戴仓薯
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS uilabel sizeToFit