В настоящее время у меня есть UIView
, который рисует данные радара поверх MKMapView
, используя OpenGL. Из-за уровня детализации радиолокационного изображения требуется OpenGL (CoreGraphics работает недостаточно быстро).
Все изображения, которые я рисую, сохраняются в MKMapPoints
. Я предпочитаю их стандартным CLLocationCoordinate2D
, потому что их длина не зависит от широты. Базовый метод рисования таков:
- Добавьте
GLView
как подвидMKMapView
и установитеGLView.frame = MKMapView.frame
. Используя
GLOrthof
, установите проекциюGLView
равной текущей видимойMKMapRect
карты. Вот код, который это делает.CLLocationCoordinate2D coordinateTopLeft = [mapView convertPoint:CGPointMake(0, 0) toCoordinateFromView:mapView]; MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft); CLLocationCoordinate2D coordinateBottomRight = [mapView convertPoint:CGPointMake(mapView.frame.size.width, mapView.frame.size.height) toCoordinateFromView:mapView]; MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight); glLoadIdentity(); glOrthof(pointTopLeft.x, pointBottomRight.x, pointBottomRight.y, pointTopLeft.y, -1, 1);
Установите правильный размер области просмотра, используя
glViewport(0, 0, backingWidth, backingHeight)
, гдеbackingWidth
иbackingHeight
- размерmapView
в точках.- Нарисуйте, используя
glDrawArrays
. Не уверен, что это имеет значение, ноGL_VERTEX_ARRAY
иGL_TEXTURE_COORD_ARRAY
включены во время розыгрыша.
При использовании этого метода все работает нормально. Рисунок выполнен так, как и положено. Единственная проблема заключается в том, что поскольку это подвид mapView
(а не наложение), изображение радара рисуется поверх любых других MKAnnotations
и MKOverlays
. Мне нужно, чтобы этот слой был нарисован под другими аннотациями и наложениями.
Что я пытался сделать, чтобы это заработало, так это сделать glView
подпредставлением пользовательского MKOverlayView
вместо mapView
. Что я сделал, так это присвоил MKOverlay
boundingMapRect
MKMapRectWorld
и установил рамку glView
так же, как я установил проекцию (поскольку кадр MKOverlayView
определяется MKMapPoints
, а не CGPoints
). Опять же, вот код.
CLLocationCoordinate2D coordinateTopLeft =
[mapView convertPoint:CGPointMake(0, 0)
toCoordinateFromView:mapView];
MKMapPoint pointTopLeft = MKMapPointForCoordinate(coordinateTopLeft);
CLLocationCoordinate2D coordinateBottomRight =
[mapView convertPoint:CGPointMake(mapView.frame.size.width,
mapView.frame.size.height)
toCoordinateFromView:mapView];
MKMapPoint pointBottomRight = MKMapPointForCoordinate(coordinateBottomRight);
glRadarView.frame = CGRectMake(pointTopLeft.x, pointTopLeft.y,
pointBottomRight.x - pointTopLeft.x,
pointBottomRight.y - pointTopLeft.y);
Когда я это делаю, glView
правильно располагается на экране (в том же месте, что и в то время, когда он был подвидом mapView
), но рисунок больше не работает правильно. Когда изображение появляется, оно не того размера и находится в неправильном месте. Я проверил, и backingWidth
и backingHeight
по-прежнему имеют размер обзора в пунктах (как и должно быть).
Есть идеи, почему это не работает?