Swift3.0でドラッグで動かせるアナログ時計を作りたい

こんにちわ。自分に都合の悪い情報は全カットしてしまうよう技術者に向いてない自分です。今日は、アナログ時計の実装をしてみたいと思います。まだ完全じゃないので説明は省きます。覚書です。実行動画は下記のような感じ。

on.gif

ソース

Analog-Clock-Swift3.0-

実装

import UIKit
var MovedHourCount:Float = 0.0

var hG : Float = 0
var mG : Float = 0

class ViewController: UIViewController {

    @IBOutlet weak var whattimenowMinute: UILabel!
    @IBOutlet weak var whattimenow: UILabel!
    var test : Float = 0
    var test2 : Float = 0
    var myView: UIView!
    var myView2: UIView!


    override func viewDidLoad() {
        super.viewDidLoad()

        myView2 = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 100))
        myView2.center = self.view.center
        myView2.backgroundColor = UIColor.green;
        self.view.addSubview(myView2)

        myView2.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0)

        let box2 = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box2.backgroundColor = UIColor.blue
        myView2.addSubview(box2)

        myView = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 100))
        myView.center = self.view.center
        myView.backgroundColor = UIColor.red;
        self.view.addSubview(myView)

        myView.layer.anchorPoint = CGPoint(x: 0.5, y: 1.0)

        let box = UIView(frame: CGRect(x: 0, y: 0, width: 20, height: 20))
        box.backgroundColor = UIColor.blue
        myView.addSubview(box)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent!) {

        let touch = touches.first!

        //時針
        if touch.view === myView2.subviews[0] {
            let position = touch.location(in: self.view)
            let inC = CGPoint(x:view.frame.size.width / 2, y:view.frame.size.height / 2)
            var angle = atan2f(Float(position.y - inC.y), Float(position.x - inC.x)) + Float(Double.pi / 2)
            let HOUR_RADIUS = (Double.pi / 6)
            let MIN_HOUR_RADIUS = (HOUR_RADIUS / 60)
            let h = (angle / Float(HOUR_RADIUS) ).truncatingRemainder(dividingBy: Float(12))


            //whattimenowMinute.text = String(hG)

            hG =     (h + 0).truncatingRemainder(dividingBy: 12)
            print("hGは\(hG)です。mGは\(mG)です。")
            let MINUTE_RADIUS = (Double.pi / 30)
            let m = (angle / Float(MINUTE_RADIUS) )
            myView2.transform = CGAffineTransform(rotationAngle: CGFloat((Float(m * 6) * Float(Double.pi)) / 180.0))
        }


        //red
        if touch.view === myView.subviews[0] {
            let position = touch.location(in: self.view)
            let inC = CGPoint(x:view.frame.size.width / 2, y:view.frame.size.height / 2)
            var angle = atan2f(Float(position.y - inC.y), Float(position.x - inC.x)) + Float(Double.pi / 2)

            if(angle < 0){
            angle = angle + Float(2 * Double.pi)
            }else if(angle >= Float(2 * Double.pi) ){
            angle = angle - Float(2 * Double.pi)
            }

            let HOUR_RADIUS = (Double.pi / 6)
            let MIN_HOUR_RADIUS = (HOUR_RADIUS / 60)
            let h = (angle / Float(HOUR_RADIUS) ).truncatingRemainder(dividingBy: Float(12))
            let MINUTE_RADIUS = (Double.pi / 30)
            let m = (angle / Float(MINUTE_RADIUS) )

            if(mG > 55 && m < 5){
                hG = (hG + 1).truncatingRemainder(dividingBy: 12);
            } else if(mG < 5 && m > 55){
                hG = (hG - 1).truncatingRemainder(dividingBy: 12)
                if(hG == -1){
                hG = 11
             }
            }

            mG =  Float(m)
            print("hGは\(hG)です。mGは\(mG)です。")
            whattimenow.text = String(mG)
            whattimenowMinute.text = String(hG)
            myView.transform = CGAffineTransform(rotationAngle: CGFloat((Float(m * 6) * Float(Double.pi)) / 180.0))
            myView2.transform = CGAffineTransform(rotationAngle:CGFloat(Float(HOUR_RADIUS) * Float(hG) + Float(MIN_HOUR_RADIUS) * Float(mG)))
        }
    }
}
藤沢瞭介(Ryosuke Hujisawa)
  • りょすけと申します。18歳からプログラミングをはじめ、今はフロントエンドでReactを書いたり、AIの勉強を頑張っています。off.tokyoでは、ハイテクやガジェット、それからプログラミングに関する情報まで、エンジニアに役立つ情報を日々発信しています!

未整理記事