我有一个动态创建的按钮,需要调整大小。它有足够的空间可以增长,但是调用sizeToFit接缝什么都不做,或者至少不能放大按钮。
如何获得所需效果?
答案 0 :(得分:2)
查看NSString
方法-sizeWithFont:
。它会返回CGSize
,告知您按钮中文本的大小。然后,您可以根据此大小调整按钮的框架,将所需的填充添加到按钮框架的宽度和高度。像这样:
NSString *msg = @"The button label";
UIFont *font = [UIFont systemFontOfSize:17];
CGSize msgSize = [msg sizeWithFont:font];
CGRect frame = button.frame;
frame.size.width = msg.size.width+10;
frame.size.height = msg.size.height+10;
button.frame = frame;
(从内存写入;未编译。: - )
当然,您还必须设置按钮标题和字体......
答案 1 :(得分:1)
在iOS 7中,sizeWithFont:已折旧。现在你应该使用sizeWithAttribute:。
但那并不是我如何解决这个问题。有两种方法可以解决这个问题:
1)要使用[button sizeToFit],请确保禁用AutoLayout。否则,您将无法以编程方式调整按钮的大小。您必须调整约束的大小。
2)但是,这个答案在使用上非常有限。在我即将向您展示的示例中,按钮将离开屏幕,因为文本全部在一行上。要在约束宽度时更改按钮的高度,请使用以下代码。 再次确保自动布局已关闭,否则无效。
UIFont *font = [UIFont fontWithName:@"Helvetica-Bold" size:14.0];
NSString *text = @"This is a very long new title for the button to be sure, now I'm going to add even more";
[self.testButton setTitle:text forState:UIControlStateNormal];
self.testButton.titleLabel.font = font;
CGFloat width = self.testButton.frame.size.width - 10; //button width - padding width
NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:text attributes:@{NSFontAttributeName: font}];
CGRect rect = [attributedText boundingRectWithSize:(CGSize){width, CGFLOAT_MAX}
options:NSStringDrawingUsesLineFragmentOrigin
context:nil];
CGSize size = rect.size;
size.height = ceilf(size.height);
size.width = ceilf(size.width);
self.testButton.frame = CGRectMake(self.testButton.frame.origin.x, self.testButton.frame.origin.y, self.testButton.frame.size.width, size.height + 15);
因为boundingRectWithSize会传递一个非整数大小的矩形,你必须使用ceilf进行舍入。
在我将宽度传递给boundingRectWithSize之前,我从宽度中减去10来为我的按钮创建填充。