使用 touchesMoved: 在自定义单元格中确定触摸是不是在图像上

Posted

技术标签:

【中文标题】使用 touchesMoved: 在自定义单元格中确定触摸是不是在图像上【英文标题】:Determining that touch is over an image using touchesMoved: in custom cell使用 touchesMoved: 在自定义单元格中确定触摸是否在图像上 【发布时间】:2011-11-01 20:06:55 【问题描述】:

我有一个自定义单元格,其中有一个图像视图 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 和其他几个较小的 UIView。我希望能够将较小的视图拖放到表格中的单元格上,设置 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 以便获取 Cell 我只要求它的超级视图。

【讨论】:

哇!非常感谢!很有帮助。

以上是关于使用 touchesMoved: 在自定义单元格中确定触摸是不是在图像上的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UITableView 的单元格中为 UIImageView 获取 touchesMoved?

UIButton 在自定义单元格中更改

在自定义单元格中聚焦 UITextfield

如何在自定义单元格中同步选择文本视图的事件?

在自定义 collectionview 单元格中填充图像而不会闪烁

如何通过 AutoLayouts 在自定义单元格中正确显示 2 个 UITextFields?