NSView高度方向与翻转绘图坐标

时间:2013-03-26 03:27:07

标签: objective-c nsview nsrect nstrackingarea cgsize

我将自定义视图子类化,我将其拖入Interface Builder中的一个窗口。当鼠标进入视图的边界时,我希望视图的高度发生变化。我的问题是高度变化是向上而不是向下。我尝试用(BOOL)isFlipped翻转视图的坐标,但它对高度变化的方向没有任何影响。有关如何改变向下高度的任何帮助吗?

#import "ViewA.h"

@implementation ViewA

- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {

        NSTrackingArea *trackingArea = [[NSTrackingArea alloc] initWithRect:[self bounds]
                                                                    options:(NSTrackingMouseEnteredAndExited|NSTrackingActiveAlways)
                                                                      owner:self
                                                                   userInfo:nil];
        [self addTrackingArea:trackingArea];

    }

    return self;
}

- (void)drawRect:(NSRect)dirtyRect
{
    [[NSColor redColor] setFill];
    NSRectFill(dirtyRect);
}

- (BOOL)isFlipped {
    return YES;
}


- (void)mouseEntered:(NSEvent *)theEvent {

    NSRect rect = self.frame;
    rect.size.height = 120;
    self.frame = rect;
}

- (void)mouseExited:(NSEvent *)theEvent {

    NSRect rect = self.frame;
    rect.size.height = 90;
    self.frame = rect;
}

@end

1 个答案:

答案 0 :(得分:0)

这是因为Cocoa的坐标系统从左下角开始。即坐标(0,0)位于屏幕/父视图的左下角。因此,y坐标(高度)的增量会使尺寸向上增大。你应该做的是当你增加高度,向下移动原点,例如如果你想将帧高增加/减少到90;

CGFloat heightDiff = 90 -self.frame.size.height;

NSRect  rect = self.frame;

rect.size.height = 90;

rect.origin.y -= heightDiff;

self.frame = rect;

应该这样做。

覆盖父视图的isFlipped,而不是视图本身的方法以获得预期的行为。

例如,如果您要将其添加到window的内容视图中,则将子类命名为contentView,并覆盖其isFlipped方法以返回YES