【问题标题】:NSView height direction with flipped drawing coordinates具有翻转绘图坐标的 NSView 高度方向
【发布时间】:2013-03-26 03:27:07
【问题描述】:

我将一个自定义视图子类化,然后将其拖入 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

【问题讨论】:

    标签: objective-c nsview nsrect nstrackingarea cgsize


    【解决方案1】:

    这是因为 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

    【讨论】:

    • 但是我实现了isFlipped方法将坐标系翻转到左上角。
    • isFlipped 方法不能直接设置。您在子类中覆盖该方法,以便在使用翻转坐标系时返回 YES。仅将isFlipped 设置为YES 不会翻转坐标系。
    • @Gavin:哎呀。完全错过了。只是粗略地看了一眼。我是不是自欺欺人了。:) 它应该有效。无论如何,您是否尝试过第一个解决方案?
    • @Gavin:等一下。覆盖这个视图的isFlipped 方法不会改变任何东西。必须在父视图上完成,这样高度才能改变你想要的方式。通过覆盖它,只有ViewA 中的绘图/子视图会按照您想要的方式运行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多