iOS:UIButton根据文本长度调整大小

Oh *_*Boy 126 uibutton ios

在界面构建器中,按住Command+ =将调整按钮的大小以适合其文本.我想知道在按钮添加到视图之前是否可以以编程方式执行此操作.

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button.titleLabel setFont:[UIFont fontWithName:@"Arial-BoldMT" size:12]];
[button addTarget:self action:@selector(buttonTapped:) forControlEvents:UIControlEventTouchUpInside];
// I need to know the width needed to accomodate NSStringVariable
[button setTitle:NSStringVariable forState:UIControlStateNormal]; 
// So that I can set the width property of the button before addSubview
[button setFrame:CGRectMake(10, 0, width, fixedHeight)];
[subNavigation addSubview:button];
Run Code Online (Sandbox Code Playgroud)

Dan*_*Ray 128

在UIKit中,NSString类中还有一些内容可以从给定的NSString对象中获取它在以某种字体呈现时所占用的大小.

文档在这里.

简而言之,如果你去:

CGSize stringsize = [myString sizeWithFont:[UIFont systemFontOfSize:14]]; 
//or whatever font you're using
[button setFrame:CGRectMake(10,0,stringsize.width, stringsize.height)];
Run Code Online (Sandbox Code Playgroud)

...您将按钮的框架设置为您正在渲染的字符串的高度和宽度.

您可能想要在CGSize周围尝试一些缓冲区空间,但您将在正确的位置开始.

  • sizeWithFont在iOS 7.0中已弃用.使用sizeWithAttributes:而不是 (19认同)
  • 我强烈建议不再使用框架,但仅限于使用约束. (6认同)
  • 看起来iOS默认填充是12px,8px. (4认同)

Dan*_*ood 99

在代码中执行此操作的方法是:

[button sizeToFit];
Run Code Online (Sandbox Code Playgroud)

如果您是子类并希望添加额外规则,则可以覆盖:

- (CGSize)sizeThatFits:(CGSize)size;
Run Code Online (Sandbox Code Playgroud)

  • sizeToFit完全适用于UIButton或UILabel等标准控件.如果您在自定义UIView上执行此操作,则需要实现` - (CGSize)sizeThatFits:(CGSize)size`. (5认同)
  • `sizeToFit()`不尊重标题边缘插入. (4认同)
  • 它只适用于你在设置文本后放置它,否则没有足够的信息应该有多大:`[button setTitle:@"你的文字在这里"forState:UIControlStateNormal];``[button sizeToFit];`如果您稍后更新文本,请不要忘记再次调用它. (3认同)

gup*_*ron 31

如果您的按钮是使用Interface Builder制作的,并且您要在代码中更改标题,则可以执行以下操作:

[self.button setTitle:@"Button Title" forState:UIControlStateNormal];
[self.button sizeToFit];
Run Code Online (Sandbox Code Playgroud)


Jua*_*ero 22

迅速:

这里最重要的是,当你将调用.sizeToFit(),它应该是设置要显示的文本,以便它可以读取所需的大小,如果您稍后更新文本,然后再调用它之后.

var button = UIButton()
button.setTitle("Length of this text determines size", forState: UIControlState.Normal)
button.sizeToFit()
self.view.addSubview(button)
Run Code Online (Sandbox Code Playgroud)


Tad*_*Tad 16

要使用autolayout完成此操作,请尝试设置可变宽度约束:

宽度约束

您可能还需要调整Content Hugging PriorityContent Compression Resistance Priority获得所需的结果.


UILabel 完全自动调整大小:

这个UILabel只是设置在屏幕中心(仅限两个约束,水平/垂直):

它会自动更改宽度:

您不需要设置任何宽度或高度 - 它是完全自动的.

在此输入图像描述

在此输入图像描述

注意,简单地附上小黄色方块("间距"为零).当UILabel调整大小时,它们会自动移动.

添加"> ="约束可设置UILabel的最小宽度:

在此输入图像描述


Log*_*gan 14

如果要调整文本大小而不是按钮,可以使用...

button.titleLabel.adjustsFontSizeToFitWidth = YES;
button.titleLabel.minimumScaleFactor = .5;
// The .5 value means that I will let it go down to half the original font size 
// before the texts gets truncated

// note, if using anything pre ios6, you would use I think
button.titleLabel.minimumFontSize = 8;
Run Code Online (Sandbox Code Playgroud)

  • *adjustsFontSizeToFitWidth (3认同)

nat*_*333 8

斯威夫特 4.2

感谢上帝,这解决了。为按钮设置文本后,您可以从 UIView(官方文档在此处)中检索自然大小的内在内容大小。对于 UIButton,您可以像下面那样使用它。

button.intrinsicContentSize.width
Run Code Online (Sandbox Code Playgroud)

为了您的信息,我调整了宽度以使其看起来正确。

button.frame = CGRect(fx: xOffset, y: 0.0, width: button.intrinsicContentSize.width + 18, height: 40)
Run Code Online (Sandbox Code Playgroud)

模拟器

具有内在内容大小的 UIButtons

来源:https : //riptutorial.com/ios/example/16418/get-uibutton-s-size-strictly-based-on-its-text-and-font


Has*_*jmi 6

sizeToFit无法正常工作.代替:

myButton.size = myButton.sizeThatFits(CGSize.zero)
Run Code Online (Sandbox Code Playgroud)

你也可以添加contentInset到按钮:

myButton.contentEdgeInsets = UIEdgeInsetsMake(8, 8, 4, 8)


Loo*_*zie 6

由于某种原因,func sizeToFit()对我不起作用。我的设置是使用 a 内的按钮,UITableViewCell并且使用自动布局。

对我有用的是:

  1. 获取宽度约束
  2. 获取intrinsicContentSize宽度,因为根据本文档自动布局不知道intrinsicContentSize。将宽度约束设置为intrinsicContentSize宽度

在此输入图像描述

这里有两个标题来自Debug View Hierachry 在此输入图像描述

在此输入图像描述


Bar*_*zyk 5

只是:

  1. 创建UIView为包含自动布局的包装器以查看周围的视图.
  2. 放在UILabel那个包装器里面.添加将tyour标签粘贴到包装器边缘的约束.
  3. 放入UIButton你的包装器,然后简单地添加你所做的相同的约束UILabel.
  4. 享受自动调整按钮和文本.

  • 这对可访问性是否有效? (2认同)

cod*_*urn -3

在Xcode 4.5及更高版本中,现在可以使用" 自动布局/约束 "来完成.

主要优点是:

  1. 您根本不需要以编程方式设置框架!
  2. 如果操作正确,则无需为了更改方向而重置帧.
  3. 此外,设备更改无需打扰您(阅读,不需要为不同的屏幕尺寸单独编码).

一些缺点:

  1. 不向后兼容 - 仅适用于iOS 6及更高版本.
  2. 需要熟悉(但以后会节省时间).

最酷的是我们专注于声明一个意图,例如:

  • 我希望这两个按钮具有相同的宽度; 要么
  • 我需要这个视图垂直居中,并从superview的边缘延伸到10 pts的最大值; 甚至,
  • 我希望这个按钮/标签根据它显示的标签调整大小!

是一个简单的教程,介绍自动布局.

有关详细信息.

一开始需要一些时间,但看起来确实值得付出努力.

  • 这是一个糟糕的答案 - 它详细说明了AutoLayout本身的优点,而不是如何在这种情况下应用AutoLayout来解决提问者的问题. (146认同)
  • **我想知道这是否有可能以编程方式进行**说答案...... (5认同)
  • 我几乎错过了这个答案 - 它确实需要更多的选票.使用此解决方案,可以避免嵌入字体面名和大小或仅限iOS 7的调用.我只是设置了我希望我的UIButton延伸的边的约束,就是这样. (3认同)