- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在使用适用于 iOS 的 Mixare AR SDK,我需要解决一些发生的错误,其中之一是在点击 POI 的 View 时显示 POI 的信息。
前奏:
Mixare 在 MarkerView View 中放置了一个叠加的 UIView,MarkerView View 在屏幕上移动以定位 POI,每个 View 都有两个 subview ,一个 UIImageView 和一个 UILabel。
问题:
比如现在屏幕上有3个可见的POI,那么就有3个MarkerView作为overlay subview。如果您触摸叠加层中的任何位置,将显示与可见的随机 POI 关联的信息 View 。
期望:
我希望仅当用户点击 MarkerView 时才显示关联的 POI 信息
开始工作吧。我看到 MarkerView 继承自 UIView 并实现了 hitTest:withEvent
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
viewTouched = (MarkerView*)[super hitTest:point withEvent:event];
return self;
}
我已经放置了一个断点并且为每个可见的 MarkerView 调用了一次 hitTest 但 loadedView 始终为 null 所以我无法使用它,所以我尝试检查命中点是否在实现 pointInside 的 MarkerView 框架内:withEvent: 通过这种方式
- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
NSLog(@"ClassName: %@", [[self class] description]);
NSLog(@"Point Inside: %f, %f", point.x, point.y);
NSLog(@"Frame x: %f y: %f widht:%f height:%f", self.frame.origin.x, self.frame.origin.y, self.frame.size.width, self.frame.size.height);
if (CGRectContainsPoint(self.frame, point))
return YES;
else
return NO;
return YES;
}
但是这个函数总是返回 NO,即使我触摸了 MarkerView。当我检查日志时,我看到 X 和 Y 点值有时具有负值,并且 View 的宽度和高度非常小,0.00022 或类似值,而不是我在初始化时设置 MarkerView 框架的 100 x 150。
这是我的日志的摘录,您可以在其中看到类名、点和 MarkerView 帧值。
ClassName: MarkerView
2011-12-29 13:20:32.679 paisromanico[2996:707] Point Inside: 105.224899, 49.049023
2011-12-29 13:20:32.683 paisromanico[2996:707] Frame x: 187.568573 y: 245.735138 widht:0.021862 height:0.016427
我对这个问题很迷茫,所以欢迎任何帮助。在此先感谢您提供的任何帮助,我对这 block 砖感到抱歉:(
编辑:
最后我发现问题不在 hitTest:withEvent: 或 pointInside:withEvent 中,问题出在适用于 MarkerView 的 CGTransform,用于根据距离和旋转 View 进行缩放,如果我评论任何与这一点,Mixare AR SDK 工作正常,我的意思是,如果您触摸标记,信息 View 会正确显示,如果触摸屏幕中的任何其他位置,则不会执行任何操作。
所以,到目前为止,我还没有解决问题,但我应用了一个补丁,删除了 AugmentedViewController.m 类中的 CGTransform 相关代码 - (void)updateLocations:(NSTimer *)timer 函数
- (void)updateLocations:(NSTimer *)timer {
//update locations!
if (!ar_coordinateViews || ar_coordinateViews.count == 0) {
return;
}
int index = 0;
NSMutableArray * radarPointValues= [[NSMutableArray alloc]initWithCapacity:[ar_coordinates count]];
for (PoiItem *item in ar_coordinates) {
MarkerView *viewToDraw = [ar_coordinateViews objectAtIndex:index];
viewToDraw.tag = index;
if ([self viewportContainsCoordinate:item]) {
CGPoint loc = [self pointInView:ar_overlayView forCoordinate:item];
CGFloat scaleFactor = 1.5;
if (self.scaleViewsBasedOnDistance) {
scaleFactor = 1.0 - self.minimumScaleFactor * (item.radialDistance / self.maximumScaleDistance);
}
float width = viewToDraw.bounds.size.width ;//* scaleFactor;
float height = viewToDraw.bounds.size.height; // * scaleFactor;
viewToDraw.frame = CGRectMake(loc.x - width / 2.0, loc.y-height / 2.0, width, height);
/*
CATransform3D transform = CATransform3DIdentity;
//set the scale if it needs it.
if (self.scaleViewsBasedOnDistance) {
//scale the perspective transform if we have one.
transform = CATransform3DScale(transform, scaleFactor, scaleFactor, scaleFactor);
}
if (self.rotateViewsBasedOnPerspective) {
transform.m34 = 1.0 / 300.0;
double itemAzimuth = item.azimuth;
double centerAzimuth = self.centerCoordinate.azimuth;
if (itemAzimuth - centerAzimuth > M_PI) centerAzimuth += 2*M_PI;
if (itemAzimuth - centerAzimuth < -M_PI) itemAzimuth += 2*M_PI;
double angleDifference = itemAzimuth - centerAzimuth;
transform = CATransform3DRotate(transform, self.maximumRotationAngle * angleDifference / (VIEWPORT_HEIGHT_RADIANS / 2.0) , 0, 1, 0);
}
viewToDraw.layer.transform = transform;
*/
//if we don't have a superview, set it up.
if (!(viewToDraw.superview)) {
[ar_overlayView addSubview:viewToDraw];
[ar_overlayView sendSubviewToBack:viewToDraw];
}
} else {
[viewToDraw removeFromSuperview];
viewToDraw.transform = CGAffineTransformIdentity;
}
[radarPointValues addObject:item];
index++;
}
float radius = [[[NSUserDefaults standardUserDefaults] objectForKey:@"radius"] floatValue];
if(radius <= 0 || radius > 100){
radius = 5.0;
}
radarView.pois = radarPointValues;
radarView.radius = radius;
[radarView setNeedsDisplay];
[radarPointValues release];
}
任何 CoreGrapics 或 UI 专家都可以就此问题向我们提出他的观点吗??
最佳答案
您应该按照附件尝试 hittest:
if ([self pointInside:point withEvent:event]) {
// do something
}
我建议你在 superview 上添加 HitTest ,并在 markerView
s 的父级的 HitTest 中执行以下操作
if ([markerView pointInside:point withEvent:event]) {
// extract the tag and show the relevant info
}
希望对你有帮助
关于objective-c - UIView HitTest :withEvent: and pointInside:withEvent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8667855/
我有一个包含任意数量锯齿状元素的 WrapPanel。我想为我的项目实现拖动选择。 如何对一个点进行 HitTest 似乎很明显,但我如何才能找到矩形区域内的所有项目? 最佳答案 您可以使用 Visu
我有以下用户控件:一个点及其名称: 这很酷。 现在,我有一个面板,我需要恢复我用鼠标击中的停止点: public partial class
我有一个 UIView,其中包含许多 CALayer 子类。我使用以下代码来检测触摸事件对应于哪一层: - (void)touchesBegan:(NSSet *)touches withEvent:
我有一个透明的 NSView,它画了一个圆圈。我想自定义显示上下文菜单时使用的 HitTest 。 目前它使用边界矩形。我想更改它以测试圆圈内的点击。 最佳答案 尝试覆盖 NSView menuFor
我有一个包含驻留在 Viewport3D 中的 3D 对象的应用程序,我希望用户能够通过在屏幕上拖动一个矩形来选择它们。 我尝试在 Viewport3D 上应用 GeometryHitTestPara
在 RenderTransform 属性中具有较大缩放因子的 Path 元素上,输入命中测试会产生不正确的结果。 以下 XAML 定义了一个带有实心圆和Hand 光标的 Path。
我试图扩展 java ScrollDemo2 来报告 Canvas 上的形状是否被单击。我从一个简单的矩形开始,相信简单地循环 Canvas 中的矩形检查点击点是否包含在其中应该没有问题。但随后发生了
有没有办法在wpf中 HitTest 字符的像素?我希望能够命中字符“i”的点,但是当我单击点和“i”行之间的空格时不会命中。我尝试使用 DrawingContext.DrawText 方法来完成此操
我是 silverlight 的新手,正在尝试阅读使用 HitTest 方法了解鼠标何时位于控件上的 silverlight 教程。但不幸的是,我看不到任何具有此名称的方法。 HitTest 方法在哪
我正在使用 Graphics.DrawString 写出一个字符串,并且需要在给定鼠标位置的字符串中获取字符索引。 这看起来应该很简单,但我真的很难找到一种可行的方法。 我发现 e.Graphics.
我正在使用这种方法来检测是否有人点击了叠加层。现在一切正常,除了点击区域太小。所以我查看了 api,它说“查看给定的命中点是否在项目标记的范围内。”。 我像这样把边界变大了: Log.d("debug
我有一个位图图像,我正在尝试对其进行 HitTest 。如果它只是一个普通位图,则 HitTest 有效。但是我需要旋转和缩放位图,但我似乎无法正确计算出 HitTest 。 这里的x和y是光标x和y
这有点难以解释,所以我举个例子。 mysql表书籍 书籍 firstname |lastname |state |favbook john |doe | WA |bookna
UIViews是否针对UIGestureRecognizers 进行了 HitTest in the same way因为它们用于触摸事件?特别是,是否使用了相同的 hitTest:withEvent
我试图显示过去两天最流行的项目,但这个 View 让两天前发生的项目出现了。 它是为了找到最近两天最流行的(可能是 20-30 个项目)并用随机项目填充剩余的( View 上始终需要 1000 个项目
继上一个问题之后,我试图找出下一个问题是否可行: 假设您有一个渲染图,例如具有透明背景的足球运动员。您将此呈现器添加到您的 html 和 css 中。透明部分现在是图像“盒子”的一部分;你不能点击图片
我自定义了一个列表框来显示饼图(每个列表项都是饼图的一部分)。为此,我使用了一个 Itemtemplate,它(目前)仅包含一个 Shape。为了使这些形状形成一个完整的圆,我计算了每 block 的
我的程序中有一个简单的矩形,我必须对其进行 HitTest 。我正在使用 openFrameworks,但我认为这里的问题也与 OpenGL 主题有关。 public class Shape : pu
在处理草图中实现选择算法时,我循环遍历场景中的每个对象,并检查它是否在鼠标点击位置的几个像素范围内。有很多对象,而且它们非常小。 正如您可以想象的那样,一旦场景中充满了物体,这就会变得非常麻烦。有没有
我想设计一个 PvP 游戏,在客户端和 java 套接字服务器中使用 flash,但我确实需要服务器验证弹道以及子弹是否从作弊中击中目标。 是否有任何教程或论文提供了如何做到这一点? 最佳答案 要做到
我是一名优秀的程序员,十分优秀!