如何切换NSView的可见性+调整同级视图的大小



我们有一个父视图MainNSView)和两个子视图ContentStatusBar(一个在另一个之上;都是简单的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

最新更新