2013-03-26 7 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

이것은 코코아의 좌표계가 왼쪽 하단부터 시작하기 때문입니다. 즉 좌표는 (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의 내용보기에 추가하는 경우, 하위 클래스 창문 contentViewYES를 반환하는 그 isFlipped 메소드를 오버라이드 (override).

+0

그러나 isFlipped 메서드를 구현하여 좌표계를 맨 위 왼쪽으로 뒤집습니다. – wigging

+0

'isFlipped' 메서드는 직접 설정하지 않습니다. 뒤집은 좌표계를 사용하는 경우 YES를 리턴하도록 서브 클래스의 메소드를 대체합니다. 단지'isFlipped'를 YES로 설정하면 좌표계가 바뀌지 않습니다. – Rakesh

+0

@ 개 빈 : 설명을 포함하도록 답변을 편집했습니다. – Rakesh