我将自定义视图子类化,我将其拖入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
答案 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
。