답변:
나는 매우 간단하고 트릭을 수행하는 해결책을 찾았습니다. 사용하여 MKCoordinateRegionMakeWithDistance
원하는 줌을 얻기 위해 수평 수직 미터의 거리를 설정하기 위해합니다. 그리고 물론 위치를 업데이트하면 올바른 좌표를 얻거나 CLLocationCoordinate2D
시작할 때 직접 지정할 수 있습니다 .
CLLocationCoordinate2D noLocation;
MKCoordinateRegion viewRegion = MKCoordinateRegionMakeWithDistance(noLocation, 500, 500);
MKCoordinateRegion adjustedRegion = [self.mapView regionThatFits:viewRegion];
[self.mapView setRegion:adjustedRegion animated:YES];
self.mapView.showsUserLocation = YES;
빠른:
let location = ...
let region = MKCoordinateRegion( center: location.coordinate, latitudinalMeters: CLLocationDistance(exactly: 5000)!, longitudinalMeters: CLLocationDistance(exactly: 5000)!)
mapView.setRegion(mapView.regionThatFits(region), animated: true)
MKCoordinateRegionMakeWithDistance
도 여전히 Swift에 있습니다. 이 솔루션이 작동합니다!
경도선이지도의 어느 지점에서든 균등하게 간격을두고 있다는 사실을 기반으로 centerCoordinate 및 zoomLevel을 설정하는 매우 간단한 구현이 있습니다.
@interface MKMapView (ZoomLevel)
@property (assign, nonatomic) NSUInteger zoomLevel;
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated;
@end
@implementation MKMapView (ZoomLevel)
- (void)setZoomLevel:(NSUInteger)zoomLevel {
[self setCenterCoordinate:self.centerCoordinate zoomLevel:zoomLevel animated:NO];
}
- (NSUInteger)zoomLevel {
return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1;
}
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated {
MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256);
[self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated];
}
@end
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated { MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256); [self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated]; }
double z = log2(360 * ((self.mapView.frame.size.width/256) / self.mapView.region.span.longitudeDelta));
내장되어 있지 않지만 이 코드를 보거나 사용 했습니다 . 이를 통해 다음을 사용할 수 있습니다.
[mapView setCenterCoordinate:myCoord zoomLevel:13 animated:YES];
참고 : 이것은 내 코드가 아니므로 작성하지 않았으므로 크레딧을받을 수 없습니다.
MKCoordinateRegion을 사용하고 스팬 위도 및 경도 델타를 설정하여 확대 할 수도 있습니다. 아래는 빠른 참조이고 여기는 iOS 참조입니다. 멋진 것은 아니지만지도를 그릴 때 확대 / 축소를 설정할 수 있습니다.
MKCoordinateRegion region;
region.center.latitude = {desired lat};
region.center.longitude = {desired lng};
region.span.latitudeDelta = 1;
region.span.longitudeDelta = 1;
mapView.region = region;
편집 1 :
MKCoordinateRegion region;
region.center.latitude = {desired lat};
region.center.longitude = {desired lng};
region.span.latitudeDelta = 1;
region.span.longitudeDelta = 1;
region = [mapView regionThatFits:region];
[mapView setRegion:region animated:TRUE];
신속한 구현
import Foundation
import MapKit
class MapViewWithZoom: MKMapView {
var zoomLevel: Int {
get {
return Int(log2(360 * (Double(self.frame.size.width/256) / self.region.span.longitudeDelta)) + 1);
}
set (newZoomLevel){
setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false)
}
}
private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Int, animated: Bool) {
let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, Double(zoomLevel)) * Double(self.frame.size.width) / 256)
setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)
}
}
IBOutlet
당신에게 map
, 당신이로 정의 MapViewWithZoom
하는 대신 간단한의 MKMapView
. 그런 다음, 당신은 단지와 줌 레벨을 설정할 수 있습니다 map.zoomLevel = 1
또는map.zoomLevel = 0.5
mapView.zoomLevel -= 2
들어 스위프트 3 꽤 빨리 감기입니다 :
private func setMapRegion(for location: CLLocationCoordinate2D, animated: Bool)
{
let viewRegion = MKCoordinateRegionMakeWithDistance(location, <#T##latitudinalMeters: CLLocationDistance##CLLocationDistance#>, <#T##longitudinalMeters: CLLocationDistance##CLLocationDistance#>)
MapView.setRegion(viewRegion, animated: animated)
}
<CLLocationDistance>
lat- , long-Meters를 정의하기 만하면 mapView가 확대 / 축소 수준을 값에 맞 춥니 다.
@AdilSoomro의 훌륭한 답변을 기반으로 합니다. 나는 이것을 생각 해냈다 :
@interface MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel
animated:(BOOL)animated;
-(double) getZoomLevel;
@end
@implementation MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
zoomLevel:(NSUInteger)zoomLevel animated:(BOOL)animated {
MKCoordinateSpan span = MKCoordinateSpanMake(0, 360/pow(2, zoomLevel)*self.frame.size.width/256);
[self setRegion:MKCoordinateRegionMake(centerCoordinate, span) animated:animated];
}
-(double) getZoomLevel {
return log2(360 * ((self.frame.size.width/256) / self.region.span.longitudeDelta));
}
@end
다음 코드 조각이 도움이 되었기를 바랍니다.
- (void)handleZoomOutAction:(id)sender {
MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.s pan.latitudeDelta/0.5, mapView.region.span.longitudeDelta/0.5));
[mapView setRegion:newRegion];
}
- (void)handleZoomInAction:(id)sender {
MKCoordinateRegion newRegion=MKCoordinateRegionMake(mapView.region.center,MKCoordinateSpanMake(mapView.region.span.latitudeDelta*0.5, mapView.region.span.longitudeDelta*0.5));
[mapView setRegion:newRegion];
}
확대 / 축소 수준을 줄이거 나 늘리려면 0.5 대신 값을 선택할 수 있습니다. 두 개의 버튼을 클릭하여 이러한 방법을 사용했습니다.
NSUserDefaults를 사용하여지도의 확대 / 축소 및 위치를 저장하고 복원하는 Swift 2.0 답변입니다.
지도 위치 및 확대 / 축소를 저장하는 기능 :
func saveMapRegion() {
let mapRegion = [
"latitude" : mapView.region.center.latitude,
"longitude" : mapView.region.center.longitude,
"latitudeDelta" : mapView.region.span.latitudeDelta,
"longitudeDelta" : mapView.region.span.longitudeDelta
]
NSUserDefaults.standardUserDefaults().setObject(mapRegion, forKey: "mapRegion")
}
지도가 이동할 때마다 함수를 실행합니다.
func mapView(mapView: MKMapView, regionDidChangeAnimated animated: Bool)
{
saveMapRegion();
}
지도 확대 / 축소 및 위치 저장 기능 :
func restoreMapRegion()
{
if let mapRegion = NSUserDefaults.standardUserDefaults().objectForKey("mapRegion")
{
let longitude = mapRegion["longitude"] as! CLLocationDegrees
let latitude = mapRegion["latitude"] as! CLLocationDegrees
let center = CLLocationCoordinate2D(latitude: latitude, longitude: longitude)
let longitudeDelta = mapRegion["latitudeDelta"] as! CLLocationDegrees
let latitudeDelta = mapRegion["longitudeDelta"] as! CLLocationDegrees
let span = MKCoordinateSpan(latitudeDelta: latitudeDelta, longitudeDelta: longitudeDelta)
let savedRegion = MKCoordinateRegion(center: center, span: span)
self.mapView.setRegion(savedRegion, animated: false)
}
}
이것을 viewDidLoad에 추가하십시오.
restoreMapRegion()
이것이 늦은 답변이라는 것을 알고 있지만 확대 / 축소 수준 설정 문제를 직접 해결하고 싶었습니다. goldmine의 대답은 훌륭하지만 내 응용 프로그램에서 충분히 잘 작동하지 않는다는 것을 알았습니다.
자세히 살펴보면 금광은 "경도선은지도의 어느 지점에서나 균등하게 간격을두고 있습니다"라고 말합니다. 이것은 사실이 아닙니다. 사실 -90 (남극)에서 +90 (북극)까지 같은 간격으로 배치 된 위 도선입니다. 경도선은 적도에서 가장 넓은 간격을두고 극점으로 수렴합니다.
따라서 내가 채택한 구현은 다음과 같이 위도 계산을 사용하는 것입니다.
@implementation MKMapView (ZoomLevel)
- (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate
zoomLevel:(NSUInteger)zoom animated:(BOOL)animated
{
MKCoordinateSpan span = MKCoordinateSpanMake(180 / pow(2, zoom) *
self.frame.size.height / 256, 0);
[self setRegion:MKCoordinateRegionMake(coordinate, span) animated:animated];
}
@end
이 후기 단계에서 도움이되기를 바랍니다.
quentinadam의 답변에 따라
스위프트 5.1
// size refers to the width/height of your tile images, by default is 256.0
// Seems to get better results using round()
// frame.width is the width of the MKMapView
let zoom = round(log2(360 * Double(frame.width) / size / region.span.longitudeDelta))
MKMapView
이 답변 에 기반한 확장 (+ 부동 소수점 확대 / 축소 수준 정확도) :
import Foundation
import MapKit
extension MKMapView {
var zoomLevel: Double {
get {
return log2(360 * (Double(self.frame.size.width / 256) / self.region.span.longitudeDelta)) + 1
}
set (newZoomLevel){
setCenterCoordinate(coordinate:self.centerCoordinate, zoomLevel: newZoomLevel, animated: false)
}
}
private func setCenterCoordinate(coordinate: CLLocationCoordinate2D, zoomLevel: Double, animated: Bool) {
let span = MKCoordinateSpan(latitudeDelta: 0, longitudeDelta: 360 / pow(2, zoomLevel) * Double(self.frame.size.width) / 256)
setRegion(MKCoordinateRegion(center: coordinate, span: span), animated: animated)
}
}