是否可以自动调整UILabel框/边界的大小以适合包含的文本? (我不在乎它最终会不会比显示屏大)

因此,如果用户输入"hello"或"我的名字真的很长,我希望它适合这个框",它永远不会被截断,标签也会相应地"加宽"?

推荐答案

请看我的要点,我为非常相似的东西做了一个UILabel的分类,我的分类让UILabel拉伸它的高度来显示所有的内容:https://gist.github.com/1005520

或查看此帖子:https://stackoverflow.com/a/7242981/662605

这会拉长高度,但您可以很容易地改变它,以另一种方式工作,然后像这样拉长宽度,这就是我相信您想要做的:

@implementation UILabel (dynamicSizeMeWidth)

- (void)resizeToStretch{
    float width = [self expectedWidth];
    CGRect newFrame = [self frame];
    newFrame.size.width = width;
    [self setFrame:newFrame];
}

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize maximumLabelSize = CGSizeMake(CGRectGetWidth(self.bounds), CGFLOAT_MAX);

    CGSize expectedLabelSize = [[self text] sizeWithFont:[self font] 
                                            constrainedToSize:maximumLabelSize
                                            lineBreakMode:[self lineBreakMode]]; 
    return expectedLabelSize.width;
}

@end

您可以更简单地使用UIView类提供的sizeToFit方法,但是为了安全起见,将行数设置为1.


iOS 6更新

如果您使用的是AutoLayout,那么您有一个内置的解决方案.通过将行数设置为0,框架将适当调整标签大小(增加更多高度),以适合文本.


iOS 8更新

sizeWithFont:已弃用,因此请改用sizeWithAttributes::

- (float)expectedWidth{
    [self setNumberOfLines:1];

    CGSize expectedLabelSize = [[self text] sizeWithAttributes:@{NSFontAttributeName:self.font}];

    return expectedLabelSize.width;
}

Ios相关问答推荐

带外部笔划的圆形进度视图

为什么导航栏在与Style.Page的选项卡栏一起使用时停止工作?

如何在SwiftUI中拥有基于操作系统版本的条件修饰符?

OnTapGesture在其修改的视图外部触发

如何根据SWIFT中的按钮点击更新文本值

Swift Combine和iOS版本限制?

如何在Swift/Combine中从timer.publish属性传递两个参数到任意方法

实现 ListView Builder Widget Flutter 后退按钮不起作用

var name: String 时 print(nil) 和 print(name) 的区别? = 无

为什么@FetchRequest 在删除时不更新和重绘视图?

满足条件时 SwiftUI 动画背景 colored颜色 变化

迁移到 UIKit 生命周期的应用程序不会调用 SceneDelegate

判断Apple LiveText是否可用?

在原生和 phonegap 之间挣扎,简单的应用需求

刷新由 Xcode 7 管理的团队配置文件中的设备?

以编程方式创建按钮并设置背景图像

如何在 UILabel 中找到文本子字符串的 CGRect?

在 React Native 中保存敏感数据

用 NavigationViewController 快速呈现 ViewController

SwiftUI 应用生命周期 iOS14 AppDelegate 代码放哪里?