2011-01-31 9 views
2

私はいくつかのインベントリに存在するUIViewサブクラスをいくつか持っています。 1つをタップすると、別のドラッグ可能なバージョンがその上に配置されます。あなたが他の人をドラッグしている間、在庫バージョンを置いておきたいです。複製を作成するコードは動作しますが、指をドラッグすると移動しません。touchesBeganの後に作成されたUIViewをドラッグする

新しく作成されたバージョンをリリースしてドラッグを開始すると、期待どおりに移動します。私はこれが元の接触(それは偽薬を作った)がレスポンダーチェーンでドラッグ可能なバージョンを持っていなかったからだと思う。

少しのコード...私の静止 "アイコン" で

...私のViewControllerで

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    [self.viewController placeDraggableItem:self.item WithPoint:self.frame.origin]; 
} 

...私DraggableItemで

- (void)placeDraggableItem:(Item *)item WithPoint:(CGPoint)point 
{ 
    DraggableItem *draggableItem = [[DraggableItem alloc] initWithImage:[UIImage imageNamed:item.graphic]]; 
draggableItem.frame = CGRectMake(point.x, scrollView.frame.origin.y + point.y, 64.0f, 64.0f); 
    [self.view addSubview:draggableItem]; 
    [draggableItem release]; 
} 

...

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    currentPoint = [[touches anyObject] locationInView:self]; 
} 

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event 
{ 
    CGPoint activePoint = [[touches anyObject] locationInView:self]; 
    CGPoint newPoint = CGPointMake(self.center.x + (activePoint.x - currentPoint.x), self.center.y + (activePoint.y - currentPoint.y)); 

    float midPointX = CGRectGetMidX(self.bounds); 
    if (newPoint.x > self.superview.bounds.size.width - midPointX) 
     newPoint.x = self.superview.bounds.size.width - midPointX; 
    else if (newPoint.x < midPointX) // If too far left... 
     newPoint.x = midPointX; 

    float midPointY = CGRectGetMidY(self.bounds); 
    if (newPoint.y > self.superview.bounds.size.height - midPointY) 
     newPoint.y = self.superview.bounds.size.height - midPointY; 
    else if (newPoint.y < midPointY) // If too far up... 
     newPoint.y = midPointY; 

    self.center = newPoint; 
} 

ここで、dラップ可能なバージョンが動作します。そしてドラッグ可能なバージョンは、最初のタッチを最初にリリースした後に移動することができます。しかし、私は、新しく作成したUIViewが元々 "アイコン"のために作られたタッチに反応するようにする必要があると思います。

アイデア?

私はこの質問がこのようなものであることを知っています:How to "transfer" first responder from one UIView to another?しかし、その場合、タッチを受け取るべきビューはすでにそこにありますが、新しく作成されたビューにタッチする必要があります。

答えて

2

新しく作成されたビューに手を触れる方法はわかりませんが、その方法はありません。実際にはドラッグ可能なビューでタッチを処理したいと思うようですが、ドラッグできないビューを作成すると同時に0のアルファでドラッグ可能なビューを作成し、touchesBeganで1に設定します。ドラグ可能なビューはタッチを処理する必要はなく、単にそれらを渡すためにタッチを処理することは意味がありません。

+0

これは実際にはそれを見るにはかなり良い方法で、おそらく私がやっていることよりも少し論理的です。唯一の違いは、それらをすべてレイアウトしておき、ドラッグしてドラッグすると新しいものが下にドロップされることです。 – rob5408

関連する問題