iT邦幫忙

2024 iThome 鐵人賽

DAY 5
0
Mobile Development

從概念發想上架一支SwiftUI app系列 第 5

基礎部分 - 重構討論

  • 分享至 

  • xImage
  •  

先補上昨天未完成的改善。
RotationPanel的邊界最遠在半徑75以內,處理邏輯為邊界超過的時候,取同一個角度且距離原點距離為半徑的座標。

Circle()
    .fill(Color.blue)
    .frame(width: 20, height: 20)
    .offset(rotationOffset)
    .gesture(
        DragGesture()
            .onChanged { value in
                let radius = 75.0 // 圓形的半徑
                var newX = value.translation.width + lastOffset.width
                var newY = value.translation.height + lastOffset.height

                let distance = sqrt(newX * newX + newY * newY)
                if distance > radius {
                    let angle = Double(atan2(newY, newX))
                    newX = radius * cos(angle)
                    newY = radius * sin(angle)
                }

                rotationOffset = CGSize(width: newX, height: newY)
            }
            .onEnded { _ in
                lastOffset = rotationOffset
            }
)

接下來我們看看哪邊可以重構,增加可讀性與易維護性。

  • Magic number: 有幾個數字有相關,在前面的程式中有出現200, 100, 150並沒有明確定義。而且有些是半徑與直徑的關係,很容易改動後造成畫面異常。
  • 參數定義: RotationPanel的手勢運算沿用PositionPanel的程式碼,測試階段是建立一個Text印出數值驗證功能。因此rotationOffset不應該是傳遞給LightZone的正確格式,這裡應該調整為轉換後的角度。
  • 整理傳遞參數: 把這下列的state整合在一起
    @State private var circleSize: CGFloat = 20
    @State private var brightness: Double = 1.0
    @State private var circleColor: Color = .white
    @State private var offset: CGSize = .zero
    @State private var rotationOffset: CGSize = .zero

上一篇
基礎部分 - 面板部份
下一篇
基礎部分 - 重構程式碼, 實作光束效果
系列文
從概念發想上架一支SwiftUI app30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言