仅在另一个UIImage中移动UIImage

时间:2013-01-07 16:09:28

标签: iphone ios uiimageview uiimage uitouch

我有一个UIImage,显示在UIImageView中。我在UIImageView中还有另一张图像位于第一张图像上方。我希望能够仅在第一个图像的边框内拖动第二个图像。为了让我的目标更清晰一点,看看这张图片: http://img689.imageshack.us/img689/6136/56308823.png

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

编辑: 我在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是Viewcontroller,其中地图的UIIImageView是。所以我让这个类成为一个单例来获取地图图像。但同样,我得到的颜色值是完全有线的。我还更新了照片,因为我的ui有点不同。

5 个答案:

答案 0 :(得分:5)

只需检查拖动的位置,然后使用this方法确定该点的颜色

根据您的设置,您可以执行以下操作:在touchesMoved:

答案 1 :(得分:4)

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

- (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;
    }
}

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

Get Pixel color of UIImage

How to get the RGB values for a pixel on an image on the iphone

我还找到了一个漂亮的教程:What Color is My Pixel? Image based color picker on iPhone

然后检测它是否是蓝色。如果它是蓝色,那么 @basvk 表示只是不要(重新)定位引脚。 希望你从中获得一些东西。

答案 4 :(得分:1)

我只是给你一个想法..

我希望地图是一个SVG文件,或者如果它的jpeg可以使用Adobe Illustrator轻松转换为SVG。或者还有很多其他选择。

here你可以找到如何将svg转换为路径..

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

然后你可以检查触摸点是否在路径

if([CGPathContainsPoint:myPoint]){

}
else{


}