저는 초보자 인 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 단위를 원점에 추가해야한다고 생각했습니다.
무슨 일입니까?
콘래드, 감사합니다. 내가 왜 오프셋을했는지 이해하려고 하루를 보냈지 만, 나는 내 관점이 창안에 (20, 20)에 위치한다는 것을 알아 차렸다. 이를 변경하면 잘못 정렬됩니다. 그러나 나는 당신이 제안하는대로 전반적인 것을 바로 잡을 것이다. – user1336031
'-drawRect :'와는 좌표계가 일치하므로 관련이 없습니다. 윈도우의 좌표계는 거의 사용하지 않습니다. 전체적인 문제를 수정하면 오프셋이 사라집니다. –