3

我有一个UIImage显示在UIImageView. 我还有另一张图片位于UIImageView第一张图片上方。我希望能够仅在第一张图像的边界内拖动第二张图像。为了使我的目标更清晰,请看这张图片:

绿色的大头针应该是可拖动的,但不能将大头针拖到蓝色的地方(地图外)。目前引脚是可拖动的,但我不知道如何检查引脚是否在地图之外。

编辑:我在我的 UIImageView 子类中使用此方法作为可拖动引脚:

- (UIColor *)colorAtPosition:(CGPoint)position {

CGRect sourceRect = CGRectMake(position.x, position.y, 1.f, 1.f);
CGImageRef imageRef = CGImageCreateWithImageInRect([[MapViewController sharedMapViewController]getImage].CGImage, sourceRect);

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *buffer = malloc(4);
CGBitmapInfo bitmapInfo = kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big;
CGContextRef context = CGBitmapContextCreate(buffer, 1, 1, 8, 4, colorSpace, bitmapInfo);
CGColorSpaceRelease(colorSpace);
CGContextDrawImage(context, CGRectMake(0.f, 0.f, 1.f, 1.f), imageRef);
CGImageRelease(imageRef);
CGContextRelease(context);

CGFloat r = buffer[0] / 255.f;
CGFloat g = buffer[1] / 255.f;
CGFloat b = buffer[2] / 255.f;
CGFloat a = buffer[3] / 255.f;

free(buffer);

return [UIColor colorWithRed:r green:g blue:b alpha:a];
}

MapViewController 是地图的 UIIImageView 所在的 Viewcontroller。所以我让这个类成为一个单例来获取地图图像。但是我再次得到的颜色值是完全有线的。我也更新了照片,因为我的用户界面略有不同。

4

5 回答 5

5

只需检查拖动所在的点并使用方法确定该点的颜色。

根据您的设置,您可以执行此操作,例如在touchesMoved:.

于 2013-01-07T16:16:47.840 回答
4

您是否尝试过在自定义 UIViewController 中实现 UIResponder 的触摸方法,然后按如下方式引用 2 个 UIView?

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* t = [touches anyObject];
    if (t.tapCount == 1 &&  [yourPinView pointInside:pt withEvent:nil])
    {
        CGPoint pt = [t locationInView:yourMapView];
        if ([self getColorOfPt:pt] != <blue>)
        {
            state = MOVING;
        }
    }
}

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    if (MOVING == state)
    {
        UITouch* t = [touches anyObject];

        // Move the pin only if the current point color is not blue.
        if ([self getColorOfPt:pt] != <blue>)
        {
            CGRect r = yourPinView.frame;
            r.origin.x = <new point based on diff>
            r.origin.y = <new point based on diff>
            yourPinView.frame = r;
        }
    }
}

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch* t = [touches anyObject];
    if (t.tapCount == 1 && MOVING == state)
    {
        state == NOT_MOVING;
    }
}
于 2013-01-15T09:47:39.340 回答
3

您可以尝试一种在以下位置选择颜色的方法CGPointUIImageiPhone Objective C: How to get a pixel's color of touch point on an UIImageView? 并检测它是否是“蓝色”。
如果它是蓝色,不要(重新)定位销

于 2013-01-07T16:15:40.170 回答
1

您可以使用此问题的答案来获取像素颜色。

获取 UIImage 的像素颜色

如何获取iphone上图像上像素的RGB值

我还发现了一个漂亮的教程:我的像素是什么颜色?iPhone上基于图像的颜色选择器

然后检测它是否是Blue Color。如果它是蓝色,那么正如@basvk所说,不要(重新)定位销。希望你能从中有所收获。

于 2013-01-10T13:09:58.093 回答
1

我只是给你一个想法..

我希望地图是 SVG 文件,或者如果它的 jpeg 可以使用 Adob​​e Illustrator 轻松转换为 SVG。或者还有许多其他选择可以做到这一点。

在这里您可以找到如何将 svg 转换为路径..

在这里您可以找到如何将 EPS(插画家路径)转换为 CGPath

然后您可以检查触摸点是否位于路径内

if([CGPathContainsPoint:myPoint]){

}
else{


}
于 2013-01-10T18:38:01.900 回答