如何切换NSView + Resize同级视图的可见性

时间:2012-03-23 10:30:20

标签: objective-c cocoa resize nsview

我们有一个父Main视图(NSView)和两个子视图ContentStatusBar(一个在另一个之上;两个都是简单的NSView)。

切换StatusBar视图的最佳Cocoa友好方式是什么?

  • 如果推荐的解决方案包含动画
  • ,我真的很喜欢它
  • 我真的不需要任何与外部插件等相关的建议(例如BWToolkit)

修改:

关于调整大小部分:

  • StatusBar视图消失时,Content视图应该占据其位置(最佳方式)或Main视图相应缩小
  • 以上情景,反过来。

1 个答案:

答案 0 :(得分:0)

行。所以,我一遍又一遍地想到这一点,这就是我所管理的; 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