地図フィルタ検索の変更


1.場所の詳細から地図へ


フィールド詳細のアドレスで、地図ページに移動できます.

1)アドレス付きPlaceDataをInfoViewControlに転送する


アドレスのみを含むケーブルからButtonに変更し、押すとMapViewに移動します.
btnPosition.setTitle(rePositon + " >", for: .normal)
btnPosition.setTitleColor(.white, for: .normal)
btnPosition.contentHorizontalAlignment = .left
アドレスをButtonのTitleに設定し、テキストを白、左揃えに設定します.
if segue.identifier == "showMap"{
    let addressController = segue.destination  as! MapViewController
    addressController.onePlace = editData!
}
マップビューとタグが既に表示されているため、InfoViewでMapControlを使用してsegueを作成し、PlaceDataを転送します.

2)選択したアドレスに対応するタグの描画

func showAddressMarker(placeData : PlaceData){
    let oneList = [placeData]
    let camera = GMSCameraPosition.camera(
        withLatitude: (placeData.geopoint.latitude) as Double,
        longitude: (placeData.geopoint.longitude) as Double,
            zoom: 15
     )
    mapView?.clear()
    mapView?.camera = camera
    mark(oneList)
}
受信した場所情報をonePlaceに送信し、カメラ位置をマークして移動します.

3)Google Mapカメラ設定

let latitude = (coor?.latitude ?? 37.566508) as Double
let longitude = (coor?.longitude ?? 126.977945) as Double
let camera = GMSCameraPosition.camera(withLatitude: latitude, longitude: longitude, zoom: 12.0)
       
mapView = GMSMapView.map(withFrame: self.view.frame, camera: camera)
MapViewの設定はこのように行い、同じようにアドレスを変更すればカメラの視点が変わると思ってカメラの位置を特定するコードです.

4)Google Mapカメラの位置変更

let camera = GMSCameraPosition.camera(
            withLatitude: (placeData.geopoint.latitude) as Double,
            longitude: (placeData.geopoint.longitude) as Double,
            zoom: 15
          )

 mapView?.camera = camera
カメラの位置を移動するには、上記のコードを使用する必要があります.

2.住所詳細地図


すべてのタグを表示するMapViewを使用しているので、詳細ページから入るかどうか区別する必要があります.
たとえば、タグ全体を表示し続けるためにviewWillAppearで地図の初期化とタグ全体の再描画を行い、その結果、場所の詳細でアドレスをクリックして地図に切り替えると、地図が初期化されます.

場所詳細ページvs地図ビュー


1) viewWillAppear


タグ全体を描画するには、非サイト詳細マップに入る場合のみ
override func viewWillAppear(_ animated: Bool) {
        if onePlace == nil{
            mark(places)
        }
    }

2)タグの選択


タイトルを表示するには、場所の詳細にのみ表示されるタグを選択します.
mapView?.selectedMarker = marker

3)クリックマーク


地図ビューでクリックすると、「サイト詳細」ページに移動します.「サイト詳細」ページから「サイト詳細」ページに移動した場合は、「サイト詳細」ページに再度移動します.
if onePlace == nil{
	placeTitle = marker.title!
	self.performSegue(withIdentifier: "sgMapInfo", sender: self)
}else{
	 _ = navigationController?.popViewController(animated: true)
}

4)タグフィルタの検索


地図ビューでのみフィルタ検索が可能ですが、サイトの詳細ページでは、完全なサイトリストplacesがないため、フィルタ検索ができないことが示されます.

3.Navigationに変更


他の画面はNavigationControllerで、MapViewはView Controllerだけです.
InfoViewでは、アドレスをクリックするとPopViewに表示され、下にスライドするとウィンドウを消すことができますが、Google Mapはスライドせずに地図を移動し、ウィンドウを閉じることができません.
後退ボタンを自動的に生成するために、MapViewもNavigationControlに変更し、画面全体をスライドしてウィンドウを閉じることができます.

4.Alert選択フィルタに変更


フィルタを選択する方法は、TextFieldにInputViewを入れる方法ですが、TextFieldは使用せず、加えた位置もぼやけています.
NavigationControllerに変更すると、ToolBarが出てきて、Bar Buttonに入れることにしました.
ただし、ButtonはInputViewを含めることができないため、UIPCierViewを含むAlertを変更してフローティングで選択します.
@IBAction func addFilter(_ sender: UIButton){
        let optionPicker = UIPickerView(frame: CGRect(x: 10, y: 50, width: 250, height: 150))
        optionPicker.delegate = self
        optionPicker.dataSource = self
        optionPicker.reloadAllComponents()
        
        let filterAlert = UIAlertController(title: "조건 선택", message: "\n\n\n\n\n\n\n\n", preferredStyle: .alert)
        filterAlert.view.addSubview(optionPicker)
        
        filterAlert.addAction(UIAlertAction(title: "취소", style: .default, handler: nil))
        filterAlert.addAction(UIAlertAction(title: "확인", style: .default, handler: { UIAlertAction in
            self.mapView?.clear()
            self.mark(self.optionedPlaces)
        }))
        
        self.present(filterAlert, animated: true, completion: nil)
}

5.UI pickerviewプリファレンス


UIIPickerViewを開くと1行目が選択されるので、クリックが完了すると1行目が選択されると思います.
func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int)
ただし、pickerを使用しないと、選択関数はまったく呼び出されないため、値を超えません.
何も選択されていない場合は、デフォルトで最初の行が選択されます.
pickerView(optionPicker, didSelectRow: 0, inComponent:0)
「≪フィルタの選択|Select Filter|emdw≫」ボタンを押して実行する関数に0番目の値を選択させると、値がない場合は実行を続行します.picker値が変更されると、すぐにフィルタ場所リストoptionedplacesに適用されるため、選択が完了すると、変更された値を使用してフィルタ検索が行われます.
アプリケーションのもう1つのUIIPickerVeiwで使用される機能は、追加場所でグループと分類を選択することです.
InputViewで使用されるため、予め値を入力するのではなく、同じ選択で関数のグループ化と分類使用を完了します.
    @objc func groupPickerDone(){
        if tfGroup.text == ""{
            tfGroup.text = groupItem[0]
        }
        self.view.endEditing(true)
    }
    
    @objc func categoryPickerDone(){
        if tfCategory.text == ""{
            tfCategory.text = categoryItem[0]
        }
        self.view.endEditing(true)
    }
pickerは変更するたびに各TextFieldに入力するので、空の場合は最初の項目を何の選択もない内容として入れます.