我有一个UILabel,空格可以放两行文字.有时,当文本太短时,此文本会显示在标签的垂直中心.

如何垂直对齐文本,使其始终位于UILabel的顶部?

推荐答案

无法在UILabel上设置垂直对齐,但可以通过更改标签的边框来获得相同的效果.我把标签做成了橙色,这样你就能清楚地看到发生了什么.

以下是完成此操作的快速而简单的方法:

    [myLabel sizeToFit];

sizeToFit挤压标签


如果标签的文本较长,可构成多行,请将numberOfLines设置为0(这里的零表示不限行数).

    myLabel.numberOfLines = 0;
    [myLabel sizeToFit];


Longer Version

我会用代码制作我的标签,这样你就能看到发生了什么.您也可以在Interface Builder中设置大部分内容.我的设置是一个基于视图的应用程序,带有我在Photoshop中制作的背景图像来显示页边距(20分).标签是诱人的橙色,所以你可以看到尺寸是怎么回事.

- (void)viewDidLoad
{
    [super viewDidLoad];

    // 20 point top and left margin. Sized to leave 20 pt at right.
    CGRect labelFrame = CGRectMake(20, 20, 280, 150);
    UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
    [myLabel setBackgroundColor:[UIColor orangeColor]];

    NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
    [myLabel setText:labelText];

    // Tell the label to use an unlimited number of lines
    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    [self.view addSubview:myLabel];
}

对于居中或右对齐的文本,使用sizeToFit会产生一些限制.以下是发生的情况:

    // myLabel.textAlignment = NSTextAlignmentRight;
    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

在此处输入图像描述

标签的大小仍然是固定的左上角.您可以将原始标签的宽度保存在一个变量中,并将其设置为sizeToFit后,或者为其指定一个固定的宽度以应对这些问题:

    myLabel.textAlignment = NSTextAlignmentCenter;

    [myLabel setNumberOfLines:0];
    [myLabel sizeToFit];

    CGRect myFrame = myLabel.frame;
    // Resize the frame's width to 280 (320 - margins)
    // width could also be myOriginalLabelFrame.size.width
    myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
    myLabel.frame = myFrame;

标签对齐


请注意,sizeToFit将遵守初始标签的最小宽度.如果你从一个sizeToFit宽的标签开始,并在上面打sizeToFit,它会给你一个sizeToFit宽(或稍小)的标签(可能非常高).在调整大小之前,您可能需要将标签设置为所需的最小宽度.

通过调整框架宽度来更正标签对齐方式

其他一些需要注意的事项:

lineBreakMode是否受到尊重取决于它是如何设定的.NSLineBreakByTruncatingTail(默认值)在sizeToFit之后被忽略,其他两种截断模式(头部和中间)也是如此.NSLineBreakByClipping也被忽略.NSLineBreakByCharWrapping像往常一样工作.框架宽度仍会缩小以适合最右边的字母.


100 gave a fix for NIBs and Storyboards using Auto Layout in the comments:

如果标签作为使用自动布局的ViewController的view的子视图包含在笔尖或情节提要中,则将sizeToFit调用放入viewDidLoad中将不起作用,因为自动布局在调用viewDidLoad之后调整子视图的大小和位置,并将立即undo撤消sizeToFit调用的效果.然而,从viewDidLayoutSubviews will工作范围内拨打sizeToFit.


My Original Answer (for posterity/reference):

这使用NSString方法sizeWithFont:constrainedToSize:lineBreakMode:来计算适合字符串所需的框架高度,然后设置原点和宽度.

使用要插入的文本调整标签框架的大小.这样您可以容纳任意数量的线路.

CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont 
        constrainedToSize:maximumSize 
        lineBreakMode:self.dateLabel.lineBreakMode];

CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);

self.dateLabel.frame = dateFrame;

Ios相关问答推荐

滚动时突出显示工具栏项目

如何在iOS 17中拦截UITextView中的链接点击?UITextItemInteraction已弃用

SWIFT-仅解码感兴趣的元素

clang:错误:SDK 路径中不包含libarclite

如何在用户点击的位置使用SceneKit渲染球体?

在Xcode 15中为具有@Binding的视图创建SwiftUI #预览的方法

SwiftUI - 如何从主题感知命名 colored颜色 中获取正确的 RGB 值?

在 SwiftUI 中,绑定应该放在 ViewModel 中吗?

SwiftUI 动画:为什么容器视图在移动?我很难理解这种行为

通过 Rosetta 打开模拟器 xcode 14 以修复滚动

我可以在 Apple-Watch 上使用 iPhone 的摄像头扫描 SwiftUi 中的二维码(例如用于登录)吗

如何为视图的 colored颜色 和宽度设置动画?

无法为 Flutter 项目构建 ipa [CocoaPods 找不到 pod "GoogleAppMeasurement" 的兼容版本:]

有哪些可靠的机制可以防止 CoreData CloudKit 中的数据重复?

界面生成器 - 无法从路径加载设计对象(空)

不变违规:应用程序 AwesomeProject 尚未注册使用静态 jsbundle 为 iOS 设备构建时

在 iPhone 应用程序中使用 SSL - 出口合规性

在 iOS 8.1 模拟器上更改语言不起作用

在 iOS 上编写文件

Swift:如何在设备旋转后刷新 UICollectionView 布局