iOS-обнаружение касаний в UIView?
поэтому у меня есть подкласс UIView, который должен обнаруживать касания. Вид обнаруживает касания, только если касания начались внутри текущего вида. Когда прикосновения начинаются вне представления, и они перемещаются внутри моего пользовательского представления, touchesMoved не вызывается. Любое решение для обнаружения движущихся касаний, которые не начались в текущем представлении?
@implementation MycustomView
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
// This only gets called if touches have started in the current View
}
@end
4 ответов
следующее решение сработало. У меня есть несколько экземпляров MyCustomView; по мере перемещения касаний я хочу обнаружить виды, которые затрагиваются
Я закончил перемещение сенсорного обнаружения из MyCustomView в его супервизор, поэтому следующий код больше не находится в классе MyCustomView:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
CGPoint touchLocation = [touch locationInView:self.contentView];
for (UIView *view in self.contentView.subviews)
{
if ([view isKindOfClass:[MyCustomView class]] &&
CGRectContainsPoint(view.frame, touchLocation))
{
}
}
}
это должно исправить:
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
UITouch *touch = [[event allTouches] anyObject];
for (UIView* subView in self.subviews)
{
if([subView pointInside:[self convertPoint:touch toView:subView] withEvent:event])
{
//do your code here
}
}
}
один из способов сделать это (хотя могут быть и другие) - отключить взаимодействие пользователя с подвидами и сделать их родительский вид отслеживающим движение (используйте hitTest
метод, чтобы выяснить, какой вид касания в настоящее время закончен).
попробуйте это....
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
for(UITouch *touch in touches)
{
CGPoint touchPointFirstBtn = [touch locationInView:self.ChordView];
if(CGRectContainsPoint(_btnC.frame, touchPointFirstBtn))
{
if (!_btnC.isHighlighted)
{
if(!Boolean)
{
title = @"C";
[_tlbView reloadData];
NSLog(@"%@",@"touches C");
}
[_btnC setHighlighted:YES];
Boolean = YES;
}
}
else
{
[_btnC setHighlighted:NO];
Boolean = NO;
}
}