2016-10-20 2 views
0

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

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

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

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

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

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

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

ответ

0

Переключен с использованием собственного размера в ограничение отношения. Я все еще вычисляю «собственный» размер представления, но использую его только для определения соотношения ширина/высота. Затем я добавляю ограничение, чтобы сохранить это соотношение. Кажется, хорошо работает. Вот соответствующий код:

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]| для горизонтальной и вертикальной.

Смежные вопросы