Направление высоты 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
,