正しい質問の仕方が出来てないかもしれませんがご了承ください。アナログ時計を実装しているのですが、秒針がうまく回転しましせん。時間通りに回転はするのですが、ブーメランみたいにくるくる回ってるだけです。
分からないこと
画像を正確に回転させるロジックがよくわかっていません。例えば、UIViewの座標の原点が左上だとしたら、左上から中心になるように画像を表示させ、そのまま回転を加えても、同じようなことになります。
どのような画像を、どのよう座標の原点で回せばいいのでしょうか。考え方をアドバイスいただけますか。まあ、QuartzCore、CALayer、CGAffineTransform、CATransform3D、CAAnimationらへんの知識を積もうと思っています。
実装
赤い丸と秒針は別々の画像です。秒針の一番下を軸として、赤い丸の部分から離脱することなく正確に回したいです。上記の画像の実装のロジックは下記のように書いています。
Timer
を使って1秒ごとに処理を実行します。
swift
1func update(tm: Timer) { 2 //アナログ時計実装のための関数
swift
1let date = Date()
let calendar = Calendar.current
let sDeg = seconds * (360 / 60)
let seconds = calendar.component(.second, from: date)
回転実行
swift
1secondsImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI * Double(sDeg) / 180.0)) 2 3//下記のような警告が出てます 4 5//'M_PI' is deprecated: Please use 'Double.pi' or '.pi' to get the value of correct type and avoid casting.
全ソース
swift
1let xPosition = TopMenu.frame.origin.x 2 let yPosition = TopMenu.frame.origin.y - CGFloat(isClosed) 3 let height = TopMenu.frame.size.height 4 let width = TopMenu.frame.size.width 5 UIView.animate(withDuration: 1.0, animations: { 6 self.TopMenu.frame = CGRect(x:xPosition, y:yPosition, width:width, height:height) 7 }) 8 } 9 func update(tm: Timer) { 10 //アナログ時計実装のための関数 11 let date = Date() 12 let calendar = Calendar.current 13 let hour = calendar.component(.hour, from: date) 14 let minutes = calendar.component(.minute, from: date) 15 let seconds = calendar.component(.second, from: date) 16 17 let hDeg = (hour % 12) * (360 / 12); 18 let mDeg = minutes * (360 / 60); 19 let sDeg = seconds * (360 / 60) 20 print(hDeg) 21 print(mDeg) 22 print(sDeg) 23 24 25 secondsImage.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI * Double(sDeg) / 180.0)) 26 27 //= CGAffineTransform(rotationAngle: CGFloat(M_PI * Double(sDeg) / 180.0)); 28 29 }
回答2件
あなたの回答
tips
プレビュー