NSButton 动态包装标题

NSButton wrap title dynamically

我想完成的事情: 我需要一个带有标题文本的复选框,该复选框根据 parent 视图建立的动态宽度在多行上动态换行和换行。我需要一个可以在 IB 中使用的解决方案,它将在运行时显示在那里。我正在使用 XCode 13.1,在 XIB-File 目标 MacOS 中工作。

我在做什么: 我在 IB 中创建了一个 NSButton。在属性检查器中,我将其样式设置为 Check,在“Control”下,我为“Line Break”选择 Word Wrap,最后我设置了一个很长的文本作为标题,例如 Asd Asd Asd lit tle words and many of them asd asd lit tle ones

发生了什么: 如上所述设置按钮(案例 1) 并缩小其宽度时,它将在 IB 和运行时显示,如下所示:

按照this similar question中的建议通过按Option + Enter手动向标题添加换行符时(案例2,在“他们”之后,标题开始正确换行,并生成所有其他必要的中断:

但是这个解决方案不适用于我的情况,因为它只适用于静态宽度,但我的复选框需要如上所述动态调整它们的宽度。

如果没有额外的手动换行符,最有趣的是 apparently 复选框已经根据标题的新包装高度做出反应并更改其位置,而标题文本本身只是被控件的边界而不是以包装方式显示。

我的期望: 我希望标题在情况 1 中换行。因为它没有:这是错误还是功能?如何使案例 1 工作并根据标题的长度和按钮的宽度动态换行标题?我是否只需要在到目前为止错过的检查器中设置另一个属性?还是只有程序化的解决方案?

回答为什么我不使用适当简短的标签的问题:别问我,我只是一个遵循规范和要求的开发人员,不幸的是我没有说法关于这里的文本长度。

此答案的致谢来自 @Willeke 的评论:“AppKit 不支持多行复选框。”情况 1 中的复选框的有趣行为表明否则似乎只是一个小故障或错误。

我最终得到的结果: 我选择了一种解决方法。我在多行标签旁边放置了一个复选框按钮(在 IB 中图像位置为“仅图像”),将两者都放在自定义视图中,添加了必要的约束。通过一些定位调整,我知道有一个看起来完全像单行复选框的解决方案,我可以在 IB 中复制粘贴,并且通过 Autolayout 在 IB 中和运行时解决 - 无需任何额外代码。