我有一个与切割图像有关的问题,以了解用户点击了哪个部分。对于一些人来说,这是一个相当简单的练习,我想,但是我一直在讨论这个问题并找不到合适的方法。
我想要做的是点击此图像上的身体部位,让设备告诉我它是什么身体部位:
但我完全不知道如何编程。
我一直在考虑为每个身体部位设置一个大纲CGPoints数组,但是如何获得这些? Photoshop坐标?然后将触摸点计算到最近的CGPoint上?
有人给我的想法是在不同的区域切割图像,每个身体部位都有不同的图像。但问题是每个图像都是一个矩形,这使得很难知道究竟是什么触摸了。还需要一组点,特别是对于重叠图像。
另一个人告诉我,这只能使用SpriteKit。
让我知道,聪明的窥视:)
更新: 我想到了!我正在制作很多包含手,点,腿的点数......一个例子:
CGPoint p1 = CGPointMake(x + 432, y + 200);
CGPoint p2 = CGPointMake(x + 523, y + 188);
CGPoint p3 = CGPointMake(x + 530, y + 277);
CGPoint p4 = CGPointMake(x + 432, y + 277);
CGPoint p5 = CGPointMake(x + 523, y + 367);
CGPoint p6 = CGPointMake(x + 432, y + 354);
CGPoint p7 = CGPointMake(x + 325, y + 355);
CGPoint p8 = CGPointMake(x + 296, y + 362);
NSArray *handL = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint:p1],
[NSValue valueWithCGPoint:p2],
[NSValue valueWithCGPoint:p3],
[NSValue valueWithCGPoint:p4], nil];
[shapes addObject:@{@"name":NSLocalizedString(@"Left Hand", @""), @"points":handL}];
NSArray *handR = [NSArray arrayWithObjects:
[NSValue valueWithCGPoint:p5],
[NSValue valueWithCGPoint:p6],
[NSValue valueWithCGPoint:p7],
[NSValue valueWithCGPoint:p8], nil];
[shapes addObject:@{@"name":NSLocalizedString(@"Right Hand", @""), @"points": handR}];
之后我读了这些值并将它们分层:
NSArray *shapes = [[NumbersHelper sharedNumbersHelper] getScreenThreeShapes];
for (int outside = 0; outside < [shapes count]; outside++) {
CAShapeLayer *shape = [[CAShapeLayer alloc] init];
[self.scrollView.layer addSublayer:shape];
shape.opacity = 0.5;
shape.lineWidth = 2;
shape.lineJoin = kCALineJoinRound;
NSArray *points = [[[shapes valueForKey:@"points"] allObjects] objectAtIndex:outside];
UIBezierPath *path = [[UIBezierPath alloc] init];
for (int inside = 0; inside < points.count; inside++) {
if (inside == 0) {
[path moveToPoint:[[points objectAtIndex:inside] CGPointValue]];
} else {
[path addLineToPoint:[[points objectAtIndex:inside] CGPointValue]];
}
}
[path closePath];
shape.path = [path CGPath];
shape.name = [[[shapes valueForKey:@"name"] allObjects] objectAtIndex:outside];
}
当用户点击视图时,我这样做:
- (void)tappedOnView:(UITapGestureRecognizer *)sender
{
if ([sender locationInView:self.scrollView].x > 2048 && [sender locationInView:self.scrollView].x < 3072) {
screenTwoTouchedPoint = [sender locationInView:self.scrollView];
CGPoint touchPoint = [sender locationInView:self.scrollView];
NSString *name;
for (id sublayers in self.scrollView.layer.sublayers) {
if ([sublayers isKindOfClass:[CAShapeLayer class]]) {
CAShapeLayer *shape = sublayers;
if (CGPathContainsPoint(shape.path, 0, touchPoint, YES)) {
name = shape.name;
break;
}
}
}
[self tappedBody:sender onPart:name];
}
}
答案 0 :(得分:0)
对我有用的解决方案。为整个图像大小创建一个二维数组。如果图像是250x250,那么您的阵列将是相同的。
使用NSObjects填充此数组,并使用int
bodyInteger
然后将手指拖到图像的手上,并在touchesMoved
中从位置获取坐标,并使用坐标从其二维阵列中选择对象并将其bodyInteger设置为1 。
现在当有人把手指放在手上时,你从2d数组中获取相应的对象,看看它有什么bodyInteger。 如果你有内存限制,你可以创建一个结构而不是NSObject,只保存在正文中的点。
或者,您可以为每个身体部位创建边界并保存。当用户用手指触摸时,您可以查看该点是否在保存的多边形内。
答案 1 :(得分:0)
粗略但简单的方法是在各个身体部位上设置透明按钮。如果单个按钮没有正确覆盖身体部位,请添加多个较小的按钮。
您可以在按钮上添加标签,以识别哪个按钮/正文部分被轻击或将它们连接到唯一的动作。