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

时间:2011-11-01 20:06:55

标签: objective-c ios cocoa-touch event-handling 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 个答案:

答案 0 :(得分: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,以便获取Cell我只是要求它的超级视图。