UIImageをいくつかのUIButtonの1つにドラッグし、ドラッグ先のボタンに基づいて再配置したいと思います。
私が遭遇した問題は、UITouchがタッチを開始したビューのみを記録することです。タッチが終了したビューにアクセスしたいのです。これどうやってするの?
コード:
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
dealerBtnOrigin = [touch locationInView:self.view];
//NSLog(@"%u %u",touch.view.tag, ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).tag);
//CHECK TO SEE WHICH BUTTON WAS TOUCHED
if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
{
((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
}
}
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
{
((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
}
}
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [touches anyObject];
CGPoint location = [touch locationInView:self.view];
UIView *endView = [self.view hitTest:location withEvent:nil];
if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
{
NSLog(@"%u %u",endView.tag, touch.view.tag);
if([buttons containsObject:(UIButton *)endView])
{
[[dealerBtns objectAtIndex:[table getButtonSeat]] setHidden:YES];
[table passButton:touch.view.tag];
[[dealerBtns objectAtIndex: touch.view.tag] setHidden:NO];
}
((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = dealerBtnOrigin;
}
}
最後に触れたビューを検出するのは非常に簡単です。このコードを試してください
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
CGPoint location = [[touches anyObject] locationInView:self.view];
CGRect fingerRect = CGRectMake(location.x-5, location.y-5, 10, 10);
for(UIView *view in self.view.subviews){
CGRect subviewFrame = view.frame;
if(CGRectIntersectsRect(fingerRect, subviewFrame)){
//we found the finally touched view
NSLog(@"Yeah !, i found it %@",view);
}
}
}
ヒットテストを使用します。このポイントの場所は、究極のスーパービューself.view
の観点からCGPointとして知っています。次に、self.view
に、そのポイントがどのサブビューにあるかを尋ねることができます。
CGPoint location = [touch locationInView:self.view];
UIView* v = [self.view hitTest:location withEvent:nil];
UIView v
は、探しているビューです。
コンテナにターゲットビューの@property
があり、ターゲットビューがコンテナに追加されていると仮定します。
@property (nonatomic, strong) UIView* targetView;
// ...
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
NSSet* touchesForTargetView = [event touchesForView:self.targetView];
if (touchesForTargetView.allObjects.count != 0) {
// touch was at target view
}
else {
// touch was somewhere else
}
}
一般に、タッチが終了した時点で、それが目的のビュー内にあるかどうかを判断する必要があります。これは、次のようなコードを使用して行います。
CGPoint newCenter = dragView.center;
for (UIView *v in dropTargets)
{
CGRect convertedTargetFrame = [v.superview convertRect:v.frame toView:nil];
if (CGRectContainsPoint(convertedTargetFrame, newCenter))
{
activeTargetIndex = idx;
}
}
(このコードは、関係のないものをたくさん取り除くためにその場で編集されましたが、私はdropTargetsに潜在的なドロップターゲットのリストを保持しています。これは、そのリストを見て、潜在的なUIViewのどれがポイントを含んでいるかを確認しているだけです)。
重要なことは、アイテムをドラッグする可能性のあるビューがわかっている場合は、CGRectContainsPointを使用して、そのビューのフレームにポイントが含まれているかどうかを判断できるということです。重要なことは、それらが異なる座標系にある可能性があり、比較の前に一方から他方に変換する必要がある場合があることに留意することです。