我们有一个父视图Main
(NSView
)和两个子视图Content
和StatusBar
(一个在另一个之上;都是简单的NSViews)。
切换StatusBar
视图的最佳Cocoa友好方式是什么?
- 如果建议的解决方案包括动画,我真的很喜欢
- 我真的不需要任何与外部插件等相关的建议(例如BWToolkit)
编辑:
关于调整大小部分:
- 当
StatusBar
视图消失时,Content
视图应占据其位置(最佳方式)或相应地缩小Main
视图 - 上面的情景是相反的
好。所以,我反复思考,这就是我所做到的;NSView上用于切换视图的类别…:-)
标题:
#import <AppKit/AppKit.h>
#define DIRECTION_UP 0
#define DIRECTION_RIGHT 1
#define DIRECTION_DOWN 2
#define DIRECTION_LEFT 3
@interface NSView (NSView_Functions)
- (void)toggleWithView:(NSView*)mainView usingDirection:(int)direction;
@end
实施:
#import "NSView+Functions.h"
@implementation NSView (NSView_Functions)
- (void)toggleWithView:(NSView*)mainView usingDirection:(int)direction
{
NSRect mr = [mainView frame];
NSRect sr = [self frame];
#ifdef DEBUG
NSLog(@"MR @ %f,%f (%f X %f)",mr.origin.x,mr.origin.y,mr.size.width,mr.size.height);
NSLog(@"SR @ %f,%f (%f X %f)",sr.origin.x,sr.origin.y,sr.size.width,sr.size.height);
#endif
NSRect newMr;
CGFloat newX;
CGFloat newY;
CGFloat newWidth;
CGFloat newHeight;
switch (direction) {
case DIRECTION_RIGHT:
newX = mr.origin.x;
newY = mr.origin.y;
newHeight = mr.size.height;
if (![self isHidden]) newWidth = mr.size.width + sr.size.width;
else newWidth = mr.size.width - sr.size.width;
break;
case DIRECTION_DOWN:
newX = mr.origin.x;
newWidth = mr.size.width;
if (![self isHidden])
{
newY = mr.origin.y-sr.size.height;
newHeight = mr.size.height+sr.size.height;
}
else {
newY = mr.origin.y+sr.size.height;
newHeight = mr.size.height-sr.size.height;
}
break;
case DIRECTION_LEFT:
newY = mr.origin.y;
newHeight = mr.size.height;
if (![self isHidden])
{
newX = mr.origin.x-sr.size.width;
newWidth = mr.size.width+sr.size.width;
}
else {
newX = mr.origin.x+sr.size.width;
newWidth = mr.size.width-sr.size.width;
}
break;
case DIRECTION_UP:
newX = mr.origin.x;
newY = mr.origin.y;
newWidth = mr.size.width;
if (![self isHidden]) newHeight = mr.size.height + sr.size.height;
else newHeight = mr.size.height - sr.size.height;
break;
default:
break;
}
newMr = NSMakeRect(newX,newY,newWidth,newHeight);
if (![self isHidden]) [self setHidden:YES]; else [self setHidden:NO];
[mainView setFrame:newMr];
}
@end