Я работаю с Mixare AR SDK для iOS, и мне нужно решить некоторые ошибки, которые происходят, один из них показывает информацию о POI при прослушивании POI.UIView hitTest: withEvent: и pointInside: withEvent
Прелюдия:
Mixare имеет накладку UIView внутри взглядов MarkerView размещаются, виды MarkerView движутся вокруг экрана, чтобы Geolocate объектов инфраструктуры и каждый из них имеет два подвидов, в UIImageView и UILabel.
Издание:
Сейчас, к примеру, есть 3 видимые объекты POI на экране, таким образом, есть 3 MarkerView в качестве наложения подвидов. Если вы касаетесь где-либо в оверлее, отображается информационное представление, связанное с случайным POI, которое видно.
Желаемые:
Я хочу, что информация ассоциированной POI в показан только тогда, когда пользователь постучал MarkerView
Давайте работать. Я вижу, что MarkerView наследуется от UIView и реализует Трассировка: withEvent
- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event {
viewTouched = (MarkerView*)[super hitTest:point withEvent:event];
return self;
}
Я поставил точку останова и Трассировка вызывается один раз для каждого видимого MarkerView но loadedView всегда равна нулю, так что я не могу работать с ним, поэтому я попытался проверить, если точка попадания находится внутри рамы MarkerView реализующего pointInside: 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 иногда имеют отрицательные значения, а ширина и высота представления очень малы, 0,00022 или аналогичные вместо 100 x 150, что я установил рамку MarkerView при ее инициализации.
Здесь вы выписали мой журнал, в котором вы можете увидеть значения классов, точки и значения 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
Я очень потерял эту проблему, поэтому любая помощь будет приветствоваться. Заранее спасибо за любую помощь при условии, и я сожалею об этом кирпиче :(
Edit:
В конце концов я обнаружил, что проблема не в Трассировка: withEvent: или pointInside: withEvent, проблема заключается с CGTransform, который применяется к MarkerView для масштабирования на основе distande и поворота представления, если я прокомментирую какой-либо код, связанный с этим, Mixare AR SDK отлично работает, я имею в виду, что представление информации отображается правильно, если вы касаетесь маркера и не сделайте что угодно, если какое-либо другое место на экране коснется.
Итак, к моменту, я не решил проблему, но я применил исправление, удаляющее связанный с CGTransform код в AugmentedViewController.m class - (void) upda teLocations: (NSTimer *) Функция таймера
- (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 эксперт может дать нам свою точку зрения по поводу этого вопроса ??
Рекомендую вам ознакомиться с [FAQ] (http://stackoverflow.com/faq). –