Направление высоты NSView с перевернутыми координатами чертежа

Я вложил в подкласс пользовательский вид, который перетаскивал в окно в Интерфейсном Разработчике Когда мышь входит в границы вида, я бы хотел, чтобы высота вида менялась. Моя проблема в том, что изменение высоты происходит вверх, а не вниз. Я попытался перевернуть координаты вида с (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) находится в левом нижнем углу экрана / родительского вида. Таким образом, приращение координаты 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,

Другие вопросы по тегам