0

我对一个自定义视图进行了子类化,并将其拖入 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
4

1 回答 1

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

于 2013-03-26T04:18:06.550 回答