0

私はobjective-cの経験は少しありますが、多くはありません。TouchEvents を介して UIBezierPath をレンダリングしようとしています (つまり、指で線を引きます)。さらに、後で移動または変更できるように、すべての bezierPath を NSMutableArray (パス) に保存したいと考えています。これは、最も単純なアプリケーションです。私のヘッダーは次のようになります。

@interface ViewController : UIViewController{
    UIBezierPath* path;
    NSMutableArray* paths;

    int curThickness;

}

@property (strong, nonatomic) IBOutlet UIView *scene;
@end

シーンは、画面全体を占めるビューであり、パスを描画しようとしている場所です。

関連する実装は次のようになります。

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    NSLog(@"Starting Path");

    path = [UIBezierPath bezierPath];
    path.lineWidth = 15.0f;
    path.lineCapStyle = kCGLineCapRound;
    path.lineJoinStyle = kCGLineJoinRound;
    path.flatness = 2.0;
    path.miterLimit = 4.0;

    [path moveToPoint:[touch locationInView:scene]];

}


- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    [path addLineToPoint:[touch locationInView:scene]];
    [scene setNeedsDisplay];
}


- (void)drawRect:(CGRect)rect {
    NSLog(@"I'm supposed to be drawing something...");
    [[UIColor redColor] set];
    [path stroke];
}



- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    NSLog(@"No more touchy feelies");
    UITouch *touch = [touches anyObject];
    [path addLineToPoint:[touch locationInView:scene]];
    [paths addObject:path];
    [scene setNeedsDisplay];

    NSLog(@"number of paths: %i.", paths.count);

}

エミュレーターで実行すると、すべてのイベントが登録され、DrawRect が呼び出されず、画面に何も描画されず (touchesEnded の最後に [パス トレース] を追加しても)、パスは空ではなく、paths.countパスをいくつトレースしてもゼロのままです。

私は何が欠けていますか?いつものように、あなたの助けは常に大歓迎です.

4

1 に答える 1

1

あなたを助けるべきカップルの事柄:

  1. UIViewControllerを実装していません..代わりにサブクラス- (void)drawRectでこのコードを実行する必要があります!UIView

  2. コレクションが常にゼロカウントである場合paths、これを引き起こす一般的な間違いは、 pathsそれ自体がゼロの場合です。(Obj-cは、メッセージをnilオブジェクトに送信しようとしてもかまいません。クラッシュするのではなく、デフォルト値を返すだけです。)NSMutableArrayオブジェクトをインスタンス化してポイントpathsしたことを再確認します。

于 2012-08-24T19:27:50.323 に答える