UILabel顶部对齐解决方法(转载)

问题

我有一个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,那么在viewDidLoadsizeToFit是不管用的,因为实际顺序是先执行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:重写UILabeldrawInRect方法

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

文/戴仓薯(简书作者)
原文链接:http://www.jianshu.com/p/429470186933
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。

时间: 2024-10-26 23:15:54

UILabel顶部对齐解决方法(转载)的相关文章

UILabel文本垂直顶部对齐的方法

也不知道为什么UILabel本身没有提供文本垂直顶部对齐的方法,真的有点晕.我们创建一个简单的UILabel来看看: [box type="info"] UILabel *myLabel = [[UILabel alloc]initWithFrame:CGRectMake(10, 10, 300, 100)]; [myLabel setText:@"苹果iOS(iphone Operation System)是由苹果公司开发的手持设备操作系统.苹果公司最早于2007年1月9日

ScrollView下嵌套GridView或ListView默认不在顶部的解决方法

当ScrollView下嵌套GridView或ListView时,如果内容超过一屏默认位置不在ScrollView的顶部,用scrollViewMsg.scrollTo(0,0)设置也不起作用,这是因为嵌套GridView或ListView获了焦点,解决方法有如下几种: 方法1把ScrollView里的第一个View获取焦点: baseView.setFocusable(true); baseView.setFocusableInTouchMode(true); baseView.request

Input标签与图片按钮水平对齐解决方法

昨日,小编的朋友就来咨询,说他也遇到了这个问题,并且使用margin.padding等Css语法,都没有解决. 解决方法其实很简单,我们只要加上vertical-align:middle属性就可以了. 来看实例: 提示:您可以先修改部分代码再运行 页面直接摆放一个input文本框与ImageButton图片按钮,但是发现没有对齐: 复制代码 代码如下: <input type="text" id="txtQty" /> <asp:ImageButt

关于angular跳转路由之后不能自动回到顶部的解决方法

Question: angular2 scroll top on router change 当我们在第一个路由滑动到底部当我们点击导航跳转到另一个路由时页面没有回到顶部而是保持上一个路由的滚动位置,基本的解决办法有两种. 第一种解决方法是在组建的ngOnIinit()中进行调换路由后的重置 import { Component, OnInit } from '@angular/core'; import { Router, NavigationEnd } from '@angular/rout

引用账户当前已锁定,且可能无法登录”--问题的解决方法(转载)

indows 7下面,登录到另外一个AD域里面更改网络密码时遇到了错误,"引用账户当前已锁定,且可能无法登录",如下图,经反复摸索,最后找到解决方法. 点击"开始"->"运行",输入gpedit.msc并回车打开"组策略",依次展开:计算机配置-windows设置-安全设置-帐户策略-帐户锁定策略中找"帐户锁定阀值",双击,数值设置选0,确定.

Firefox火狐Flash插件卡死问题完美解决方法(转载)

http://www.ihacksoft.com/firefox-flash-protectedmode.html 其实这个问题以前就出现过,而最近该问题又出现在最新的 Windows 8.1 系统中.由于从Flash Player 11.3开始,新版本引入了安全沙箱技术,而它一直就是火狐无法正常运行的主要原因.由于Flash插件的沙箱技术作用有限,很多时侯根本无法保证用户的 上网安全.因此一劳永逸的解决方法就是禁用Flash插件的沙箱技术,通过其他的方式方法来保护用户的上网安全.现在首先打开系

Ubuntu 14.04中root 密码忘记解决方法[转载+17.04亲测可用]

Ubuntu 14.04中root 密码忘记解决方法 Ubuntu 14.04中root 密码忘记解决方法 方法一: 如果用户具有sudo权限,那么直接可以运行如下命令: #sudo su root #passwd #更改密码 或者直接运行sudo passwd root命令就可以直接更改root密码. 有关sudo su的区别: 1.共同点:都是root用户的权限: 2.不同点:su仅仅取得root权限,工作环境不变,还是在切换之前用户的工作环境:sudo是完全取得root的权限和root的工

让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 --转载

最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在chrome,firefox,safari,opera,360浏览器(极速模式).搜狗浏览器等浏览器下均没有问题,而在IE8及IE11下发现样式无法显示,然后各种百度啊,最后在 雅朋网 的一个网友帖子的帮助下解决了问题,也参考了 千寻学习网 的资料,先将解决方法总结如下: 首先需要确保你的HTML页面开始部分要有DOCTYPE声明.DOCTYPE告诉浏览器使用什么样的HTML或XHTML规范来解析HTM

Asp.net MVC Razor常见问题及解决方法(转载&gt;云中客)

没有经验的童鞋就是这样磕磕碰碰出来的经验. 1,Datatype的错误提示消息无法自定义 这也许是Asp.net MVC的一个Bug.ViewModel中定义了DataType为Date字段: 1 2 3 [Required(ErrorMessage = "Birthday must be input!")] [DataType(DataType.Date, ErrorMessage = "Please enter a date like(2017-07-19)."