2012-05-01 2 views
0

У меня есть вертикальный NSSplitView, нижний подзаголовок содержит пользовательский вид (например NSView) и NSTextView.NSSplitView изменяет размер пользовательского NSView, содержащегося

NSView содержит внутри него два NSButtons.

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

Чтобы лучше объяснить мою проблему, просмотрите прикрепленное изображение.

Изображение 1: окно при запуске приложения, все нормально

Изображение 2: Я изменен делая меньше вида разделения, только небольшая часть кнопок видно

Изображение 3: Я ве увеличены снова разделенное представление, но как вы можете увидеть NSView остается все меньше и кнопки больше не будут видны (если изменить размер SplitView вниз «исчезает» в NSView)

enter image description here

ответ

0

Это порочный про что основано на устаревших представлениях Cocoa. Лучшее решение, которое я видел, состоит в том, чтобы ограничить минимальный размер любой части разделенного вида. Если subviews никогда не рушится, их метрики не пересекаются в другое измерение, и они должны быть снова увеличены.

Чтобы сделать это, настройте делегат для вашего вида сплита, который будет реализовывать - splitView:constrainMaxCoordinate:ofSubviewAt:. Сплит-вид вызовет ваш метод делегата, надеясь, что он может оставить позицию максимального делителя на высоте разделенного представления (передавая это как второй аргумент), но вы можете просто вычесть некоторое количество из этого значения (например, 60), чтобы вернуться это как минимальная высота для вида снизу.

- (CGFloat)splitView:(NSSplitView *)aSplitView 
constrainMaxCoordinate:(CGFloat)proposedMin 
      ofSubviewAt:(NSInteger)dividerIndex { 

    return proposedMin - 60; 
} 

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

(Смотрите также this fabulicious article на эту тему.)

+0

Я сворачивание SplitView с помощью анимации, так что ограничение не помогает так много, но теперь благодаря вам я имею направление, чтобы следовать. Очень странно, что когда я удаляю NSTextView, NSView не изменяется. – dafi

+0

Я думаю, вы имеете в виду 'constrainMinCoordinate', не так ли? – trojanfoe

+0

Фактически, 'constrainMinCoordinate' ограничивает минимальную координату * делителя *, а не размер какого-либо определенного поднабора. Таким образом, * максимальная * координата делителя * выше * вид служит для определения минимальной высоты этого вида. Смутно, да. – Violet

0

сдерживающего положение делителя не помогли в моем случае, как я оживляющий подвиды и подвиды могут быть свернуты.

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

- (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; 
     } 
    } 
}