gpt4 book ai didi

objective-c - UIView HitTest :withEvent: and pointInside:withEvent

转载 作者:搜寻专家 更新时间:2023-10-30 20:26:24 26 4
gpt4 key购买 nike

我正在使用适用于 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 ,并在 markerViews 的父级的 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com