【问题标题】:Resizing & Layout: How to implement this design?调整大小和布局:如何实现这个设计?
【发布时间】:2014-12-13 08:43:23
【问题描述】:

好的,这可能看起来很简单,但我已经挣扎了太久,所以我决定寻求一些帮助。

基本,我有一个容器 NSView。

内容是(从左到右):

  • NSSegmentedControl
  • NSTextField
  • NSSegmentedControl

它们都是水平对齐的(= 它们在同一“行”中)。

我想做的是:

  • 第一个元素的宽度固定,左侧固定
  • 可调整大小的文本字段
  • 固定最后一个元素的宽度,并固定在右侧

我想这是不言自明的。


这是我对 3 个视图的自动调整大小设置:

查看 1

查看 2

查看 3


问题来了:整个调整大小工作正常。直到文本字段被调整到折叠的位置。当超级视图/容器再次调整为正常大小时,整个设计就会混乱(文本字段溢出容器以及许多此类奇怪的问题)。

发生了什么事?有什么建议吗?


注意:我让它与自动布局一起使用(仅设置“自动布局”和“添加(ing)缺失约束”),但由于性能影响,我绝对想避免它巨大 -- 整体设计比较复杂,有很多嵌套,所以让我们坚持老式的方式。 :-)

【问题讨论】:

  • 如果没有自动布局,您可能必须手动更新框架(在许多应用程序中这仍然是正常的)
  • @RyanDignard 对不起,如果这听起来很无知(它是 - 我对自动布局的经验接近于零):我是否有可能仅为这个特定视图(及其内容)启用自动布局并离开其余的原样? (注意:所有的掩码都是通过 Interface Builder 设置的)
  • 您可以将您的视图构建为一系列独立的 nib,其中一些设置为具有自动布局,而另一些则没有,并将整个内容粘贴到 viewDidLoad 中
  • 以窗口为单位启用自动布局。如果窗口中的任何视图使用自动布局,那么整个窗口都会这样做。也就是说,您不必为给定视图启用自动布局。如果您没有设置 translatesAutoresizingMaskIntoConstraints(并且 IB 没有为您设置),那么该视图的自动调整大小掩码将转换为以相同方式工作的约束。这可以避免您的一些工作,但不会在运行时提高任何效率。

标签: objective-c xcode cocoa nsview nstextfield


【解决方案1】:

使用自动调整大小蒙版的旧 springs-and-struts 模型基于正在调整大小的子视图的当前大小的大小变化的比例分布。一旦任何子视图的大小为零,它就会变得混乱。要么除以零,要么乘以零,你会得到虚假的结果。这是系统长期存在的问题。

您必须设置最小窗口大小以防止这种情况发生。

自动布局是旧模型的所有缺陷的解决方案。

【讨论】:

  • 这是有道理的。让我试试吧!非常感谢! ;-)
  • 基本上,这就是:当我恢复为自动调整掩码大小时,仍然有一个自定义视图使用自动布局(以编程方式)。过了一会儿,我在控制台中不断收到错误 + 窗口似乎根本无法调整大小......非常奇怪......
  • Unable to simultaneously satisfy constraints: ( "<NSAutoresizingMaskLayoutConstraint:0x60800008a140 h=--& v=--& H:[NSView:0x600000121040(359)]>", "<NSLayoutConstraint:0x600000089330 H:|-(0)-[NSView:0x600000121040](LTR) (Names: '|':NSSplitView:0x600000120aa0 )>", "<NSLayoutConstraint:0x600000089470 H:[NSView:0x600000121040]-(1)-[NSView:0x608000123200](LTR)>", "<NSAutoresizingMaskLayoutConstraint:0x608000089ce0 h=--& v=--& H:|-(361)-[NSView:0x608000123200] (Names: '|':NSSplitView:0x600000120aa0 )>" )
  • 由于您使用自动布局(因为窗口中的任何视图都需要它),您必须小心与translatesAutoresizingMaskIntoConstraints 为真的视图交互的约束。 translatesAutoresizingMaskIntoConstraints 导致生成约束,这些约束根据设置的最后一帧以及此后发生的任何超视图调整大小完全确定视图的大小和位置。对该视图的任何附加约束都可能会尝试对其执行其他操作,这将发生冲突。因此,此类视图通常不应包含在约束中。
  • 看起来您将视图嵌入到使用自动布局的拆分视图中。拆分视图将对您的视图应用约束以使其保持原位。如果您的视图正在将自动调整大小转换为可能存在问题的约束。如果这是包含您在问题中描述的三个视图的容器视图,则该容器应禁用 translatesAutoresizingMaskIntoConstraints,而三个控件已启用它(并且不应限制其容器父视图)。
猜你喜欢
  • 2015-04-30
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
相关资源
最近更新 更多