1

以前、このプロジェクトに関して別の質問をしたことがありますが、Travis は非常に役に立ちました。前の質問

そのアドバイスを念頭に置いて、C4Shape クラスのサブクラスを作成しようとしています。X と Y の位置値のクラスに 2 つのプロパティ (両方とも float) を追加しました。C4Shape の .center プロパティを呼び出すだけではない理由は、それらをキャンバスに追加するために、中央ではなく左上隅を使用することを好むからです。

この新しいクラスのカスタム Init メソッドを作成しようとしていますが、エラーが発生します。

私が使用しているカスタム初期化コードは次のとおりです。

customShape.m

- (id)initWithColor:(UIColor *)fillColor atX:(float)_xValue atY:(float)_yValue
{
CGRect frame = CGRectMake(_xValue, _yValue, 100, 100);
self = [customShape rect:frame];

self.lineWidth = 0.0f;
self.fillColor = fillColor;
self.xValue = _xValue;
self.yValue = _yValue;


return self;
}

C4WorkSpace.m

-(void)setup {
customShape *testShape = [[customShape alloc]initWithColor:[UIColor greenColor] atX:50.0f atY:50.0f];

[self.canvas addShape:testShape];
}

これは私が見る警告です:「「 C4Shape self = [customShape rect:frame];*」から「customeShape * _strong」に割り当てられている互換性のないポインタータイプ」

これを実行しようとするとスローされる実際のエラーは次のとおりです。

前と同じように、色の値を保持できるボタンを作成しています。そのボタンをタップすると、そのボタンの fillColor と iPad の IP を含む UDP パケットが送信されます。

4

1 に答える 1

2

init メソッドの実装にかなり近づいています。次の方法で再構築します。

- (id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint {
    self = [super init];
    if(self != nil) {
        CGRect frame = CGRectMake(0,0, 100, 100);
        [self rect:frame];
        self.lineWidth = 0.0f;
        self.fillColor = aColor;
        self.origin = aPoint;
    }
    return self;
}

注意すべき点がいくつかあります。

  1. サブクラス化するときは、常にオブジェクトのスーパークラスの init メソッドを呼び出すとよいでしょう
  2. initサブクラスの をステートメントでラップしif、スーパークラスの init が適切に返されるかどうかを確認することをお勧めします。
  3. 新しいオブジェクトのフレームを作成し、直接呼び出しrect:ますself
  4. 目に見えるすべての C4 オブジェクトにはポイントがあるため、との値を直接origin使用する代わりに、 で原点を設定できます( は左上隅です)。xyCGPointorigin

次に、このメソッドを.hファイルに追加する必要があります。

@interface MyShape : C4Shape
-(id)initWithColor:(UIColor *)aColor origin:(CGPoint)aPoint;
@end

C4WorkSpace最後に、次のようにシェイプを作成できます。

MyShape *m = [[MyShape alloc] initWithColor:[UIColor darkGrayColor]
                                     origin:CGPointMake(100, 100)];

また、タップされたメソッドに行を追加すると、ボタンの原点を確認できます。

-(void)heardTap:(NSNotification *)aNotification {
    MyShape *notificationShape = (MyShape *)[aNotification object];
    C4Log(@"%4.2f,%4.2f",notificationShape.center.x,notificationShape.center.y);
    C4Log(@"%4.2f,%4.2f",notificationShape.origin.x,notificationShape.origin.y);
    C4Log(@"%@",notificationShape.strokeColor);
}

xと のy値をプロパティとして扱うこともできますが、CGPoint構造体を扱うことをお勧めします。ほとんど同じですが、C4 から Objective-C に進むにつれてCGPoint、他のCGジオメトリ構造がどこでも使用されていることに気付くでしょう。

于 2013-05-05T19:02:18.120 に答える