【问题标题】:Proportionally adjust layout height when the intrinsic size overflows the available width当固有尺寸超出可用宽度时,按比例调整布局高度
【发布时间】:2016-10-20 20:46:56
【问题描述】:

我正在使用 (macOS) 今日列表小部件,并且我正在使用自动布局来调整小部件的大小。该小部件包含一个自定义 NSView,呈现一些预先格式化的文本(很像 HTML pre 标记)。

根据正在呈现的文本,小部件具有固有的内容大小。如果设置的框架大于或小于固有尺寸,它也会正确缩放(向下或向上)并居中。

这通常在许多情况下都能很好地工作,除了一种。当显示为 Today 小部件时,小部件的宽度被限制为特定大小。即使内在尺寸大于可用宽度也很好,它会按比例缩小。 然而似乎自动布局似乎仍然按原样使用小部件的固有高度,尽管宽度受到限制。这样我的视图就会出现在高度上,如下所示:

/------------------\
|    extra pad     |
|------------------|
|                  |
|  downsized view  |
|                  |
|------------------|
|    extra pad     |
\------------------/

示例:呈现的视图的固有尺寸为 800x400,当前视图的宽度为 400。视图被适当地缩小到 400x200,但布局高度似乎仍然是原始的 400(顶部和底部填充 200)。

问题:我如何告诉自动布局将缩放考虑在内。这听起来像是需要 -intrinsicSizeForMaxSize: 之类的东西。

我尝试设置宽度/高度比约束,降低抗压性并提高拥抱优先级,但这并没有消除额外的填充。我想我遗漏了一些关于自动布局在溢出时如何考虑内在大小的内容。

【问题讨论】:

    标签: macos cocoa today-extension autolayout


    【解决方案1】:

    从使用固有大小切换到比率约束。我仍然计算视图的“本机”大小,但仅使用它来计算宽度/高度比。然后我添加一个约束来保持这个比例。似乎工作正常。以下是相关代码:

      let size  = nativeSize // calculate the desired size
      let ratio = size.height / size.width
    
      if let rc = ratioConstraint {
        rc.isActive = false
        removeConstraint(rc)
      }
    
      ratioConstraint =
        NSLayoutConstraint(item:   self, attribute: .height, relatedBy: .equal,
                           toItem: self, attribute: .width,
                           multiplier: ratio, constant: 0)
      ratioConstraint?.isActive = true
    

    然后我只是通过|[self]| 将视图固定到容器中,水平和垂直。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      相关资源
      最近更新 更多