0

InterfaceBuilderのウィンドウにドラッグしたカスタムビューをサブクラス化しました。マウスがビューの境界に入ると、ビューの高さを変更したいと思います。私の問題は、高さの変化が下向きではなく上向きであるということです。ビューの座標をで反転させてみ(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オーバーライドしてを返します。isFlippedYES

于 2013-03-26T04:18:06.550 に答える