iT邦幫忙

2022 iThome 鐵人賽

DAY 18
1

【Day 18】Swift UI - 私房釣點地圖自訂座標功能

tags: 釣魚術 swift swiftui AlertView

雜談

  • 對於前端幾乎少有接觸的我,不太熟悉去弄一個介面出來給別人用;不過我還是弄得差不多了(自己講)
  • 看到隊友在畫 線性回歸,要不是我報名的題目是釣魚,我還真的想要畫個回歸線,來看看 中華大學 CP 值的計算 得第一,來決定「指考應該考幾分」

本日開發內容說明

  • 以我目前閱讀的資料,以及不到三週的開發經驗觀察到,SwiftUI 的 Button 可以直接透過 .alert 叫出小框框,吐一段文字描述,讓你選「Yes or No」
    • 這個框框,不適合我;他比較適用在 韓先生問陳先生的問題
    • 長得像這樣
    • 我們需要「按下新增鈕」後,「問使用者要不要存」
    • 如果要存的話,要知道「名字」和「推薦指數」
    • 昨天我們做了,裡面有些小細節
      • 使用 .offset() 將這個泡泡框「端進畫面中」、「移出畫面外」
    • 在主畫面的按鈕按下時,修改 Alert 框框觀察中的那個是否被按下的觀測變數
  • 比起昨天的 AddPinAlert 雙向綁定的變數,多加了一組 pinsData ... 這個東西是被秀在畫面中的那些圖釘。
AddPinAlert(alertIsPresented: $addLocationAlertIsPresented,
            myLocationName: $newSecretLocationName,
            currentRegion: $viewModel.region,
            pinsData: $SecretLocations)
  • AddPinAlert 中新增一個函式
func saveLocation() {
        self.pinsData.append(
            PinLocation(name: myLocationName, image:"",
                        coordinate: CLLocationCoordinate2D(latitude: currentRegion.center.latitude,
                                                           longitude: currentRegion.center.longitude),
                        rank: myLocationRank)
        )
    }
  • 上面的第三行,新增一個 PinLocation 餵給他地點名稱、推薦指數、經緯度,並且加入到雙向綁定的私房釣點陣列中。

操作影片、截圖

原始碼片段

//
//  AddPinAlert.swift
//  BaoAnGongFisher
//
//  Created by nipapa on 2022/9/22.
//

import SwiftUI
import MapKit
import CoreLocationUI

struct AddPinAlert: View {

    let screenSize = UIScreen.main.bounds
    @Binding var alertIsPresented: Bool
    @Binding var myLocationName: String
    @Binding var currentRegion: MKCoordinateRegion
    @Binding var pinsData: [PinLocation]
    @State var myLocationRank: Int = 3
    var boxTitle: String = "在十字記號下新增私房釣點?"

    var body: some View {
        VStack {
            Text(boxTitle)
            TextField("自訂名稱", text: $myLocationName)
                .textFieldStyle(RoundedBorderTextFieldStyle())
            Picker("", selection: $myLocationRank) {
                Text("不推").tag(1)
                Text("龜").tag(2)
                Text("普通 / 未知").tag(3)
                Text("好").tag(4)
                Text("超讚").tag(5)
            }
            Spacer()
            HStack (alignment: .center){
                Spacer()
                Button("好") {
                    print(currentRegion)
                    saveLocation()
                    self.alertIsPresented = false
                }
                Spacer()
                Button("取消") {
                    self.alertIsPresented = false
                }
                Spacer()
            }
        }
        .padding()
        .frame(width: screenSize.width * 0.6, height: screenSize.height * 0.2)
        .background(Color.cyan)
        .clipShape(RoundedRectangle(cornerRadius: 30, style: .continuous))
        .shadow(color: Color.gray, radius: 15, x: -1, y: -1)
        .offset(y: alertIsPresented ? screenSize.height * 0.2 : screenSize.height)
    }

    func saveLocation() {
        self.pinsData.append(
            PinLocation(name: myLocationName, image:"",
                        coordinate: CLLocationCoordinate2D(latitude: currentRegion.center.latitude,
                                                           longitude: currentRegion.center.longitude),
                        rank: myLocationRank)
        )
    }
}

struct AddPinAlert_Previews: PreviewProvider {
    static var previews: some View {
        //AddPinAlert(alertIsPresented: .constant(true), myLocationName: .constant(""))
        AddPinAlert(alertIsPresented: .constant(false), myLocationName: .constant(""),
                    currentRegion: .constant(
                        MKCoordinateRegion(
                            center: CLLocationCoordinate2D(latitude: 25.144274, longitude: 121.381837),
                            span: MKCoordinateSpan(latitudeDelta: 0.08, longitudeDelta: 0.08))
                        ),
                    pinsData: .constant(SecretLocationsData)
        )
    }
}

開發進度

  • 釣點地圖功能的實作
  • [x] 長按手勢 【Day 13】 -> 非必要情況,避免使用 中斷(interrupt);取而代之的是,時做了一個按鈕,配合 Alert 來決定是否擷取座標。 【Day 18】
  • [x] 跳出對話框(是否新增釣點?新增/取消)或是功能選單(新增釣點/.../取消) 【Day 13】
  • [x] 如果要新增釣點的話,就要取得手指按下地點的經緯度 【Day 16】(今天)
  • [x] 製作一個介面讓使用者輸入名稱、並將經緯度和名稱一併存起來 -> 【Day 18】結合 【Day 17】的 Alert
  • [x] 載入地圖時把圖釘加上去 【Day 14】
  • [x] 重構 - 分離地圖畫面與圖釘資料 【Day 15】
  • [ ] 從檔案或是資料庫撈取座標

心得

  • 明天要來做釣點私房儲存的功能,思考一下做法和特性
    • 文字檔:簡單明瞭低開發維運成本,不過讀本地資料,對於常常換手機的人就沒那麼方便。
    • 資料庫:在 iPhone / iPad 上弄 SQLite 好像要比存文字檔多做很多事情;好處是之後功能要上雲比較方便。
  • 屬於釣魚人的集郵冊
    • 儲存照片、魚的名字、釣點名字、GPS座標、感言或是釣魚經
    • 這個要思考圖片引用本地相簿的方式,或是另外保存的方式,或是搬到雲上
    • 魚的名字等等的,就是存文字檔或是存資料庫
    • 排在「儲存」功能實作完之後再來弄集郵冊
  • 給新手選裝備的,釣組配裝筆記本
    • 由本 APP 提供釣法參考
      • 釣竿、釣線、釣鉤及釣餌的搭配菜單
    • 由使用者自訂配裝
    • 有影片教學的話會更好
  • 吃魚功能

上一篇
【Day 17】Swift UI - 替新增秘密釣點輸入功能,製作一個 Alert 輸入框
下一篇
【Day 19】Swift 存取 JSON 檔案 - 使用 Codable 和 JSON
系列文
無法成為釣魚大師也要努力摸魚!!辣個吃魚神器 APP38
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言