如何获取 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