Как мне исправить высоту моего вида после свертывания NSSplitView? - PullRequest
2 голосов
/ 08 августа 2009

У меня есть NSSplitView с NSScrollView в виде снизу. Проблема в том, что когда я сворачиваюсь, а затем снова открываю (не сворачиваю) вид снизу, высота вида прокрутки превышает высоту этого вида снизу, поэтому верхняя часть вида прокрутки обрезается. У меня есть мой вид прокрутки и мой разделенный вид для автоматического изменения размера во всех направлениях в IB. Нужно ли регулировать высоту этого вида прокрутки после разворота, или я неправильно устанавливаю свойство изменения размера, или что-то еще? Ниже приведено изображение до и после того, как выглядит вырезка.

До крушения:

alt text

После свертывания и повторного открытия (обратите внимание, что полоса прокрутки в нижней части экрана обрезана)

alt text

Ответы [ 4 ]

4 голосов
/ 08 августа 2009

Проблема связана с тем, что правила автоматического изменения размера какао работают путем масштабирования дельт от предыдущего состояния до текущего состояния. Если какое-либо из полей становится равным 0, оно никогда не будет уменьшено при увеличении представления из-за мультипликативного характера масштабирования.

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

Вот ссылка на документацию по разделенному представлению .

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

Если вы хотите увидеть пример этого, Mail.app для Mac OS X закрывает встроенное представление сообщений при достижении определенной высоты. Вы должны имитировать это поведение.

0 голосов
/ 17 июля 2012

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

Мне удалось найти приемлемое решение, реализовав метод делегата splitView -splitviewWillResizeSubviews: чтобы сохранить минимальную ширину, установив подпредставление скрытым, а не уменьшив его до нуля:

- (void)splitViewWillResizeSubviews:(NSNotification *)notification {
        NSUInteger divider = [[[notification userInfo] valueForKey:@"NSSplitViewDividerIndex"] intValue];
        NSView *subview = nil;
        if(divider == SPLITVIEW_DIVIDER_SIDEBAR) {
            subview = (NSView*)[self.splitView.subviews objectAtIndex:SPLITVIEW_SIDEBAR_INDEX];
        }
        if(subview) {
            if(subview.frame.size.width < SPLITVIEW_MINIMUM_SIDEBAR_WIDTH) {
                CGRect correctedFrame = subview.frame;
                correctedFrame.size.width = SPLITVIEW_MINIMUM_SIDEBAR_WIDTH;
                subview.frame = correctedFrame;
                subview.hidden = YES;
            } else {
                subview.hidden = NO;
            }
        }
    }
0 голосов
/ 15 сентября 2011

Вы можете "сбросить" вещи через NSUserDefaults, возможно .. Есть ключи для таких вещей, как NSSplitView Subview Frames и т. Д., Которым вы можете назначить координаты, например 0.000000, 0.000000, 0.000000, 720.000000, NO

0 голосов
/ 28 января 2010

У меня такая же проблема. Исправлено с помощью разделенных видов BWToolkit, которые позволяют определять максимальную и минимальную высоту для каждого вида.

...