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

Posted

技术标签:

【中文标题】如何在 UITableView 的单元格中为 UIImageView 获取 touchesMoved?【英文标题】:how to get touchesMoved for UIImageView within a cell of UITableView? 【发布时间】:2014-02-26 15:58:07 【问题描述】:

我需要在 UITableView 的单元格中为 UIImageView 获取 touchesBegan 和 touchesMoved。 但是,如果我在单元格中触摸 UIImageView,则 touchesBegan 和 touchesMoved 不会触发。 如果我触摸了 UITableView 之外的任何其他 UIImageView,则 touchesBegan 和 touchesMoved 工作。

这里是从 viewDidLayoutSubviews() 调用的 UITableView 的分配...... tableFrame = CGRectMake(y-42, x+10 + DEVICE_TABLE_BORDER_WIDTH, height, width);

        device_off_tableView = [[UITableView alloc]initWithFrame:tableFrame style:UITableViewStylePlain];
        device_off_tableView.rowHeight = device_off_row_height;
        device_off_tableView.sectionFooterHeight = 0;
        device_off_tableView.sectionHeaderHeight = 0;
        device_off_tableView.scrollEnabled = YES;
        device_off_tableView.bounces = YES;
        device_off_tableView.delegate = self;
        device_off_tableView.dataSource = self;
        device_off_tableView.allowsSelection = NO;
        device_off_tableView.tag = channel;
        device_off_tableView.transform  = CGAffineTransformMakeRotation(-M_PI/2);

        device_off_tableView.autoresizesSubviews = NO;

        // Add device_off_tableView to the view:
            device_off_tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth;
            off_record_index = expected_off_index = 0;
            [device_off_tableView  reloadData];         
            [[self view] addSubview:   device_off_tableView];

这里是单元格内 UIButton 的分配.......................

                    // Put invisible UIButton on top of device icon, to detect start of drag:                    !!!
                    UIButton* invisible_drag_button = [UIButton buttonWithType:UIButtonTypeCustom];
                    invisible_drag_button.frame = CGRectMake    (x,y, w,h);        // location and size of device off icon
                    invisible_drag_button.tag = cell_record_index;      // store user device's record index
                    [invisible_drag_button addTarget: self 
                                action:@selector( delegate_drag_start: )
                                forControlEvents: UIControlEventTouchDown ];
                    [cell.contentView addSubview: invisible_drag_button ];

这里是触摸代理:..................................

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event

    printf("touchesBegan    \n");



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

    // Get touch event's details:
    UITouch *touch = [[event allTouches] anyObject];

    // Touching image to be dragged?
    if([touch view] == self.device_drag_UIImageView)
    
        printf("touchesMoved    device_drag_UIImageView \n");
        CGPoint location = [touch locationInView: self.view];
        self.device_drag_UIImageView.center=location;
    
    else
    
        printf("touchesMoved    WRONG IMAGE \n");
    

【问题讨论】:

我相信你必须通过触摸事件。 为什么不直接使用附加到图像视图的手势识别器? 手势识别器是否适用于从单元格的 UIImageView 拖动到其 UITableView 之外的外部?并且在拖动时,我需要动态显示拖动的 uiImageView 超出 UITableView。 【参考方案1】:

假设您在单元格类中有touchesMoved:withEvent:,这应该可以工作。

在您的 UITableViewController 上尝试以下操作

self.tableView.canCancelContentTouches = NO;
self.tableView.delaysContentTouches = NO;

【讨论】:

那行不通。它禁用了表格滚动。【参考方案2】:

图像视图将userInteractionEnabled 设置为NO。这意味着您不会获得触摸事件。将其设置为YES,它可能会解决您的问题。然而,更好的方法是使用UIPanGestureRecognizer。您仍然需要将userInteractionEnabled 设置为YES,但它更适用于tableview

【讨论】:

以上是关于如何在 UITableView 的单元格中为 UIImageView 获取 touchesMoved?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 UITableView 在动态高度单元格中滚动到底部?

如何从uitableview单元格中删除单元格

如何在 UITableview 单元格中正确显示 JSON 数据?

如何在 Xcode swift 的 UITableview 单元格中显示当前股票价格?

如何在 UITableview 单元格中添加左侧完全滑动和功能 - 目标 c

如何在 Collectionview 单元格中为 Uiimageview 设置圆角