【问题标题】:Two NSTextFields with interdependent widths in autolayout自动布局中两个宽度相互依赖的 NSTextField
【发布时间】:2013-09-30 12:24:51
【问题描述】:

我正在尝试将两个 NSTextField 的简单案例组合在一起,其中两个 NSTextField 具有动态宽度和固定间距。不过我想不出一个有效的方法。

我希望得到这样的东西:

蓝色框是 NSTextFields。当更多文本输入到一个文本中时,它应该会增长,从而使另一个文本缩小,从而保持前导空间、尾随空间和字段之间的间距。如果两个字段的文本太多,第一个应该优先。每个字段也将清楚地具有可以达到的最大和最小宽度。

我将如何解决这个问题,最好尽可能使用 IB 自动布局?

【问题讨论】:

    标签: objective-c xcode cocoa autolayout nstextfield


    【解决方案1】:

    在我看来,您提到的所有约束都直接转化为界面构建器--

    1. 第一个视图的宽度 >= 一些东西。
    2. 第一个视图有宽度
    3. 第二个视图相同。
    4. 视图之间的空间是固定的。
    5. 第二个视图希望尽可能小(宽度为 0),但它的优先级低于之前的约束,并且优先级低于内部内容大小约束。

    【讨论】:

    • 谢谢!这有所帮助,尽管我最终还是不得不在您描述的 IB 约束之上添加一些手动尺寸管理代码,以实现我所追求的确切结果。我将在此处添加 sn-p 作为额外答案,但会将您的答案标记为已接受。
    • 你能添加更多关于你使用的约束的细节吗?我正在尝试在 IB 中配置类似的布局(使用 Xcode 5.1),但没有得到任何结果。对于第 1 点到第 3 点,每个文本字段是否都有 2 个不同的宽度约束?就我而言,这样做会使 IB 感到困惑。另外,对于 5. 是否存在第三个约束(使其为零)?
    【解决方案2】:

    根据 ilya 的回答应用约束后,我必须添加到视图控制器的代码:

    controlTextDidChange中(_controlWidthConstraint指的是输入的固定宽度约束;第二个输入可能默认为0):

    // Get the new width that fits
    float oldWidth = textControl.frame.size.width;
    [input sizeToFit];
    float controlWidth = textControl.frame.size.width;
    
    // Don’t let the sizeToFit method modify the frame though
    NSRect controlRect = textControl.frame;
    controlRect.size.width = oldWidth;
    textControl.frame = controlRect;
    
    _controlWidthConstraint.constant = controlWidth;
    

    【讨论】:

      【解决方案3】:

      关键在于在输入文本时使文本字段的intrinsicContentSize无效。

      您可以查看示例项目here,以帮助您走上正轨。

      【讨论】:

      • 这是关于 NSTextView 没有 UITextView。巨大的差异。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-12
      • 2011-04-26
      • 2021-09-19
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      • 2015-08-06
      相关资源
      最近更新 更多