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及以上版本中,现在可以通过使用“ 自动布局/约束 ”来完成。
主要优点是:
- 你不需要编程设置框架!
- 如果操作正确,则不需要为重置方向更改而重新设置框架。
- 此外,设备更改不需要打扰您(阅读,不需要为不同的屏幕尺寸单独编码)。
一些缺点:
- 不向后兼容 – 仅适用于iOS 6及以上版本。
- 需要熟悉(但会在以后节省时间)。
最酷的事情是我们集中于声明一个意图,如:
- 我想要这两个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 Priority
和Content Compression Resistance Priority
以获得您所需的结果。
只是:
- 使用自动布局创build
UIView
作为包装来查看周围。 - 把
UILabel
放在这个包装里面。 添加约束将粘贴tyour标签到包装的边缘。 - 把
UIButton
放在你的包装里面,然后简单的添加和UILabel
一样的约束。 - 随着文字享受你的自动化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)