2012-04-16 8 views
1

저는 초보자 인 Cocoa 프로그래머입니다. 라이온의 OS X 용 XCode 4.3.2로 개발할 프로그램의 사용자 정의보기에 그려진 기하학적 다이어그램 옆에 프로그래밍 방식으로 코코아 NSTextField (사용자 정의보기의 하위보기)를 배치하려고합니다. 내 문제의 예제를 간단하게 유지하기 위해 다이어그램이 텍스트 필드를 묶는 상자 (베젤 또는 NSTextField와 함께 사용할 수있는 경계에 추가로 더 멀리, 실제로는 다이어그램이 더 복잡해 짐)가 될 것이라고 가정 해 봅시다. 텍스트 필드와 상자가 예상대로 정렬되지 않습니다 (아래 예제 코드 참조). 왜?NSBezierPath로 그려진 다이어그램에서 NSTextField를 올바르게 배치 할 수 없습니다.

간단한 비 문서 기반 프로젝트를 진단 예제로 만들었습니다.이 프로젝트에서는 사용자 정의보기를 응용 프로그램 창으로 끌어다 놓고 아래 코드를 추가하고 IBOutlet에서보기로 연결했습니다 :

AnAppDelegate.h :

#import <Cocoa/Cocoa.h> 

@interface AnAppDelegate : NSObject <NSApplicationDelegate> { 
    IBOutlet NSView *view; 
    NSRect textFieldRect; 
    NSTextField *textField; 
    NSBezierPath *box; 
} 

@property (assign) IBOutlet NSWindow *window; 

@end 

AnAppDelegate.m :

이 프로그램이 실행
#import "AnAppDelegate.h" 

@implementation AnAppDelegate 

@synthesize window = _window; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
    textFieldRect = NSMakeRect(100, 100, 100, 20); 
    textField = [[NSTextField alloc] initWithFrame:textFieldRect]; 

    NSRect frame = [textField frame]; 
    NSLog(@"frame %f %f %f %f", frame.origin.x, frame.origin.y, frame.size.width, frame.size.height); 

    NSRect bounds = [textField bounds]; 
    NSLog(@"bounds %f %f %f %f", bounds.origin.x, bounds.origin.y, bounds.size.width, bounds.size.height); 

    // Draw the text field 
    [textField setStringValue:@"My text field"]; 
    [textField setBezeled:YES]; 
    [textField setDrawsBackground:NO]; 
    [textField setEditable:YES]; 
    [textField setSelectable:YES]; 
    [view addSubview:textField]; 

    // Draw a box (rectangle) around the text field 
    //NSRect boxRect = [textField frame]; 
    box = [[NSBezierPath alloc] init]; 
    //boxRect.origin.x += 10; 
    //boxRect.origin.y += 10; 
    //boxRect.size.width += 20; 
    //boxRect.size.height += 20; 
    [box appendBezierPathWithRect:[textField frame]]; // :boxRect]; 
    [box stroke]; 

} 

@end 

박스가 왼쪽과 아래 난민 나타납니다 텍스트 필드, 각 차원의 텍스트 필드 높이에 따라 나는 그것이 NSTextField 서브 뷰 밑에 나타나서 숨겨지기를 기대한다. 물론 프로덕션 프로그램에서는 의미가 없습니다.)

위의 소스의 주석 처리 된 행의 주석 처리를 제거하면 (상자 대신 boxRect를 프레임에 추가하면) 텍스트 상자의 10 개 단위로 내 상자가 나타납니다.하지만 +10 단위가 아닌 -10 단위를 원점에 추가해야한다고 생각했습니다.

무슨 일입니까?

답변

0

위치 확인을하지 않으면 여기서 해결해야 할 몇 가지 중요한 문제가 있습니다. 당신은 코코아 드로잉 시스템을 오용하고 있습니다. 응용 프로그램의 임의의 지점에서 (일반적으로) 도면 그리기를 시작할 수 없습니다 ([box stroke]). 그래픽 컨텍스트를 설정해야합니다.

화면에 그리려면 코드를 사용자 지정보기의 -drawRect: 메서드에 넣습니다. 프레임 워크는 해당 메서드를 호출하기 전에 적절한 컨텍스트를 설정해야하며 이후 컨텍스트를 무너 뜨릴 것입니다.

코드가 전혀 작동하지 않는다는 것에 조금 놀랐지 만 잘 정의 된 그래픽 컨텍스트가 없으므로 관련 좌표계가 무엇인지 알 수있는 방법이 없습니다. 그림은 기본적으로 어딘가에 무작위로 진행됩니다. Cocoa Drawing Guide에 따라 코드를 리팩토링하면 더 나은 결과를 얻을 수 있습니다.

여담으로

, 당신은

// Draw the text field

노 코멘트! 너는 그림이 아니다. 텍스트 필드; 이것은 다양한 뷰 '-drawRect:이 호출 될 때 실행 루프의 다음 턴 동안 당신을위한 프레임 워크에 의해 수행됩니다. 보기 계층에보기를 추가하면 입니다. 이것은 현저한 차이가 아닙니다. 언제든지보기 계층 구조를 최대 (*)로 조작 할 수 있습니다. 일반적으로 -drawRect:에 그릴 수 있습니다.

(*) : 스레딩은 문제를 복잡하게하지만, 코코아를 처음 시작하는 경우에는 관련이 없습니다.

+0

콘래드, 감사합니다. 내가 왜 오프셋을했는지 이해하려고 하루를 보냈지 만, 나는 내 관점이 창안에 (20, 20)에 위치한다는 것을 알아 차렸다. 이를 변경하면 잘못 정렬됩니다. 그러나 나는 당신이 제안하는대로 전반적인 것을 바로 잡을 것이다. – user1336031

+0

'-drawRect :'와는 좌표계가 일치하므로 관련이 없습니다. 윈도우의 좌표계는 거의 사용하지 않습니다. 전체적인 문제를 수정하면 오프셋이 사라집니다. –