これは、ObjectiveC と Cocoa の学習曲線の一部として、私が書いているプログラムです (他の誰かのプログラムをコピーして学習しないのではなく、自分で作成したものです)。NSView で単純な形状を描画したい (今のところ、楕円形と長方形に限定している)。アイデアは、各 NSBezierPath を NSMutableArray に記録して、保存/読み込み、元に戻す/やり直しも調査/実装できるようにすることです。キャンバスがあり、ツールを選択するために使用する 2 つのボタンと同様に描画できます。パスを処理するために、描画された各オブジェクトの NSBezierPath、色の値、およびサイズの値を保持できる別のオブジェクトを作成しました。これは、配列に格納したいものです。mouseDown/Dragged/Up を使用して、描画パスの座標を取得します。ただし、これは物事が不安定になる場所です。パス/色などを保持するはずのオブジェクトをインスタンス化できます。情報ですが、インスタンス変数を変更しようとすると、アプリがクラッシュし、デバッガーに有用なメッセージが表示されません。コード スニペットは短くするように努めますが、さらに含める必要がある場合は教えてください。コードを機能させるために多くのことを試みたため、コードも少し劣化しました。
プロジェクト: Cocoa ドキュメント ベースのアプリ
次の .m/.h ファイルがあります
MyDocument:NSDocument
- XCode によって生成されたDrawnObject:NSObject
- 描画されたオブジェクト、つまりパス、色、タイプ (楕円形/四角形)、およびサイズを処理しますCanvas:NSView
-まあ、図面を表示し、マウスとボタンを扱います
NSMutableArray
Canvas は、オブジェクトの維持も担当しDrawnObject
ます。
DrawnObject.h
次のようになります。
#import <Foundation/Foundation.h>
//The drawn object must know what tool it was created with etc as this needs to be used for generating the drawing
@interface DrawnObject : NSObject {
NSBezierPath * aPath;
NSNumber * toolType;//0 for oval, 1 for rectangular etc....
float toolSize;
struct myCol{
float rd;
float grn;
float blu;
float alp;
} toolColor;
}
-(void)setAPath:(NSBezierPath *) path;
-(NSBezierPath *)aPath;
@property (readwrite,assign) NSNumber * toolType;
-(float)toolSize;
-(void)setToolSize:(float) size;
-(struct myCol *)toolColor;
-(void)setCurrentColor:(float)ref:(float)green:(float)blue:(float)alpha;
@end
Canvas.h
このように見えます
#輸入 #import "DrawingObject.h" @interface Canvas : NSView { NSMutableArray * myDrawing; NSPoint downPoint; NSPoint currentPoint; NSBezierPath * viewPath;// ユーザーがマウスをドラッグするとパスを表示します NSNumber * currentToolType; BOOL mouseUpFlag;//それを機能させるために差分の方法を試しています BOOL マウスドラッグ; } -(IBAction)useOval:(id)送信者; -(IBAction)useRect:(id)送信者; -(IBAction)showTool:(id)送信者; -(NSRect)currentRect; -(NSBezierPath *)createPath:(NSRect) aRect; -(void)setCurrentToolType:(NSNumber *) t; -(NSNumber *)currentToolType; @終わり
ファイルには、マウスを処理するためのいくつかの関数があり、Canvas.m
NSView/XCode もドロップインされ
て
-(id)initWithFrame:(NSRect)frame-(void)drawRect:(NSRect)rect
います。元々mouseUp
、新しいものを配列に挿入しようとしてDrawnObject
いましたが、クラッシュが発生しました。そこで、2 つのBOOL
フラグを使用して、マウスがいつ離されたかを確認します (不格好ですが、しようとしています....)drawRect
配列に挿入します。以下の方法を含め、アプリが失敗する原因を示しました。
- (void)drawRect:(NSRect)rect { //これは自動的に呼び出されます // ここにコードを描画します。 //NSLog(@"drawRect 内のツール タイプは %d です", [self currentTool]); NSRect 境界 = [自己境界]; NSRect aRect = [自己 currentRect]; viewPath = [self createPath:aRect]; //the createPath method uses the tool type to switch between oval and rect bezier curves if(mouseUpFlag==YES && mouseDrag==YES){ mouseDrag=NO; //Create a new drawnObject here DrawnObject * anObject = [[DrawnObject alloc]init];//- WORKS FINE UP TO HERE NSLog(@"CREATED NEW drawnObject"); [anObject setAPath:viewPath]; //- INSTANT APP DEATH!!!! NSLog(@"Set a path in drawnObject"); [anObject setToolType:[[NSNumber alloc]initWithInt:5]]; NSLog(@"Set toolType in DrawnObject"); [anObject setToolType:currentToolType]; [myDrawing addObject:anObject]; NSLog(@"Added Object"); } [[NSColor colorWithCalibratedRed:0.0 green:0.9 blue:0.0 alpha:0.5]set]; [NSBezierPath fillRect:境界]; [[NSColor lightGrayColor]set]; [viewPath ストローク]; //これは、ユーザーが描画が行われている場所を確認できるようにするためです //ここで、配列にパスを描画します [[NSColor blueColor]set]; for(DrawnObject * myDrawing の indexedObject){ [[indexedObject aPath] stroke];//これにより、すべてのオブジェクトの実際の描画が行われます } }
これはオブジェクトスコープか何かに関係していると思いますが、私はそれを理解できません。私が言ったように、私がいろいろ試してみると、コードは一種の変容を遂げました。悲しいことに、良い方向ではありません。それらのBOOLSなどのように。
ヘルプ!そこに賢い人がいるなら、私を正しい方向に向けてください!
これを追加:
-(NSBezierPath *)createPath:(NSRect) aRect
{
NSBezierPath * tempPath;
//I need to know what tool
switch(0){ //temporary - this would use the toolType as a selector
case 0:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
case 1:
tempPath = [NSBezierPath bezierPathWithRect:aRect];
break;
default:
tempPath = [NSBezierPath bezierPathWithOvalInRect:aRect];
break;
}
return tempPath;
}