использование UIView в качестве подпредставления MKMapView для рисования маршрута

Прежде всего, прошу прощения за свой плохой английский.

Я пытаюсь нарисовать маршрут в UIView и установить это представление как MKMapView.

Теперь у меня есть класс UIView (ViewClass), в котором я помещаю все методы касаний и устанавливаю представление моего контроллера просмотра как экземпляр этого класса. MKMapView - это подвид viewcontroller.view. Я могу получить все необходимое в MKMapView. Чтобы нарисовать след, я установил UIView (trailView) как подпредставление MKMapView с чистым цветом фона. Я пытаюсь переместить trailView, когда MKMapView движется, но я не получаю хороших результатов. Движение не идеальное.

Идея состоит в том, чтобы представление было прикреплено к MKMapView. Я не знаю, возможно ли это, и мне действительно нужно использовать MKAnnotationView. Я пробовал раньше с MKAnnotationView, но это потребляет много памяти.

Я очень признателен за помощь. Заранее спасибо.


person ideafactory    schedule 14.01.2010    source источник


Ответы (3)


iOS4 имеет новую систему наложения, включая рендеринг путей. Я еще не использовал его, но похоже, что это было бы НАМНОГО проще, чем пытаться накрутить собственный оверлей.

См. http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKOverlayPathView_class/Reference/Reference.html#//apple_ref/doc/uid/TP40009713.

person Dan Ray    schedule 25.06.2010

Это очень хороший вопрос.

Как насчет того, чтобы получить пиксельные данные из интересующей вас области карты и на основе цвета пути произвести расчеты ближайшего соседа. в том направлении, которое вы ищете. Сохранить этот путь по мере продвижения и сделать другой цвет в вашем trailView?

Еще больше усложняет этот процесс масштабирование, потому что вам потребуется след, не зависящий от разрешения (преобразование координат карты), а не координаты в пикселях. Таким образом, вы конвертируете свои пиксельные координаты в координаты карты, а затем его нужно масштабировать для увеличения.

person David Sowsy    schedule 20.01.2010
comment
Я не понял, что вы имеете в виду, исходя из цвета пути, сделайте вычисления ближайшего соседа. Разве это не сложнее? У меня все еще есть тесто, если использование MKAnnotationView - не лучшая идея. MKAnnotationView потребляет много памяти? У меня есть версия моего приложения, в которой я использую это, но она вылетает из-за нехватки памяти после того, как я создаю несколько аннотаций. Спасибо за ответ :) - person ideafactory; 21.01.2010
comment
Возможно, я неправильно понял. Когда вы говорите, что движение не идеально, я думаю, вы имеете в виду, что след не выровнен. Вы имели в виду, что производительность неприемлема, хотя она и точна? Из документации Apple: Объекты аннотации не обеспечивают визуальное представление аннотации, но обычно координируют (вместе с делегатом представления карты) создание соответствующего объекта MKAnnotationView для обработки отображения. Поэтому, если вы используете много координат (тысячи) в небольшом пространстве, MKAnnotationView кажется неправильным. Вы можете показать нам код и журнал сбоев? - person David Sowsy; 21.01.2010

След выстроен, но когда я прокручиваю, я получаю плохой результат. Что касается версии моего приложения с MKAnnotatioView, я могу показать вам код, но я не могу показать вам журнал, потому что, к сожалению, я сейчас не с iphone ...

-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {  

self.startingPoint = newLocation;

CLLocation *lastLocation;

if([pointArray count] >= 2)
{
    lastLocation = [pointArray objectAtIndex:1];
    [pointArray removeAllObjects];
}       

mapView.showsUserLocation = NO;

double lat,lon;     
lat = newLocation.coordinate.latitude;
lon = newLocation.coordinate.longitude;         

if(distanceIndex == 0)
{
    [pointArray insertObject:newLocation atIndex:0];
}
else 
{               
    if(distanceIndex == 1)
    {
        [pointArray insertObject:newLocation atIndex:1];
    }
    else 
    {
        [pointArray insertObject:lastLocation atIndex:0];
        [pointArray insertObject:newLocation atIndex:1];
    }
}           

if(distanceIndex == 0)
{
    MarkPlace *mark = nil;  

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc]init];
    [dateFormatter setDateStyle:NSDateFormatterNoStyle];
    [dateFormatter setTimeStyle:NSDateFormatterShortStyle];     
    NSString *dateStr = [dateFormatter stringFromDate:[NSDate date]];
    [dateFormatter release];
    NSString *subtitle = [NSString stringWithFormat:@"Time Here: %@", dateStr];
    mark = [[[MarkPlace alloc] initWithCoordinate:[[pointArray objectAtIndex:0] coordinate] currentTime:subtitle annotationType:MarkPlaceTypeEnd title:@"Pin Title"] autorelease];
    [mapView addAnnotation:mark];




}

//create the route
MKCoordinateSpan span = mapView.region.span;
CLLocationCoordinate2D center = mapView.region.center;

IFRouteAnnotations *routeAnnotation = [[[IFRouteAnnotations alloc] initWithPoints:pointArray:0:span:center] autorelease];
[mapView addAnnotation:routeAnnotation];

[mapView setRegion:routeAnnotation.region animated:TRUE];

distanceIndex = distanceIndex + 1;
[routeAnnotation release];

}

    -(void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
//re-enable and re-position the route display
for (NSObject *key in [routeViews allKeys]) {
    IFRouteView *routeView = [routeViews objectForKey:key];
    [routeView regionChanged];
}

}

-(MKAnnotationView *)mapView:(MKMapView *)_mapView viewForAnnotation:(id <MKAnnotation>)annotation{

MKAnnotationView *annotationView = nil;
NSLog(@"viewForAnnotation");
if(distanceIndex == 0)
{       
    MKPinAnnotationView *pin=[[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Pin"] autorelease];
    pin.pinColor = MKPinAnnotationColorGreen;
    pin.animatesDrop = TRUE;
    pin.userInteractionEnabled = YES;

    annotationView = pin;
    [annotationView setEnabled:YES];
    [annotationView setCanShowCallout:YES];
}

if([annotation isKindOfClass:[IFRouteAnnotations class]])
{
    IFRouteAnnotations *routeAnnotation = (IFRouteAnnotations *)annotation;

    annotationView = [routeViews objectForKey:routeAnnotation.routeID];

    if(annotationView == nil)
    {
        IFRouteView *routeView = [[[IFRouteView alloc] initWithFrame:CGRectMake(0,0, mapView.frame.size.width, mapView.frame.size.height)]autorelease];

        routeView.annotation = routeAnnotation;
        routeView.mapView = mapView;

        [routeViews setObject:routeView forKey:routeAnnotation.routeID];

        annotationView = routeView;
    }
}   
return annotationView;

}

Не знаю, поймете ли вы что-нибудь. Мой код основан на тексте ссылки. Спасибо за вашу помощь!! :)

person ideafactory    schedule 21.01.2010