Пропорционально отрегулируйте высоту макета, когда собственный размер выходит за пределы доступной ширины.

Я играю с виджетом списка сегодня (macOS) и использую автомакет для изменения размера виджета. Этот виджет содержит пользовательский NSView, отображающий некоторый предварительно отформатированный текст (почти как HTML-тег pre).

В зависимости от отображаемого текста виджет имеет собственный размер содержимого. Он также правильно масштабируется (вниз или вверх) и центрируется, если установленный кадр больше или меньше собственного размера.

Обычно это хорошо работает во многих сценариях, кроме одного. При отображении в виде виджета «Сегодня» ширина виджета ограничена определенным размером. Это нормально, даже если внутренний размер больше доступной ширины, он уменьшится. Однако кажется, что автомакет по-прежнему использует внутреннюю высоту виджета как есть, несмотря на то, что ширина была ограничена. Таким образом, мой вид выглядит дополненным по высоте, например:

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

Пример: внутренний размер визуализируемого представления 800x400, ширина текущего представления 400. Вид уменьшен до 400x200, но высота макета по-прежнему кажется исходной 400 (200 отступов сверху и снизу).

Вопрос: как мне указать autolayout учитывать масштабирование. Звучит почти так, как будто потребуется что-то вроде -intrinsicSizeForMaxSize:.

Я попытался установить ограничение соотношения ширины и высоты, уменьшить сопротивление сжатию и увеличить приоритет объятий, но это не убивает дополнительные отступы. Я думаю, что мне что-то не хватает в том, как autolayout учитывает внутренний размер, когда он переполняется.


person hnh    schedule 20.10.2016    source источник


Ответы (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]| как по горизонтали, так и по вертикали.

person hnh    schedule 21.10.2016