0

問題はこれです...

UIBezierClass を拡張する PathExtended というクラスを作成し、そこに NSString ID を追加しました。

次に、PathExtended の配列があります。drawrectメソッドで私は書いた:

p = [[PathExtended alloc] init];

for (int i=0; i<[arrayOfPaths count]; i++) {

    [p appendPath:[arrayOfPaths objectAtIndex:i]];
    [p closePath];
}

[p applyTransform:CGAffineTransformMake(a, b, c, d, e, f)];
[p fill];

ここで、touchend メソッドでテストすると、次のようになります。

if ([p containsPoint:pointTouched]) {
            NSLog(@"There is!");
        }

大丈夫です!!!代わりに、テストすると:

if ([p containsPoint:pointTouched]) {
            NSLog(@"ID= %@", p.ID);
        }

ログが空白です!!

なぜそれが起こるのか理解できますが、問題を解決する方法がわかりません。appendPath は一意のパスを作成すると思っていたので、ID などの各パス情報は失われます。また、appendPath メソッドを使用せずに各パスを描画すると、問題を解決できると思いましたが、わかりません... 間違った方法に従っているようです。

何か案が???私の英語でごめんなさい(私はイタリア人です:P)

編集:

PathExtended .h

@interface PathExtended : UIBezierPath {

NSString* ID;
}

@property (nonatomic, readwrite) NSString* ID;

-(id) initwithID:(NSString*) _ID;
4

1 に答える 1

1

NSDecimalNumber のサブクラスを作成し、それを MyImaginaryNumber と呼び、サブクラスが虚数コンポーネントを格納した場合にどうなるか想像してみてください。のようなメソッドを呼び出そうとするとどうなります-decimalNumberByAdding:か? そのメソッドの NSDecimalNumber の実装が、結果の数値に虚数部を含むことを本当に期待していませんか? NSDecimalNumber は明らかに虚数部について何も知らないので、正しいことを期待することはできません。

-appendPath:PathExtended オブジェクトを操作する場合は、PathExtended の追加情報を保持する実装でオーバーライドする必要があります-appendPath:。もちろん、便利な場合は、独自の内部から UIBezierPath の実装を呼び出すこともできます。たとえば、ID がコンポーザブルである場合、次のようにすることができます。

-(PathExtended*)appendPath:(PathExtended*)path
{
    PathID newID = [self composeID:path.ID];
    PathExtended *newPath = [PathExtended pathWithBezierPath:[super appendPath:path] ID:newID];
    return newPath;
}

ログ メッセージがまったく出力されなかった理由はわかりませんが、それが原因である可能性はありますが、UIBezierPath にIDプロパティがないことが原因である可能性があります。

于 2011-09-06T13:41:43.650 に答える