touchesbeganの後に作成されたuiviewをドラッグします
-
27-10-2019 - |
質問
一種の在庫に存在するいくつかのuiviewサブクラスがあります。 1つをタップすると、別のドラッグバージョンがその上に配置されます。他の人をドラッグしている間、在庫バージョンを置いておきたいです。重複した機能を作成するコードは、指をドラッグすることで動きません。
リリースしてから、新しく作成されたバージョンのドラッグを開始すると、予想どおりに移動します。これは、元のタッチ(デュペを作った)がレスポンダーチェーンにドラッグ可能なバージョンを持っていなかったためだと思います。
小さなコード...
私の静止した「アイコン」で...
- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
[self.viewController placeDraggableItem:self.item WithPoint:self.frame.origin];
}
私のviewcontrollerで...
- (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];
}
私のdraggableItemで...
- (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;
}
再びドラッグ可能なバージョンを作成します。そして、最初のタッチをリリースした後、ドラッグ可能なバージョンを移動できます。しかし、「アイコン」のために元々作られたタッチに応答するために、新しく作成されたUIViewを取得する必要があると思います。
何か案は?
私はこの質問がこれに似ていることを知っています: あるuiviewから別のuiviewに最初のレスポンダーを「転送」する方法は? しかし、その場合、タッチを受け取るはずのビューはすでにそこにありますが、新しく作成されたビューにタッチを渡す必要があります。
解決
新しく作成されたビューに触れる方法はわかりませんが、それはそれを行う方法がないという意味ではありません。ドラッグ可能なビューがタッチを処理するだけであるように見えます。おそらく、ドラッグ不可のビューを作成すると同時に、0のアルファを使用して各ドラッグビューを作成し、タッチベガンでは1に設定します。 - ドラッグ可能なビューでは、タッチを処理する必要はありません。その後、それらを渡すためだけにタッチを処理させることは意味がありません。