Определение того, что касание находится над изображением, с помощью touchesMoved: в пользовательской ячейке

#objective-c #ios #cocoa-touch #event-handling #uiimageview

#objective-c #iOS #cocoa-touch #обработка событий #uiimageview

Вопрос:

У меня есть пользовательская ячейка, в которой у меня есть представление изображения, flag . Используя этот метод, когда я навожу курсор на изображение, элемент управления не вводится if . Я использовал этот метод в других классах без проблем, но с пользовательской ячейкой он не работает.

 -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    [super touchesMoved:touches withEvent:event];   

    UITouch *touch = [[event allTouches] anyObject];

    if ([touch view] == flag) {
        NSLog(@"flag"); // Does not enter here
    }

        // But here
}
 

Ответ №1:

Вот кое-что, что может привести вас к ответу. Если вы хотите, чтобы касания были обнаружены, необходимо переопределить UITableView или вашу UITableViewCell. Переопределяя касания в вашей UITableViewCell, вы можете затем оценить, какой вид был затронут, как вы это делаете в данный момент. Следует отметить, что если вы нажмете на представление содержимого и переместитесь на изображение, вид, к которому вы прикасаетесь (и, следовательно, возвращаетесь с помощью набора касаний), по-прежнему будет видом содержимого.Если вы нажмете на UIImageView, вы получите это представление, которое будет возвращено, и ваш NSLog будет записан.

В качестве дополнительной точки вы должны установить,

 [self.flag setUserInteractionEnabled:YES];
 

или вы можете установить флажок взаимодействия в инспекторе атрибутов. Чтобы убедиться, что события касания запускаются. Я не уверен, что это точно отвечает на ваш вопрос, но я надеюсь, что это поможет.

Вот проблема, с которой я столкнулся, и решение, надеюсь, это поможет. Моя проблема заключалась в том, что у меня был UIView, в котором был UITableView и несколько других меньших UIViews. Я хотел иметь возможность перетаскивать меньшие виды и помещать их в ячейки таблицы, устанавливая изображение UITableViewCell в соответствии с CALayer затронутого меньшего вида. Вот код касания, который я использовал.

 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *t =[touches anyObject];

    UIGraphicsBeginImageContext(t.view.bounds.size);
    [t.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    self.draggedView = [[UIImageView alloc] initWithImage:img];

    CGPoint centre = [[touches anyObject] locationInView:self.view];
    [self.draggedView setCenter:centre];
    [self.draggedView setAlpha:0.5];
    [self.view addSubview:self.draggedView];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    CGPoint centre = [[touches anyObject] locationInView:self.view];
    [self.draggedView setCenter:centre];

}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{

    CGPoint centre = [[touches anyObject] locationInView:self.view];
    UIView *hit = [self.tableView hitTest:centre withEvent:event];

    UIGraphicsBeginImageContext(self.draggedView.bounds.size);
    [self.draggedView.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage * img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    if(hit!=nil){
        UITableViewCell *tvc = (UITableViewCell *)hit.superview;
        [tvc.imageView setImage:img];

        UITableView *tv = (UITableView *)tvc.superview;
        NSIndexPath *ip = [tv indexPathForCell:tvc];
        [tv deselectRowAtIndexPath:ip animated:YES];
    }

    [self.draggedView removeFromSuperview];
    self.draggedView = nil;
}
 

Тест попадания в touchesEnded возвращает UITableViewCellContentView, поэтому, чтобы получить ячейку, я просто запрашиваю ее супер-представление.

Комментарии:

1. Вау! Большое спасибо! Было очень полезно.