仅将 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】:您可以尝试一种方法,在 CGPoint
的 UIImage
中选择颜色: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 可以使用 Adobe Illustrator 轻松转换为 SVG。或者还有很多其他的选择。
和here 你可以找到如何将 svg 转换为路径..
here你可以找到如何将EPS(插画家路径)转换为CGPath
然后您可以检查触摸点是否位于路径内
if([CGPathContainsPoint:myPoint])
else
【讨论】:
以上是关于仅将 UIImage 移动到另一个 UIImage 内的主要内容,如果未能解决你的问题,请参考以下文章
UIImage 没有从一个 ViewController 传递到另一个
使用推送视图控制器时如何将 Uiimage 从一个视图控制器传递到另一个视图控制器?