В момента имам 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
все още са размерът на изгледа в точки (както трябва да бъдат).
Някаква идея защо това не работи?