UIButton 宽度或换行模式问题

UIButton width or line break mode problem

提问人:Eir 提问时间:9/25/2022 最后编辑:Eir 更新时间:9/28/2022 访问量:258

问:

我正在以编程方式将对象添加到 .我得到的结果是按钮的高度计算正确,即第二行有一个空格,但文本没有换行,而是继续流动,就好像按钮具有无限宽度一样。我曾经用对象代替按钮,而且效果很好。我只是无法将按钮设置为与文本视图相同的布局方式。UIButtonUIScrollViewUITextView

下面是一个代码片段:

UIButton* sButton = [[UIButton alloc] initWithFrame:CGRectMake(0, yPos, sWidth - 5, height)];
sText = [[NSMutableString alloc] initWithString:@"quite a long string that does not fit in one line, no chance"];
sButton.titleLabel.font = font;
sButton.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
[sButton setLineBreakMode:NSLineBreakByWordWrapping];
[sButton.titleLabel setLineBreakMode:NSLineBreakByWordWrapping];
[sButton setTitle:sText forState:UIControlStateNormal];
[sButton sizeToFit];

这是我得到的结果:enter image description here

如何使按钮文本换行?

iOS Objective-C UIBuint

评论

1赞 DonMag 9/25/2022
如果要换行文本(无论是在文本视图、标签还是按钮的标题标签中),则必须对其进行宽度限制。
0赞 DonMag 9/25/2022
如果您以 iOS 15+ 为目标,您可以使用UIButtonConfiguration
0赞 Eir 9/26/2022
@DonMag感谢您的输入!我正在用一个框架构建,为什么在调用后被忽略?UIButtonsizeToFit
0赞 DonMag 9/26/2022
您正在构建带有框架的按钮...然后,您将调用---“当您想要调整当前视图的大小时调用此方法”。因此,您在设置框架后设置框架。您确实希望使用具有宽度限制的自动布局。sizeToFit
0赞 Eir 9/28/2022
@DonMag当我有对象而不是 s 时,我不需要调用。由于某种原因,没有对视图的调用,一切都搞砸了。无论如何,正如您在我发布的图像中看到的那样,它保持了按钮的正确高度,但未能对内容进行换行,也无法观察在施工时设置的宽度大小。我不知道为什么它遵守某些值,而忽略其他值。sizeToFitUITextViewUIButtonsizeToFitsizeToFit

答:

0赞 Eir 9/28/2022 #1

这是我找到的唯一有效的解决方案:https://stackoverflow.com/a/4978003/963022

我最终创建了一个自定义按钮实现并覆盖:

- (CGSize)sizeThatFits:(CGSize)size {

    int diff = 0;
    // for the width, subtract DIFF for the border
    // for the height, use a large value that will be reduced when the size is returned from sizeWithFont
    CGSize tempSize = CGSizeMake(size.width - diff, 1000);

    CGSize stringSize = [self.titleLabel.text
                     sizeWithFont:self.titleLabel.font
                     constrainedToSize:tempSize
                     lineBreakMode:UILineBreakModeWordWrap];
    return CGSizeMake(size.width - diff, stringSize.height);
}