質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.97%

【Swift】ルーレットを止めた時、止めたタイミングの状態で残したい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,467

RagnAnet1373

score 47

前提・実現したいこと

前回の質問で解決した所の
回転を止める所で現在の状態ですと
止めた時に一番最初の状態に戻るので、それを直したいです

該当のソースコード

    //CABasicAnimationのtransform.zを使用する
    let rotationAnimation = CABasicAnimation(keyPath:"transform.rotation.z")


    func spinAnim(_ sender: UIView)
    {
        rotationAnimation.toValue = CGFloat(Double.pi / 180) * 360//回転角度
        rotationAnimation.duration = 0.8//アニメーションにかかる時間
        rotationAnimation.repeatCount = .infinity//何回繰り返すか(MAXFLOATを修正)

        //アニメーションさせたいものにaddする
        sender.layer.add(rotationAnimation, forKey: "rotationAnimation")
    }

    func spinStop(_ sender: UIView)
    {
        sender.layer.removeAnimation(forKey:"rotationAnimation")
    }


状態を保存する際にtoValueを入れると保存可能と調べたら出ましたので、
このfunc spinStopを

    func spinStop(_ sender: UIView)
    {
        if let anim = sender.layer.animation(forKey:"transform.rotation.z"){
        let base = anim as! CABasicAnimation
        sender.layer.transform = base.toValue as! CATransform3D
        sender.layer.removeAnimation(forKey:"rotationAnimation")
        }
    }


こう変更した所エラーが出ました

発生している問題・エラーメッセージ

問題としましては、エラーメッセージなどはなく動くのですが、
ストップボタンを押した時に回転が止まらないようになってしまっています・・・。

試したこと

このように記述する前にいろいろ試すとエラーメッセージで値が0、nilと言われ続けたので
現在は質問した通りのようにしてエラーをなくせたのですが、その代わり止まらない状態になってしまいました・・・。

補足情報(言語/FW/ツール等のバージョンなど)

Xcode8.3,Swift3です。

頑張って調べて行くと言っておいてすぐで、大変申し訳ございません・・・。
どれだけ調べて、Swift3用に直して試してもエラーメッセージばかりで、どうしても力不足を感じてしまいました・・・。

ヒントとなるサイトだけでもご教示、ご教授いただけるとありがたいです・・・。
おそらくこのrotationAnimationを開始しようとした時もこのようなことが起こりえそうです・・・・・・。
宜しくお願い致します・・・・・・。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

とりあえずですが、キーの名前が違います。

if let anim = sender.layer.animation(forKey:"transform.rotation.z"){

transform.rotation.zではなくrotationAnimationです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/26 15:21

    長々とこの問題に付き合ってくださり、ありがとうございました!

    おかげでどうにか解決できましたのでベストアンサーに選びました!

    またここから頑張っていきたいと思います!

    キャンセル

  • 2017/04/26 16:11

    ベストアンサーはお礼で付けるものではありません。
    ご自分の回答をベストアンサーにして下さい。

    キャンセル

  • 2017/04/26 16:18

    わかりました。そのように致します!

    キャンセル

check解決した方法

0

調査開発した結果次のスクリプトで一時停止、プラスして一時停止状態から開始まで持っていくことができました!

    //ルーレット回転開始
    func spinStart(_ sender: UIView)
    {    //CABasicAnimationのtransform.zを使用する
        let rotationAnimation = CABasicAnimation(keyPath:"transform.rotation.z")

        rotationAnimation.toValue = CGFloat(Double.pi / 180) * 360//回転角度
        rotationAnimation.duration = 0.1//アニメーションにかかる時間
        rotationAnimation.repeatCount = .infinity//何回繰り返すか

        //アニメーションさせたいものにaddする
        sender.layer.add(rotationAnimation, forKey: "rotationAnimation")
    }

    //一時停止
    func spinStop(_ sender: UIView)
    {
        let roulettelayer = sender.layer
        let pauseTime = roulettelayer.convertTime(CACurrentMediaTime(),from: nil)
        roulettelayer.speed = 0.0
        roulettelayer.timeOffset = pauseTime

        //sender.layer.removeAnimation(forKey:"rotationAnimation")
    }

    //再開
    func spinRestart(_ sender: UIView)
    {
        let roulettelayer = sender.layer
        let pauseTime = roulettelayer.timeOffset
        roulettelayer.speed = 1.0
        roulettelayer.timeOffset = 0.0
        roulettelayer.beginTime = 0.0
        let timeSincePause: CFTimeInterval = roulettelayer.convertTime(CACurrentMediaTime(),from: nil) - pauseTime
        roulettelayer.beginTime = timeSincePause
    }

fuzzballさん、ありがとうございました!

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.97%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる