비디오: 8년차 앱등이가 알려주는, 아이폰 숨겨진 꿀기능 5가지! 이거 왜 다들 몰라요 ㅠㅠ 2024
iOS 앱의 도구 모음에 버튼을 추가하여 현재 위치를 확대 한 다음지도 영역으로 돌아가서 현재 표시하고있는 범위로 쉽게 이동할 수 있습니다.
굵게 표시된 코드를 추가하여 MapController 메소드 viewDidLoad에 버튼을 추가합니다.
- (void) viewDidLoad {[super viewDidLoad]; 본인. mapView. 대의원 = 자기; 본인. mapView. showsUserLocation = YES; [self setInitialRegion]; RTAppDelegate * appDelegate = [[UIApplication sharedApplication] delegate]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {UILabel * titleLabel = [[UILabel alloc] initWithFrame: CGRectMake (0, 0, 250, 44)]; titleLabel. textColor = [UIColor yellowColor]; titleLabel. font = [UIFont boldSystemFontOfSize: 17]; titleLabel. textAlignment = NSTextAlignmentCenter; titleLabel. backgroundColor = [UIColor clearColor]; titleLabel. 텍스트 = [자기 mapTitle]; UIBarButtonItem * titleView = [[UIBarButtonItem alloc] initWithCustomView: titleLabel]; UIBarButtonItem * flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target: 없음 액션: 없음]; flexibleSpace. 폭 = 1.0; NSMutableArray * itemsArray = [자기. 도구 모음. items mutableCopy]; [itemsArray insertObject: flexibleSpace atIndex: [itemsArray count] -2]; [itemsArray insertObject: titleView atIndex: [itemsArray count] -2]; [본인. toolbar setItems: itemsArray animated: NO];} else {자기. title = [appDelegate. trip mapTitle];} [self addAnnotations]; UIBarButtonItemStyleBordered target: self action: @selector (goToLocation:)]; UIBarButtonItem * locateButton = [[UIBarButtonItem 할당]] initWithTitle:; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) { NSMutableArray * itemsArray = [self. 도구 모음. items mutableCopy]; [itemsArray insertObject: locateButton atIndex: [itemsArray count]]; [자기. 툴바 setItems: itemsArray animated: NO]; } else { 자기 navigationItem. rightBarButtonItem = locateButton; } } 여기서 사용자가 생성 한 Locate 버튼을 탭하면 GoToLocation: 메시지가 MapController (target)에 [action: @selector (goToLocation:)]: 자기).
시뮬레이터를 사용하는 경우 시뮬레이트 된 위치를 선택해야하는 위치로 돌아가는 것을 잊지 마십시오.
다음으로 MapController에 goToLocation: 메소드를 추가합니다. 엠.
MKUserLocation * annotation = self. mapView. userLocation; CLLocation * location = 주석. 위치; if (nil == location) return; CLLocation 거리 거리 = MAX (4 * 위치. 수평 정확도, 500); MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance (위치, 좌표, 거리, 거리); [본인. mapView setRegion: 영역 애니메이션: 아니요]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. 도구 모음. 항목; UIBarButtonItem * locateButton = [itemsArray objectAtIndex: [itemsArray count] -1]; locateButton. 액션 = @ 선택기 (goToDestination:); locateButton. 제목 = @ "목적지";} else {자기. navigationItem. rightBarButtonItem. 액션 = @ 선택기 (goToDestination:); 본인. navigationItem. rightBarButtonItem. title = @ "Destination";}}
사용자가 Locate 버튼을 탭하면 앱은 먼저 위치를 사용할 수 있는지 확인합니다. (응용 프로그램이 사용 가능하게 될 때까지 몇 초가 걸릴 수 있습니다.) 그렇지 않으면 영역을 변경하지 않고 간단하게 메소드에서 돌아옵니다. (물론 사용자에게 어떤 일이 발생했는지 알리는 경고를 표시하고 10 초 정도 후에 다시 시도 할 수 있습니다.)
위치를 사용할 수있는 경우 앱은 사용자가 이동할 지역의 범위를 계산합니다. 이 경우 다음 코드가 반환됩니다. CLLocationDistance distance = MAX (4 * location. horizontalAccuracy, 500);
는 장치의 horizontalAccuracy의 4 배가되도록 스팬을 계산합니다 (단, 1,000m 이상). horizontalAccuracy는 장치의 정확도를 고려할 때 불확실한 반경입니다. 즉, 사용자가 해당 서클 어딘가에 있습니다.
지정한 좌표 및 거리 값을 사용하여 새 MKCoordinateRegion을 만드는 MKCoordinateRegionMakeWithDistance 함수를 호출합니다.
범위를 변경하지 않으려는 경우지도보기의 centerCoordinate 속성을 userLocation으로 설정하면 범위를 변경하지 않고 userLocation 좌표에 영역의 중심을 지정했을 것입니다.
사용자가 위치 버튼을 탭하면 버튼의 제목을지도 제목으로 변경하고 @ 선택기를 (goToDestination:)으로 변경합니다. navigationItem을 통해 도구 모음 itemsArray 및 iPhone에서 iPad의 단추에 액세스합니다.즉, 다음에 사용자가 버튼을 터치하면 goToDestination: 메시지가 전송되므로 MapController에 코드를 추가하는 것이 좋습니다. 엠. 그러면 영역이 대상 영역으로 다시 설정되고 버튼 제목이 다시 찾기로 전환됩니다.
- (void) goToDestination: (id) sender {[self setInitialRegion]; if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {NSArray * itemsArray = self. 도구 모음. 항목; UIBarButtonItem * locateButton = [itemsArray objectAtIndex: [itemsArray count] -1]; locateButton. 액션 = @ 선택기 (goToLocation:); locateButton. title = @ "Locate";} else {self. navigationItem.rightBarButtonItem. 액션 = @ 선택기 (goToLocation:); 본인. navigationItem. rightBarButtonItem. title = @ "Locate";}}
이제 앱을 실행하십시오. 뉴욕지도에는 이미 두 개의 주석이 있으므로 시뮬레이터를 설정하여 샌프란시스코와 같은 먼 위치를 사용할 수 있습니다. 그렇게하면지도가 제대로 작동하는지 쉽게 알 수 있습니다.
사용자 위치를 가졌기 때문에 사용자 위치를 사용하여지도를 중앙에 배치하고 싶을 수 있습니다. 프로그램을 시작하자마자 위치 찾기 메커니즘을 시작하는 한 괜찮습니다.
문제는 하드웨어가 현재 위치를 찾는 데 약간의 시간이 걸릴 수 있으며 오래 기다리지 않으면 오류가 발생한다는 것입니다.
- (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) 객체 변경: (NSDictionary *) 컨텍스트를 변경하는 등 나중에 실행되는 메서드에 맵을 중앙에 배치 할 코드를 추가 할 수 있습니다. (void *) context {
이 메시지는지도가 위치 정보를 받기 시작하자마자 보내지 만 초기보기와 중심보기의 다시 표시를 보게됩니다. 심미적 인 이유 때문에 프로그램 시작시 MapController와 MapView를 초기화해야합니다 - 독자를위한 연습입니다.