#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. Вау! Большое спасибо! Было очень полезно.