iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Mobile Development

使用 SwiftUI 讓有趣的點子變成 Apps系列 第 6

D6 - 使用 SwiftUI 讓有趣的點子變成 Apps{葛麗絲逆走鐘: 時分秒 針}

  • 分享至 

  • xImage
  •  

在前一天,我們畫出了針的雛型,而我想做的時鐘,是有時、分、秒針的。

時分秒的差別,我這邊選擇使用 enum。在 getLengthRatio() 上設定每根針的比例,在 getSpacing() 設定每根針的寬度。

enum HandLength {

    case second
    case minute
    case hour
    
    func getLengthRatio() -> Double {
        switch self {
        case .second:
            return 1
        case .minute:
            return 0.9
        case .hour:
            return 0.7
        }
    }
    
    func getSpacing() -> CGFloat {
        switch self {
        case .second:
            return 2
        case .minute:
            return 4
        case .hour:
            return 6
        }
    }
}

struct HandShape: Shape {
    
    var spacing: CGFloat {
        return handLength.getSpacing()
    }
    
    var handLength: HandLength
    
    func path(in rect: CGRect) -> Path {
        
        var p = Path()

        p.move(to: CGPoint(x: rect.midX - spacing, y: rect.midY))
        p.addLine(to: CGPoint(x: rect.midX, y: getHandPointY(rect: rect, handLength: handLength)))
        p.addLine(to: CGPoint(x: rect.midX + spacing, y: rect.midY))
        
        return p
    }
    
    func getHandPointY(rect: CGRect, handLength: HandLength) -> CGFloat {
        
        let edge = min(rect.size.width, rect.size.height)
        return edge * ( 1 - handLength.getLengthRatio())
    }
}
struct HandShape_Previews: PreviewProvider {
    static var previews: some View {
        
        Group {
            HandShape(handLength: .second)
                .fill(BCColor.secondHandColor)
                .frame(width: 200, height: 200, alignment: .center)
                .background(.cyan)
            HandShape(handLength: .minute)
                .fill(BCColor.minuteHandColor)
                .frame(width: 200, height: 200, alignment: .center)
                .background(.cyan)
            HandShape(handLength: .hour)
                .fill(BCColor.hourHandColor)
                .frame(width: 200, height: 200, alignment: .center)
                .background(.cyan)
        }
        .previewLayout(.sizeThatFits)
    }
}

可以在下方看到三根針的 preview,嗯,這樣有符合三個長短不一樣的針的需求了。下一篇「錶盤」

https://ithelp.ithome.com.tw/upload/images/20220906/2014062218K1Ug0hfd.png


上一篇
D5 - 用 SwiftUI 讓有趣的點子變成 Apps{葛麗絲逆走鐘: 開專案和畫上針}
下一篇
D7 - 用 SwiftUI 讓有趣的點子變成 Apps{葛麗絲逆走鐘: 錶盤}
系列文
使用 SwiftUI 讓有趣的點子變成 Apps30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言