iOS:UIButton根据文本长度resize

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

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

在XCode 4.5及以上版本中,现在可以通过使用“ 自动布局/约束 ”来完成。

主要优点是:

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

一些缺点:

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

最酷的事情是我们集中于声明一个意图,如:

  • 我想要这两个button是相同的宽度; 要么
  • 我需要把这个观点垂直居中,并从监督的边缘延伸到10分的最大范围。 甚至,
  • 我想要这个button/标签根据它显示的标签来resize!

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

更多细节 。

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

干杯!

在UIKit中,NSString类可以从给定的NSString对象中获取,这些NSString对象将以特定字体呈现时所占用的大小。

文档在这里 。

总之,如果你去:

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

…您将button的框架设置为您正在呈现的string的高度和宽度。

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

在代码中这样做的方法是:

 [button sizeToFit]; 

如果您正在创build子类并想添加额外的规则,您可以覆盖:

 - (CGSize)sizeThatFits:(CGSize)size; 

如果您的button是使用Interface Builder创build的,而您正在更改代码中的标题,则可以这样做:

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

如果你想调整文本的大小,而不是button,你可以使用…

 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; 

Swift 2:

这里最重要的是你什么时候调用.sizeToFit() ,它应该在设置文本显示之后才能读取所需的大小,如果稍后更新文本,则再次调用它。

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

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

宽度约束

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

只是:

  1. 使用自动布局创buildUIView作为包装来查看周围。
  2. UILabel放在这个包装里面。 添加约束将粘贴tyour标签到包装的边缘。
  3. UIButton放在你的包装里面,然后简单的添加和UILabel一样的约束。
  4. 随着文字享受你的自动化button。

我有一些sizeToFit不解决这个职位相关的其他需求。 无论文字如何,我都需要将button置于原始位置。 我也不希望button比它的原始大小大。

因此,我按照最大尺寸布置button,将该尺寸保存在控制器中,并在文本更改时使用以下方法调整button的大小:

 + (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]; } 

sizeToFit不能正常工作。 代替:

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

你也可以添加contentInset到button:

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