4

我有一个类GridNode继承CPSplitView用于包装GridELement类型的对象。 GridNode的每个连续分割将其分为两个新的GridNodes(包含GridElements,其父母调整大小)。卡布奇诺 - CPSplitView固定子视图的大小

另一个级别 - 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的子视图的自动调整大小,同时拖动分隔线是我必须做的。