Как вы обнаруживаете касания в определенном UIView при перемещении пальца по нескольким UIViews

Сценарий, который я пытаюсь решить, заключается в том, что у меня есть несколько UIView в качестве подвидов главного UIView. Что я хочу сделать, так это выделить прямоугольник представления, скажем, изменив его границу, когда палец скользит по представлению... аналогично тому, что происходит, когда вы перемещаете/перетаскиваете курсор мыши по гипертекстовой ссылке.


person kevj    schedule 20.05.2011    source источник
comment
stackoverflow.com/questions/6006851/ - заменить UITapGestureRecognizer на UIPanGestureRecognizer   -  person TheBlack    schedule 21.05.2011
comment
Спасибо @TheBlack, это будет работать так же, как и при использовании touchesMoved. Думаю, моя проблема заключается в том, чтобы определить, какое подпредставление находится под пальцем, пока выполняется жест в родительском представлении.   -  person kevj    schedule 22.05.2011


Ответы (1)


Вы можете получить местоположение касания внутри вашего метода touchesMoved:, а затем спросить мастер-UIView, какое представление было затронуто:

- (void)touchesMoved: (NSSet *)touches withEvent:(UIEvent *)event {
    UIView *subview = [masterView hitTest:[[touches anyObject] locationInView:masterView] withEvent:nil];
...
}
person highlycaffeinated    schedule 20.05.2011
comment
Спасибо, сильно кофеин, я пробовал это, однако touchesMoved в родительском UIView получает прикосновения в порядке, но если вы начнете касание в этом представлении и скользите по дочернему представлению, дочерний UIView, похоже, не получает события touchesbegan или touchesmoved, поскольку это родительское представление получает все. - person kevj; 21.05.2011
comment
Правильно, и как только у вас будет местоположение касания в родительском представлении, вы можете спросить родительское представление, какому из его подпредставлений соответствует эта точка, используя метод hitTest. Если это не работает, можете ли вы опубликовать код, который вы пробовали? - person highlycaffeinated; 21.05.2011
comment
@highlycaffeinated code - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { UITouch *touch = [[event allTouches] anyObject]; CGPoint location = [touch locationInView: touch.view]; AbstractAnnotation *subview = (AbstractAnnotation *)[self hitTest:[[касается любого объекта] locationInView:self] withEvent:nil]; if ([subview responsesToSelector:@selector(AnnotationSelected)]) { NSLog(@moved over subview); [подвид AnnotationSelected]; }; NSLog(@AnnotationComponent touchesBegan x=%f y=%f, location.x, location.y); } - person kevj; 21.05.2011
comment
Вы получаете местоположение как CGPoint относительно touch.view, но затем вы вызываете hitTest с помощью locationInView self. Это будет работать, если self == touch.view, но не в том случае, если это разные представления. - person highlycaffeinated; 21.05.2011
comment
Кроме того, если self является вашим главным представлением, вы должны использовать self в своем вызове [touch locationInView:]. - person highlycaffeinated; 21.05.2011
comment
попробуем это и свяжемся с вами, спасибо за вашу помощь ;-) - person kevj; 21.05.2011
comment
все равно не повезло! опубликует обновленный код, чтобы увидеть, имеет ли это смысл. - person kevj; 21.05.2011
comment
Хотел бы увидеть ваш код. В тестовом проекте я добавил следующее: - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { NSLog(@touches move - view: %@, [self.view hitTest:[[touches anyObject] locationInView:self.view] withEvent:event]); } консоль показывает каждое представление, которое я перетаскиваю по очереди: 2011-05-22 10:17:45.145 Песочница[46687:207] трогает перемещенное — представление: ‹UIView: 0x5f4dbe0; кадр = (0 20; 320 460); 2011-05-22 10:17:45.161 Песочница[46687:207] касания перемещены — представление: ‹UITableViewCellContentView: 0x5f4d810; кадр = (0 0; 280 38); - person highlycaffeinated; 22.05.2011
comment
Мне удалось заставить этот механизм работать @highlycaffeinated с одним из моих основных подклассов UIView... поэтому я думаю, что моя проблема связана с одним из моих подклассов AbstractAnnotation, который содержит само подпредставление. Я расследую и отпишусь, когда отсортирую .. спасибо за вашу помощь. - person kevj; 23.05.2011
comment
@highlycaffeinated да, это было так, взломал его ... подвид, который меня интересовал, находился за UIImageView ;-) спасибо за всю вашу помощь. - person kevj; 23.05.2011