2014-02-18 2 views
0

Я пытаюсь удалить мой вид карты из родительского вида, а затем добавить его в какой-то момент:Удалить MAPview от родителей, а затем добавить позже

- (IBAction)setMapType:(UISegmentedControl *)sender { 
    switch (sender.selectedSegmentIndex) { 
     case 0: { 
      if ([self.mapView isDescendantOfView:self.view] == false) { 
       [self.view insertSubview:self.mapView atIndex:0]; 
      } 

      break; 
     } 

     case 1: 
      [self.mapView removeFromSuperview]; 
      break; 
    } 
} 

При нажатии на вторую кнопку в моем сегментированной управления mapview удаляется. Однако, когда я нажимаю на первую кнопку, похоже, что она не возвращается правильно. Я имею в виду, что он добавляется обратно к родительскому виду, но карта не появляется. Я попытался добавить его в верхнюю часть подзонов и нижнюю часть с тем же результатом.

Вы можете спросить, почему я хотел бы сделать это (как я прошу себя). Я пытаюсь дать своим пользователям возможность указывать на разные типы карт (кроме iOS). MKMapView укажет на карты iOS, которые являются удивительными, но я хочу также отобразить карту RMMapView (mapbox/routeme). Я не уверен, что лучше всего подходит для обмена и отображения карт. Должен ли я удалять старые виды карт при свопинге и создавать новостные? Или я должен держать вокруг старого вида карты, но просто удалить их из вида?

ответ

1

Что я имею в виду, так это то, что он возвращается к родительскому виду, но карта не отображается.

Это действительно странно и не должно происходить.

Что касается подхода, я бы порекомендовал держать сильную ссылку на оба вида карты при первом использовании каждого, а затем удалять неиспользованный каждый раз, освобождать/nil и освобождать память. Затем, в следующий раз, когда это необходимо, заново создайте его с тем же уровнем, центром и уровнем масштабирования. В случае MapKit, может быть проще думать с точки зрения region вместо масштабирования, однако

+0

Я думаю, что произошло то, что я добавил MapView как свойство через раскадровку. Имущество было установлено как слабое. Угадав, что, возможно, когда я удалил его из родительского представления, он был выпущен (хотя на 100% не уверен). Создание MapView частной переменной «fixed». – lostintranslation

+0

Возможно, я нашел ошибку. Если я удалю RMMapView из супервизора, а затем добавлю обратно в следующую ошибку, вызывается: Mapbox [29859: a0b] Иерархия представления не подготовлена ​​к ограничению: lostintranslation

1

Я думаю, вы можете добавить subView под другими существующими subViews? Чем ниже индекс, тем ниже z-порядок. Попробуйте использовать addSubView: вместо этого, который вставляет подвид выше любой другой подвид:

[self.view addSubview:self.mapView]; 

или:

[self.view insertSubview:self.mapView atIndex:[self.view.subviews count]]; 

или просто отправить его на фронт после добавления:

[self.view bringSubviewToFront:self.mapView]; 

Я бы лично сохраняйте mapViews вокруг и добавляйте/удаляйте их в супер просмотр по мере необходимости. Еще один возможный подход состоял бы в том, чтобы сохранить их в супер-представлении и переключать их свойство , скрытое свойство, когда изменяется индекс выбранного сегмента.

+0

Будете ли вы беспокоиться об использовании памяти, сохраняя оба вида карты? И.Е. мои пользователи могут добавлять маркеры на карту. Я мог бы потенциально иметь много маркеров на карте, которая не показана. – lostintranslation

+0

Для меня это действительно компромисс между производительностью и использованием памяти. Исходя из точки зрения обеспечения разумного пользовательского опыта, вы можете не захотеть перезагружать все маркеры каждый раз, когда вы переключаете сегмент (что может привести к заметному отставанию, особенно на нижних устройствах).Если вы не уверены, вы можете попытаться выполнить профилирование памяти с помощью XCode, чтобы убедиться, что потребление памяти остается в допустимых пределах. –

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