iOS - Обнаружение касаний в UIView? - PullRequest
9 голосов
/ 02 апреля 2012

Итак, у меня есть подкласс 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 ]

20 голосов
/ 02 апреля 2012

Следующее решение сработало.У меня есть несколько экземпляров MyCustomView;по мере движения касаний я хочу обнаруживать виды, к которым прикасаются

В итоге я переместил обнаружение касаний из MyCustomView в его superView, поэтому следующий код больше не находится в классе 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))
        {

        }
    }
}
1 голос
/ 02 апреля 2012

это должно это исправить:

- (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
        }
    }
}
0 голосов
/ 31 марта 2017

Попробуйте это ....

-(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;
        }
}
0 голосов
/ 02 апреля 2012

Один из способов сделать это (хотя могут быть и другие) - отключить взаимодействие с пользователем для подвидов и заставить их родительский вид отслеживать движение (используйте метод hitTest, чтобы выяснить, какой вид касания в данный момент закончился).

...