私は初心者のココアプログラマーです。Lion 上の OS X 用の XCode 4.3.2 で開発されるプログラムのカスタム ビューに描画された幾何学的図の隣に、Cocoa NSTextField (カスタム ビューのサブビュー) をプログラムで配置したいと考えています。私の問題の例を単純にするために、ダイアグラムがテキストフィールドを囲むボックスであるとしましょう (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 単位を追加する必要があると予想していました。
何が起こっている?