Как узнать, на каком просмотре завершилось сенсорное событие?
Я хочу перетащить UIImage на одну из нескольких кнопок UIB и переместить его в зависимости от того, на какую кнопку я его перетащил.
Проблема, с которой я столкнулся, заключается в том, что 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;
}
}
5 ответов
Очень легко определить ваш окончательно затронутый вид, попробуйте этот код
-(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);
}
}
}
Используйте хит-тестирование. Вы знаете местоположение этой точки как CGPoint с точки зрения конечного суперпредставления, self.view
, Тогда вы можете спросить 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, и я просто смотрю на этот список, чтобы увидеть, какой из потенциальных UIViews может содержать точку).
Важным моментом является то, что если вы знаете представление или представления, на которые вы потенциально перетаскиваете элемент, то вы можете определить, содержит ли фрейм этого представления точку, используя CGRectContainsPoint. Важно помнить, что они могут лежать в разных системах координат, и может потребоваться преобразование из одной в другую перед сравнением.
Свифт 4:
переопределить func touchesEnded(_ touches: Set, с событием: UIEvent?) {
if let touch = touches.first{
let location = touch.location(in: self.view)
let v = touch.view
// продолжать.. }
}