2011-12-29 2 views
3

Я работаю с 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 эксперт может дать нам свою точку зрения по поводу этого вопроса ??

+0

Рекомендую вам ознакомиться с [FAQ] (http://stackoverflow.com/faq). –

ответ

1

Вы должны либо попытаться Трассировка как прикреплено:

if ([self pointInside:point withEvent:event]) { 
    // do something 
} 

Я хотел бы предложить вам добавить тест хит на надтаблицы, и выполните следующие действия в тесте хит родителя из markerView s

if ([markerView pointInside:point withEvent:event]) { 
    // extract the tag and show the relevant info 
} 

Надеюсь, это поможет

+0

Я пытаюсь это сделать, но координаты MarkerView не соответствуют координатам сурков. – Rotten

+0

попробуйте поместить маркер в положение (0,0) и посмотреть, работает ли он. Если я правильно помню, hittest работает в соответствии с верхней левой точкой. Если это сработает для вас, вам придется протестировать для pointInside после настройки CGRect маркераView – orrko

Смежные вопросы