最近有一个遥控器的项目, 需要实现点击图片上指定位置响应不同事件
图片如下:
大概目的是点击图片上的温度可以直接改变空调温度
大概思路就是先通过gesture获取点击的点坐标, 然后对坐标做处理.
开始考虑以纵轴为0度, 计算点击坐标跟中心点连线并计算跟纵轴的角度来判断, 不过代码写好后发现在不同的设备上有误差
所以就改用将图片分成一个个的格子, 然后判断触摸点在哪一个格子上面
下面来说说做法:
首先把图片放到一个表格中, 调增好表格的缩放大小刚好图片边缘压在单元格线上
如图:
从这里可看到, 将图片分割成 高度: 43个单位 宽度: 9个单位
然后做个记录每个点在哪些单元格上面:
我的记录如下:
然后我们可以写代码, 给ImageView添加一个手势
self.bgImg.userInteractionEnabled = YES; [self.bgImg addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tempTapAction:)]];
从gesture获取转换后的坐标并做判断:
- (void)tempTapAction:(UIGestureRecognizer *)tapGesture { float xunit = self.bgImg.frame.size.width / 9; float yunit = self.bgImg.frame.size.height / 43; CGPoint point; point = [tapGesture locationInView:self.bgImg]; // NSLog(@"点击: %@", NSStringFromCGPoint(point)); if (point.x < xunit * 2 && (point.y > yunit * 27 && point.y < yunit * 31)) { NSLog(@"16度"); _temper = 16; } else if (point.x < xunit * 2 && (point.y > yunit * 22 && point.y < yunit * 26)) { NSLog(@"17度"); _temper = 17; } else if (point.x < xunit * 2 && (point.y > yunit * 17 && point.y < yunit * 21)) { NSLog(@"18度"); _temper = 18; } else if (point.x < xunit * 2 && (point.y > yunit * 12 && point.y < yunit * 16)) { NSLog(@"19度"); _temper = 19; } else if ((point.x < xunit * 3 && point.x > xunit * 1) && (point.y > yunit * 8 && point.y < yunit * 12)) { NSLog(@"20度"); _temper = 20; } else if ((point.x < xunit * 3 && point.x > xunit * 2) && (point.y > yunit * 5 && point.y < yunit * 9)) { NSLog(@"21度"); _temper = 21; } else if ((point.x < xunit * 4 && point.x > xunit * 3) && (point.y > yunit * 3 && point.y < yunit * 7)) { NSLog(@"22度"); _temper = 22; } else if ((point.x < xunit * 5 && point.x > xunit * 4) && (point.y > yunit * 2 && point.y < yunit * 6)) { NSLog(@"23度"); _temper = 23; } else if ((point.x < xunit * 6 && point.x > xunit * 5) && (point.y > yunit * 3 && point.y < yunit * 7)) { NSLog(@"24度"); _temper = 24; } else if ((point.x < xunit * 7 && point.x > xunit * 6) && (point.y > yunit * 5 && point.y < yunit * 9)) { NSLog(@"25度"); _temper = 25; } else if ((point.x < xunit * 8 && point.x > xunit * 6) && (point.y > yunit * 8 && point.y < yunit * 12)) { NSLog(@"26度"); _temper = 26; } else if ((point.x < xunit * 9 && point.x > xunit * 7) && (point.y > yunit * 12 && point.y < yunit * 16)) { NSLog(@"27度"); _temper = 27; } else if ((point.x < xunit * 9 && point.x > xunit * 7) && (point.y > yunit * 17 && point.y < yunit * 21)) { NSLog(@"28度"); _temper = 28; } else if ((point.x < xunit * 9 && point.x > xunit * 8) && (point.y > yunit * 22 && point.y < yunit * 26)) { NSLog(@"29度"); _temper = 29; } else if ((point.x < xunit * 9 && point.x > xunit * 7) && (point.y > yunit * 27 && point.y < yunit * 31)) { NSLog(@"30度"); _temper = 30; } // 调用修改温度方法 }
时间: 2024-10-22 13:07:06