适应对其内容的控制

时间:2013-03-18 10:40:04

标签: macos cocoa autolayout

我的用户界面存在问题。我想制作一些控件(即只读NSTextField(又名多线标签)和NSTokenField)显示它们包含的所有文本,这些文本可能会有很大不同(很多行都有很多单词)

我想把它们嵌入NSScrollView里面,但也许这还不够,因为我无法实现我的目标......

有人可以帮我解决这个问题吗?

谢谢

编辑:我添加了一张图片。

UI

也许滚动条不是正确的解决方案。 正如您在图像中看到的,我有一个“简单”的attribute1字段,然后是第二个包含大量文本的字段(还有更多需要在其中显示的文本),以及一个包含大量文本的令牌字段文本。

我看到两种选择(即使我不知道如何实现它们......):

  • 让田地长高(但后来我只是推迟了问题:如果它们变得那么大,窗户也需要增长呢?
  • 将它们嵌入到滚动视图中(并在这种情况下使滚动条可见,因此用户知道还有更多要阅读的内容)。我认为第二种选择更好......但是简单地在滚动视图中嵌入字段并没有解决问题,所以我问是否需要以编程方式实现某些东西(并且继承NSView)...

EDIT2: 还有问题: 如果我设置为约束“size> =我的最小值”,那么文本字段会正确增长..当然没有滚动视图..如果,那么,我尝试将其嵌入NSScrollView文本中再次剪裁(并且滚动视图不会滚动)...

EDIT3:我附上了一个示例项目,其中我尝试显示问题(没有我主项目的所有其他内容) http://www.filedropper.com/testtextfield

3 个答案:

答案 0 :(得分:1)

您的要求是制作具有NSTextField和NSTokenField的自定义控件。

您可以做的是,创建一个NSView并将它们嵌入其中,并在NSScrollView中显示它们。

答案 1 :(得分:0)

根据你想做的事情,Anoop的建议可能很好,将它们嵌入NSView范围内的NSScrollView。如果您希望滚动视图中的每个字段与滚动视图具有相同的宽度,但动态更改其高度,则需要在滚动视图上侦听NSViewFrameDidChangeNotification并更改{ {1}}和preferredMaxLayoutWidth中的每一个{1}}都匹配滚动视图的宽度。我可能建议继承包含NSTextField的子类并让它监听通知。

编辑:

我不确定你遇到的具体问题是什么,但这是我如何解决问题:

1)创建NSTokenField的子类作为容器视图。

2)将文本视图嵌入容器视图中的实例中,并将该容器视图嵌入NSView

3)文本视图应该对其超级视图具有前导和尾随空间约束(可能为0,但对您有用)以及相互之间的顶部和底部约束以及超级视图将它们置于堆叠配置中。

4)在容器视图子类中,在其包含的滚动视图上注册NSView,当它收到通知时,在每个文本字段上NSScrollView以匹配NSScrollView的宽度。

答案 2 :(得分:0)

我解决了我的问题(好吧......它更像是一种解决方法,而不是真正的解决方案):

  • 对于标签我使用的是NSTextView,只读,不可选择且具有透明背景(因此它看起来像只读NSTextField但带有滚动条)。
  • 对于令牌字段我使用SSYTokenField(我在这里找到:https://github.com/jerrykrinock/ClassesObjC)..对于我当前的要求(在窗口创建时决定的字段的只读和大小)它可以工作..我不知道这是否适用于更复杂的情况。 顺便说一句:我读到可可自动布局仍然存在NSScrollView的一些问题(好吧......相反:D)。我必须用旧的支柱和弹簧(自动修复面罩)进行测试,看看我是否还有问题..