如何获取 UITableView 单元格中的 UIButton 的绝对 x,y

Posted

技术标签:

【中文标题】如何获取 UITableView 单元格中的 UIButton 的绝对 x,y【英文标题】:how to get absolute x,y of UIButton that's in UITableView cell 【发布时间】:2014-02-26 14:28:24 【问题描述】:

在 cellForRowAtIndexPath() 中,我在单元格中分配了一个 UIButton。 按下按钮时,会调用委托,需要在屏幕上与按钮相同的绝对位置分配 UIImageView,以便开始将 UIImageView 拖动到屏幕上的其他位置

但是,当我读取委托的“发送者”(UIButton)的 x,y 时,y 是单元格内 UIButton 的相对 y,而不是 iPad 屏幕上 UIButton 的 y。

如何从委托中获取在 UITableView 的单元格中分配的 UIButton 的绝对屏幕 x,y?

在 cellForRowAtIndexPath() 中创建 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
                    printf("%d  = invisible_drag_button.tag     aaaaaaaaaaaaaaaaa   \n", PWR_RX_status_index ); // !!!
                    printf("x=%d y=%d w=%d h=%d \n", x,y,w,h ); // !!!
                    [invisible_drag_button addTarget: self 
                                action:@selector( delegate_drag_start: )
                                forControlEvents: UIControlEventTouchDown ];
                    [cell.contentView addSubview: invisible_drag_button ];

响应按钮按下的代表.....................

-(void)delegate_drag_start: (id)sender

int drag_record_index; // 拖动设备的数据库记录索引

// Drag record index = database index of device:
    UIButton* invisible_drag_button = (UIButton*)sender;
    drag_record_index = invisible_drag_button.tag;      

printf("delegate_drag_start for drag_record_index %d.   \n", drag_record_index  );

// Lookup drag device's type from its record:
    int device_type = area_device_status[ device_area ][ drag_record_index ].device_type;

// Init UIImageView of drag device image:
    // Lookup its UIImage from its type, and allocate UIImageView of drag device image:
    self.device_drag_UIImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed: device_image_filename( device_type )]];

    self.device_drag_UIImageView.userInteractionEnabled = YES;
    // Get screen location of touched device icon image:
        CGRect drag_button_frame = [invisible_drag_button frame];
        //CGPoint drag_button_location = CGPointMake(invisible_drag_button.frame.origin.x, invisible_drag_button.frame.origin.y);

                    printf("x=%d y=%d w=%d h=%d \n",    (int)drag_button_frame.origin.x, 
                                                        (int)drag_button_frame.origin.y, 
                                                        (int)drag_button_frame.size.width, 
                                                        (int)drag_button_frame.size.height  ); // !!!

            // Start drag image at same location as touched device image:
            self.device_drag_UIImageView.frame = CGRectMake(    drag_button_frame.origin.x, 
                                                                drag_button_frame.origin.y, 
                                                                drag_button_frame.size.width * DRAG_IMAGE_BIGGER_FACTOR, 
                                                                drag_button_frame.size.height * DRAG_IMAGE_BIGGER_FACTOR );

    [self.view addSubview: self.device_drag_UIImageView];
    [self.view bringSubviewToFront: self.device_drag_UIImageView];

【问题讨论】:

【参考方案1】:

试试这个:

[view convertPoint:pointToConvert toView:nil]

它将接收者坐标系中的一个点转换为指定视图的坐标系。如果第二个参数为 nil,则转换为窗口坐标系。

【讨论】:

【参考方案2】:

解决办法:

    CGRect drag_button_CGRect = [invisible_drag_button.superview convertRect:invisible_drag_button.frame toView:self.view];

..这给了我正确的绝对 x,y: drag_button_CGRect.origin.x drag_button_CGRect.origin.y

【讨论】:

【参考方案3】:

对于 Swift 人来说。

    let buttonRect = sender.superview?.convertRect(sender.frame, toView: self.tableView);

【讨论】:

【参考方案4】:

你需要的代码行是:

self.device_drag_UIImageView.center = [self.view convertPoint: invisible_drag_button.center fromView: invisible_drag_button.superview];

【讨论】:

以上是关于如何获取 UITableView 单元格中的 UIButton 的绝对 x,y的主要内容,如果未能解决你的问题,请参考以下文章

如何使用文本字段 UITableView 从自定义单元格中获取值?

如何从动态 UITableView 单元格中获取 UILabel 的大小?

每个 UICollectionView 单元格中的 UITableView

Swift:如何在动态 UITableView 的自定义单元格中获取滑块的值?

如何从表格视图中的选定单元格中获取文本?

如何计算 UITableView 单元格中的值的总和?