2010-11-09 117 views
99

在界面生成器调整大小,保持命令 + =将调整按钮以适应其文本。我想知道是否可以在按钮添加到视图之前以编程方式进行操作。的iOS:UIButton的根据文本长度

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]; 
+1

**请注意这个非常古老的问题:** nowadays(2017),只需将约束条件设置为“大于或等于”即可。 (由Tad在下面注意答案。) – Fattie 2016-12-27 17:13:16

回答

12

在Xcode 4.5及以上,这样可以现在可以通过使用'自动布局/限制'来完成。

主要优点是:

  1. 你不需要编程设定框架在所有!
  2. 如果操作正确,则无需为重置方向更改而重新设置框架。
  3. 此外,设备更改无需打扰您(阅读,无需为不同的屏幕尺寸单独编码)。

一些缺点:

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

最酷的事情是,我们得到集中申报意向如:

  • 我想这两个按钮是相同的宽度;或
  • 我需要这个视图垂直居中,并从超级观景点的边缘延伸到10分的最大范围;或甚至,
  • 我希望这个按钮/标签根据它显示的标签来调整大小!

Here是一个简单的教程来介绍自动布局。

对于more details

起初需要一些时间,但它确实看起来是值得的。

干杯!

+3

我几乎错过了这个答案 - 它真的需要更多的选票。有了这个解决方案,人们可​​以避免嵌入字体名称和大小或仅支持iOS 7的调用。我只是简单地设定了我希望我的UIButton扩展的那一方的约束,就是这样。 – Carl 2014-03-04 09:55:35

+0

几乎是一个完美的解决方案,不幸的是,如果您使用titleEdgeInsets,那么它不起作用:/ – 2014-07-29 10:24:51

+57

这是一个糟糕的答案 - 它详细介绍了AutoLayout本身的优点,而不是AutoLayout如何应用于这种情况下解决提问者问题。 – mattsven 2015-04-20 16:15:03

118

UIKit中,有增加的NSString类从给定的NSString获取对象在一定的字体渲染时它会占用大小。

Docs here

总之,如果你去:

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

...你就会有按钮的边框设置为你呈现字符串的高度和宽度。

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

+4

看起来像iOS默认填充是12px,8px。 – 2012-02-28 21:56:39

+17

sizeWithFont在iOS 7.0中已弃用。使用sizeWithAttributes:改为 – 2013-10-29 17:11:26

+6

我强烈建议不要再使用框架,但只能使用约束。 – 2015-11-03 14:31:38

84

在代码中做到这一点的方法是:

[button sizeToFit]; 

如果你继承,并希望添加额外的规则,你可以重写:

- (CGSize)sizeThatFits:(CGSize)size; 
+3

sizeToFit完美适用于像UIButton或UILabel这样的标准控件。如果你正在使用自定义UIView,你需要实现' - (CGSize)sizeThatFits:(CGSize)size'。 – 2013-07-15 11:50:39

+3

它只适用于设置文本后设置,否则没有足够的信息应该是多大: '[button setTitle:@“Your text here”forState:UIControlStateNormal];' '[button sizeToFit ];' 此外,如果稍后更新文本,请不要忘记再次调用该文本。 – 2015-08-13 22:13:23

+0

请确保您仅以这种方式设置文本:[myButton setTitle:@“my title”forState:UIControlStateNormal];对我来说,直到我重复这个声明才有效。 – 2016-06-08 14:30:41

31

如果您的按钮与界面生成器制作,你可以这样做:

[self.button setTitle:@"Button Title" forState:UIControlStateNormal]; 
[self.button sizeToFit]; 
+0

即使你的按钮是用代码编写的,你也可以这样做。 – Markus 2017-04-24 19:03:25

2

我有一些额外的需求相关这个帖子说sizeToFit没有解决。无论文字如何,我都需要将按钮放在原始位置。我也不希望按钮比它的原始大小大。

所以,我布局其最大大小的按钮,该尺寸保存在控制器和使用下面的方法来尺寸键当文本的变化:

+ (void) sizeButtonToText:(UIButton *)button availableSize:(CGSize)availableSize padding:(UIEdgeInsets)padding {  

    CGRect boundsForText = button.frame; 

    // Measures string 
    CGSize stringSize = [button.titleLabel.text sizeWithFont:button.titleLabel.font]; 
    stringSize.width = MIN(stringSize.width + padding.left + padding.right, availableSize.width); 

    // Center's location of button 
    boundsForText.origin.x += (boundsForText.size.width - stringSize.width)/2; 
    boundsForText.size.width = stringSize.width; 
    [button setFrame:boundsForText]; 
} 
13

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

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; 
+3

* adjustsFontSizeToFitWidth – 2015-08-03 19:26:32

11

斯威夫特:

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

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

简单:

  1. 创建UIView在自动布局视图周围的包装。
  2. UILabel放在那个包装里面。添加约束条件,将标签粘贴到包装边缘。
  3. UIButton放在你的包装内,然后简单地添加与你为UILabel所做的相同的约束。
  4. 享受您的autosized按钮以及文字。
1

sizeToFit无法正常工作。而不是:

myButton.size = myButton..sizeThatFits(CGSize.zero) 

你也可以添加contentInset到按钮:

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

+0

从苹果文档关于sizeToFit://调用sizeThatFits:与当前视图边界和更改边界大小。所以它工作正常,你只需要设置它后,你设置文本。 – Markus 2017-04-24 19:06:00

+0

contentEdgeInsets适合我! – ElectroBuddha 2017-07-02 23:34:18

8

要做到这一点使用自动布局,可以尝试设置可变宽度的限制:

Width Constraint

你也可能需要调整你的Content Hugging PriorityContent Compression Resistance Priority t o获得你需要的结果。

相关问题