Nano Hash - криптовалюты, майнинг, программирование

Mapkit mapview не отображается с первой попытки

У меня есть вкладка на RootViewController.m. На вкладке есть 2 кнопки. Первая кнопка после нажатия перейдет к CorpViewcontroller, на котором есть mapView. Когда я нажимаю первую кнопку с первой попытки, карта пуста с меткой Google внизу. Я должен щелкнуть назад, затем снова нажать кнопку, после чего появится карта. Можно ли всегда показывать карту при первом нажатии кнопки?

Мой rootViewController.m для перехода на второй экран:

  [self.navigationController pushViewController:self.corpController animated:YES];

Второй экран с именем corpViewController имеет следующий код:

  - (void)viewDidLoad
  {
    [super viewDidLoad];

    self.title = @"Set Remote Location";
    self.jsonData = [[NSMutableData alloc] init];

    mapView.showsUserLocation = YES;

    //Setup the double tap gesture for getting the remote location..
    UITapGestureRecognizer *tgr = [[UITapGestureRecognizer alloc] 
                               initWithTarget:self action:@selector(handleGesture:)];
    tgr.numberOfTapsRequired = 2;
    tgr.numberOfTouchesRequired = 1;
    [mapView addGestureRecognizer:tgr];

    mapView.delegate = self;

    NSLog(@"viewDidLoad  done");
    }


    - (void)viewWillAppear:(BOOL)animated    {

      NSLog(@"viewWillAppear");

      appDelegate = (NBSAppDelegate *)[[UIApplication sharedApplication] delegate];

      double curLat = [appDelegate.curLat doubleValue];

      MKUserLocation *userLocation = mapView.userLocation;

      double miles = 10.0;
      double scalingFactor = ABS( (cos(2 * M_PI * curLat / 360.0) ));

      MKCoordinateSpan span; 

      span.latitudeDelta = miles/69.0;
      span.longitudeDelta = miles/(scalingFactor * 69.0); 

      MKCoordinateRegion region2;
      region2.span = span;
      region2.center = userLocation.coordinate;

      [mapView setRegion:region2 animated:YES];

       NSLog(@"viewWillAppear done..");

       }

Пожалуйста, порекомендуйте.

Спасибо

10.05.2012

  • При первом нажатии карта вся синяя? Что произойдет, если вы закомментируете строку setRegion в viewWillAppear? 10.05.2012
  • Да карта вся синяя. Если я закомментировал setRegion, я вижу карту с первой попытки, но она не увеличивается в пределах 10 миль от текущего местоположения. Любое предложение? Чтобы setRegion работал с первой попытки. 10.05.2012

Ответы:


1

Вы инициализируете MapView в методе viewDidLoad в вашем контроллере представления?

Если да, попробуйте переместить его в метод viewDidAppear. Это сработало для меня.

07.05.2013

2

В viewDidLoad вы устанавливаете showsUserLocation на YES, а в viewWillAppear вы увеличиваете масштаб до координаты mapView.userLocation.

Свойство userLocation обычно не готово с действительной координатой сразу после установки showsUserLocation на YES.

В первый раз, когда вы показываете контроллер представления, он все еще недействителен, и вы увеличиваете масштаб до координаты 0,0.

К тому времени, когда вы показываете контроллер представления во второй раз, местоположение пользователя получено, и координата действительна.

Вместо увеличения местоположения пользователя в viewWillAppear сделайте это в методе делегата mapView:didUpdateUserLocation:, который вызывает представление карты, когда получает обновление местоположения пользователя.

Кроме того, вы также, вероятно, захотите переместить mapView.showsUserLocation = YES; в viewWillAppear, а в viewWillDisappear установить его на NO. Таким образом, представление карты будет приближаться к местоположению пользователя каждый раз, когда отображается контроллер представления, а не только в первый раз.


Не связанный с этим момент заключается в том, что для увеличения до определенного расстояния гораздо проще использовать функцию MKCoordinateRegionMakeWithDistance вместо того, чтобы пытаться самостоятельно конвертировать мили в градусы.


Вот пример изменений, предложенных в corpViewController:

- (void)viewWillAppear:(BOOL)animated
{
    //move this from viewDidLoad to here...
    mapView.showsUserLocation = YES;
}

-(void)viewWillDisappear:(BOOL)animated
{
    mapView.showsUserLocation = NO;
}

-(void)mapView:(MKMapView *)mv didUpdateUserLocation:(MKUserLocation *)userLocation
  //Changed the **internal** parameter name from mapView to mv
  //to avoid a compiler warning about it hiding instance var with same name.
  //It's better to use the passed parameter variable anyway.
{
    NSLog(@"didUpdateUserLocation");

    double miles = 10.0;

    //Instead of manually calculating span from miles to degrees, 
    //use MKCoordinateRegionMakeWithDistance function...
    //Just need to convert miles to meters.
    CLLocationDistance meters = miles * 1609.344;
    MKCoordinateRegion region2 = MKCoordinateRegionMakeWithDistance
                                   (userLocation.coordinate, meters, meters);

    [mv setRegion:region2 animated:YES];
}
10.05.2012
  • Я переместил mapView.showUserLocation = YES в viewWillAppear и установил NO в viewWillDisappear, но поведение такое же, как при первой попытке, все еще синий экран. Я вставил didUpdateUserLocation, но он никогда не звонил. Я попробую MKCoordinateRegionMakeWithDistance, чтобы посмотреть, поможет ли это - спасибо 11.05.2012
  • Убедитесь, что вы по-прежнему устанавливаете делегата в viewDidLoad. Покажите свой метод didUpdateUserLocation (добавьте код в вопрос). 11.05.2012
  • Да, у меня все еще есть делегат в ViewDidLoad и ничего в viewWillAppear. Переместите весь код в didUpdateUserLocation. С первой попытки я вижу карту США, но didUpdateUserLocation никогда не получает вызов, поэтому масштабирование не происходит. 12.05.2012
  • Пожалуйста, покажите свой метод didUpdateUserLocation. Обратите внимание, что определение местоположения может занять несколько секунд. У вас включена локация в симуляторе? Также реализуйте метод didFail и посмотрите, вызывается ли он. Но было бы полезно, если бы вы показали написанный метод didUpdate. 12.05.2012
  • - (void) mapView:didUpdateUserLocation { NSLog(@ In didUpdateUserLocation..); mapView.showsUserLocation = ДА; appDelegate = (NBSAppDelegate *)[[UIApplication sharedApplication] делегат]; двойной curLat = [appDelegate.curLat doubleValue]; MKUserLocation *userLocation = mapView.userLocation; 12.05.2012
  • двойные мили = 10,0; двойной коэффициент масштабирования = ABS((cos(2 * M_PI * curLat/360.0))); диапазон MKCoordinateSpan; span.latitudeDelta = мили/69,0; span.longitudeDelta = мили/(коэффициент масштабирования * 69,0); MKCoordinateRegion регион2; регион2.span = диапазон; region2.center = userLocation.coordinate; [mapView setRegion:region2 анимированный:YES]; } 12.05.2012
  • Что такое сигнатура метода didFail? Я пробовал mapView:didFail, но это неправильно. Спасибо 12.05.2012
  • Должно быть написано -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation (а не -(void)mapView:didUpdateUserLocation). Вам также не нужно устанавливать showUserLocation в этом методе. 12.05.2012
  • до сих пор не звонят. -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation { NSLog(@didUpdateUserLocation); appDelegate = (NBSAppDelegate *)[[UIApplication sharedApplication] делегат]; двойной curLat = [appDelegate.curLat doubleValue]; //MKUserLocation *userLocation = mapView.userLocation; двойные мили = 10,0; двойной коэффициент масштабирования = ABS((cos(2 * M_PI * curLat/360.0))); ... 14.05.2012
  • Я только что заметил, что в более раннем комментарии вы сказали, что теперь у вас ничего нет в поле зренияWillAppear. Как упоминалось в ответе, просто поместите mapView.showsUserLocation = YES; в viewWillAppear, а остальная часть кода, которая была в viewWillAppear, теперь должна быть в didUpdateUserLocation. Я продублировал вашу настройку и проблему, и изменения в ответе сработали для меня. Я опубликую пример того, как должен выглядеть код. 14.05.2012
  • Я просто вернул showUserLocation в viewWillAppear. Это все еще синий экран, и он все еще не вызывает didUpdateUserLocation. Пожалуйста, опубликуйте свой код. Очень ценю всю вашу помощь до сих пор! 15.05.2012
  • Ответ был обновлен кодом, который работает для меня. Я не уверен, в чем еще может быть проблема. Если вы можете разместить свой проект где-нибудь и дать ссылку, я посмотрю на него. 15.05.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..