これは、ObjectiveC と Cocoa の学習曲線の一部として、私が書いているプログラムです (他の誰かのプログラムをコピーして学習しないのではなく、自分で作成したものです)。NSView で単純な形状を描画したい (今のところ、楕円形と長方形に限定している)。アイデアは、各 NSBezierPath を NSMutableArray に記録して、保存/読み込み、元に戻す/やり直しも調査/実装できるようにすることです。キャンバスがあり、ツールを選択するために使用する 2 つのボタンと同様に描画できます。パスを処理するために、描画された各オブジェクトの NSBezierPath、色の値、およびサイズの値を保持できる別のオブジェクトを作成しました。これは、配列に格納したいものです。mouseDown/Dragged/Up を使用して、描画パスの座標を取得します。ただし、これは物事が不安定になる場所です。パス/色などを保持するはずのオブジェクトをインスタンス化できます。情報ですが、インスタンス変数を変更しようとすると、アプリがクラッシュし、デバッガーに有用なメッセージが表示されません。コード スニペットは短くするように努めますが、さらに含める必要がある場合は教えてください。コードを機能させるために多くのことを試みたため、コードも少し劣化しました。
プロジェクト: Cocoa ドキュメント ベースのアプリ
次の .m/.h ファイルがあります
MyDocument:NSDocument- XCode によって生成されたDrawnObject:NSObject- 描画されたオブジェクト、つまりパス、色、タイプ (楕円形/四角形)、およびサイズを処理しますCanvas:NSView-まあ、図面を表示し、マウスとボタンを扱います
NSMutableArrayCanvas は、オブジェクトの維持も担当し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.mNSView/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;
}