2013-03-26 67 views
0

我劃分了一個自定義視圖,該視圖被拖入Interface Builder中的一個窗口中。當鼠標進入視圖的邊界時,我希望視圖的高度發生改變。我的問題是高度變化是向上而不是向下。我嘗試用(BOOL)isFlipped翻轉視圖的座標,但它對高度變化的方向沒有任何影響。任何幫助我如何改變向下的高度?帶有翻轉繪圖座標的NSView高度方向

#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

這是因爲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

+0

但我實現了isFlipped方法將座標系翻轉到左上角。 – wigging 2013-03-26 04:38:52

+0

'isFlipped'方法不適用於直接設置。您可以在子類中重寫該方法,以便在使用翻轉座標系時返回YES。只要將'isFlipped'設置爲YES就不會翻轉座標系統。 – Rakesh 2013-03-26 04:43:19

+0

@Gavin:我編輯了答案以包含解釋。 – Rakesh 2013-03-26 04:48:55