仅将 UIImage 移动到另一个 UIImage 内

Posted

技术标签:

【中文标题】仅将 UIImage 移动到另一个 UIImage 内【英文标题】:Move UIImage only inside of another UIImage 【发布时间】:2013-01-07 16:09:28 【问题描述】:

我有一个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。所以我让这个类成为一个单例来获取地图图像。但是我再次得到的颜色值是完全有线的。我还更新了照片,因为我的用户界面略有不同。

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

我忘了说的是深蓝色是 uiimageview 的背景,它不是透明 png 的 uiimage 的一部分。在尝试这种颜色选择方法之前这很重要吗? 不,只要是为“越界”区域保留的透明色,就可以检查。 没有其他方法吗?我没有得到可用的值,因为我的 pin-uiimageview 位于 uiview 上,而在此视图下是我的 map-uiimageview。也许我可以使用 cgrectcointainspoint 或 pointInside ?这种颜色方法不适合我。 这里是当前结构:self.view(UIView) -> mapView (UIImageView)->pinView (UIView)->dragablePinView (UIImageView)。因此,当我尝试获取 mapView 的像素颜色以移动 dragablePinView 时,它会因有线 rgb 值而失败。我认为这是因为 pinView 在它们之间。那么还有其他解决方案吗? 那么不要在mapView中添加pinView,而是在mapView上方添加,所以在self.view中。将子视图添加到 UIImageView 是不好的做法【参考方案2】:

您是否尝试过在自定义 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;
    

【讨论】:

【参考方案3】:

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

【讨论】:

在下面的答案中查看我的 cmets。您还有其他想法如何解决这个问题吗?【参考方案4】:

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

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 所说,不要(重新)定位引脚。 希望你能从中有所收获。

【讨论】:

现在我得到了结果,但不是正确的。我得到的颜色是完全有线的。有关详细信息,请参阅我编辑的答案。【参考方案5】:

我只是给你一个想法..

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

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

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

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

if([CGPathContainsPoint:myPoint])


else



【讨论】:

以上是关于仅将 UIImage 移动到另一个 UIImage 内的主要内容,如果未能解决你的问题,请参考以下文章

UIImage 没有从一个 ViewController 传递到另一个

如何将任意路径从一个 UIImage 复制到另一个

使用推送视图控制器时如何将 Uiimage 从一个视图控制器传递到另一个视图控制器?

在 UIImage 中按顺序移动方块

选择单元格时,TableVIew 中的 UIImage 会移动

UIImage 返回零