4

У меня есть класс GridNode, наследующий от CPSplitView, который используется для обертывания объектов типа GridELement. Каждое последовательное разделение GridNode делит его на два новых GridNodes (содержащие GridElements, которые изменяют размер с их родителями).Cappuccino - CPSplitView fixed subviews 'size

Другой класс - GridToolbar наследует от GridElement. Он должен в основном иметь такое же поведение, как GridElement, хотя размер не должен изменяться автоматически (при изменении размера контейнера), но только после того, как пользователь перетащит разделитель.

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

Любые предложения о том, что я могу сделать, чтобы это не произошло?

источник GridNode.j:

@implementation GridNode : CPSplitView 
{ 
} 

- (id)initWithFrame:(CGRect)aFrame 
{ 
    self = [super initWithFrame:aFrame]; 

    if(self) 
    { 
    [self setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable ]; 
    [self setBackgroundColor:[CPColor colorWithHexString:"EEEEEE"]] 
    } 

    return self; 
} 

- (void)split:(id)sender 
{ 
    var parent = [sender superview]; 

    var gridNode = [ 
    [GridNode alloc] 
    initWithFrame:CGRectMake(
     0, 0, 
     CGRectGetWidth([parent bounds]), 
     CGRectGetHeight([parent bounds]) 
    ) 
    ]; 
    [gridNode setVertical:(CGRectGetWidth([gridNode bounds]) >= CGRectGetHeight([gridNode bounds]) ? YES : NO)] 

    var element = [ 
    [GridElement alloc] 
    initWithFrame:CGRectMake(
     0, 0, 
     CGRectGetWidth([parent bounds]), 
     CGRectGetHeight([parent bounds]) 
    ) 
    ]; 

    [self replaceSubview:parent with:gridNode]; 

    [parent setBtnTarget:gridNode]; 
    [element setBtnTarget:gridNode]; 

    [gridNode addSubview:parent]; 
    [gridNode addSubview:element]; 
} 

- (void)addBar:(id)sender 
{ 
    var parent = [sender superview]; 

    var gridNode = [ 
    [GridNode alloc] 
    initWithFrame:CGRectMake(
     0, 0, 
     CGRectGetWidth([parent bounds]), 
     CGRectGetHeight([parent bounds]) 
    ) 
    ]; 
    [gridNode setVertical:(CGRectGetWidth([gridNode bounds]) >= CGRectGetHeight([gridNode bounds]) ? YES : NO)] 

    var isVertical = [gridNode isVertical]; 
    var toolbar = [ 
    [GridToolbar alloc] 
    initWithFrame:CGRectMake(
     0, 0, 
     CGRectGetWidth([parent bounds]), 
     CGRectGetHeight([parent bounds]) 
    ) 
    vertical: isVertical 
    ]; 

    [parent setBounds:CGRectMake(
    isVertical ? 32 : 0, isVertical ? 0 : 32, 
    CGRectGetWidth([gridNode bounds]) - (isVertical ? 32 : 0), 
    CGRectGetHeight([parent bounds]) - (isVertical ? 0 : 32) 
)]; 

    [self replaceSubview:parent with:gridNode]; 

    [parent setBtnTarget:gridNode]; 
    [toolbar setBtnTarget:gridNode]; 

    [gridNode addSubview:toolbar]; 
    [gridNode addSubview:parent]; 
} 

@end 

источник GridElement.j:

@implementation GridElement : CPView 
{ 
    CPButton btnSPlit; 
    CPButton btnToolbar; 
} 

- (id)initWithFrame:(CGRect)aFrame 
{ 
    self = [super initWithFrame:aFrame] 

    if (self) 
    { 
    [self setAutoresizingMask:CPViewWidthSizable | CPViewHeightSizable ]; 
    [self setBackgroundColor:[CPColor colorWithCalibratedRed:Math.random() green:Math.random() blue:Math.random() alpha:1.0]]; 

    btnSPlit = [ 
     [CPButton alloc] 
     initWithFrame:CGRectMake(0,0,128,24) 
    ]; 

    [btnSPlit setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin]; 
    [btnSPlit setFrameOrigin:CGPointMake((CGRectGetWidth([self bounds]) - CGRectGetWidth([btnSPlit frame]))/2.0, 
         (CGRectGetHeight([self bounds]) - CGRectGetHeight([btnSPlit frame]))/2.0 - 15)]; 
    [btnSPlit setTitle:"split me!"]; 

    [btnSPlit setAction:@selector(split:)]; 

    [self addSubview:btnSPlit] 

    btnToolbar = [ 
     [CPButton alloc] 
     initWithFrame:CGRectMake(0,0,128,24) 
    ]; 

    [btnToolbar setAutoresizingMask:CPViewMinXMargin | CPViewMaxXMargin | CPViewMinYMargin | CPViewMaxYMargin]; 
    [btnToolbar setFrameOrigin:CGPointMake((CGRectGetWidth([self bounds]) - CGRectGetWidth([btnToolbar frame]))/2.0, 
         (CGRectGetHeight([self bounds]) - CGRectGetHeight([btnToolbar frame]))/2.0 + 15)]; 
    [btnToolbar setTitle:"split me!"]; 

    [btnToolbar setAction:@selector(addBar:)]; 

    [self addSubview:btnToolbar] 
    } 

    return self; 
} 

- (void)setBtnTarget:(id)aTarget 
{ 
    [btnSPlit setTarget:aTarget]; 
    [btnSPlit setTitle:"split "+aTarget._UID] 
    [btnToolbar setTarget:aTarget]; 
    [btnToolbar setTitle:"toolbar "+aTarget._UID] 
} 

@end 

источник GridToolbar.j:

@implementation GridToolbar : GridElement 
{ 
    CPButtonBar btnBar; 
} 

- (id)initWithFrame:(CGRect)aFrame vertical:(BOOL)isVertical 
{ 
    self = [super initWithFrame:CGRectMake(
    0,0, 
    isVertical == NO ? aFrame.size.width : 32, 
    isVertical == YES ? aFrame.size.height : 32 
)] 

    if(self) 
    { 
    isVertical == YES ? [self setAutoresizingMask:CPViewWidthSizable] : [self setAutoresizingMask:CPViewHeightSizable]; 
    [self setBackgroundColor:[CPColor blackColor]]; 

    btnBar = [ 
     [CPButtonBar alloc] 
     initWithFrame:CGRectMake(
     0,0, 
     CGRectGetWidth([self bounds]), 
     CGRectGetHeight([self bounds]) 
    ) 
    ]; 
    } 

    return self; 
} 

@end 
+0

Некоторые скриншоты того, как это выглядит сегодня, возможно, с несколькими стрелками, показывающими, на что он должен выглядеть, сделают это намного быстрее, чтобы понять и помочь. –

+0

На самом деле я получил полезное предложение [здесь] (https://groups.google.com/d/topic/objectivej/K9ooJtX6qQM/discussion). Создание моего собственного делегата, который обрабатывает автоматическое изменение размеров подпроектов «GridNode» в соответствии с фиксированным значением, заданным при перетаскивании ресайзера, - это все, что я должен был сделать. –

ответ

2

Я получил полезное предложение here. Создание моего собственного делегата, который обрабатывает автоматическое изменение размера подкадров GridNode в соответствии с фиксированным значением, установленным при перетаскивании разделителя, - это все, что я должен был сделать.