Как узнать, на каком событии закончилось событие Touch?
Я хочу перетащить UIImage на один из нескольких UIButtons и переместить его на основании того, на какую кнопку я его перетаскиваю.
Проблема, с которой я столкнулся, заключается в том, что 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;
}
}
Ответы
Ответ 1
Очень легко обнаружить ваш наконец-то затронутый вид, попробуйте этот код
-(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);
}
}
}
Ответ 2
Используйте hit-testing. Вы знаете местоположение этого пункта как CGPoint с точки зрения максимального контроля, self.view
. Затем вы можете запросить self.view
, какой из подзонов находится в этой точке:
CGPoint location = [touch locationInView:self.view];
UIView* v = [self.view hitTest:location withEvent:nil];
UIView v
- это вид, который вы ищете.
Ответ 3
В общем, вам нужно взять точку, в которой закончилось касание, и определить, находится ли она в интересующем вас представлении. Я делаю это, используя код, похожий на следующий:
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. Важно помнить, что они могут лежать в разных системах координат, и может быть необходимо преобразовать их из одного в другое перед сравнением.
Ответ 4
Предполагая, что в вашем контейнере имеется представление @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
}
}