I have a class GridNode
inheriting from CPSplitView
that is used to wrap objects of type GridELement
. Each consecutive split of a GridNode
divides it into two new GridNodes
(containing GridElements
that resize with their parent).
Another class - GridToolbar
inherits from GridElement
. It should basically have the same behaviour as GridElement
although the size shouldn't change automatically (as the container is resized) but only after user drags the splitter.
The problem is, even if I set the AutoresizingMask
to a specific direction (as the toolbars can be either vertical or horizontal) it still gets resized in both of them.
Any suggestions on what I can do to prevent this from happening?
source of 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
source of 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
source of 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
I received a useful suggestion here. Creating my own delegate that is handling the automatic resize of GridNode
's subviews according to a fixed value set while dragging the divider was all I had to do.