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

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

新規登録して質問してみよう
ただいま回答率
85.48%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

1639閲覧

再帰的に呼んでいるアニメーション画像の削除方法

lyzmfeqpxs54

総合スコア237

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/11/11 08:36

swiftに関する質問です。
swift2.0で記載しております。
タイトルどおりですが下記コード用いてアニメーションのメソッドを連続で呼んでいます(画像を拡大、縮小する)。この状態でこの画像をremoveFromSuperview()で消した場合(imageRemove()を呼ぶ)にこのメソッド(animateImage)が無限に呼ばれCPUが100%になってしまいます。

下記コードの「//アニメーションストップ」部分は、もともと書いておらず、この部分に書けば良いのではないかと思ったのですがうまくいきませんでした。

「再帰的にメソッドを呼ばれないようにしながら画像を削除したい」がやりたいことです。

アドバイスをいただければ幸いです。
よろしくお願いいたします。

swift

1 2 3var checkView: UIImageView! 4 5override func viewDidLoad() { 6 super.viewDidLoad() 7 8 //imageの作成 9 checkView = UIImageView() 10 //使用する画像の名前 11 var checkImage = "Image.png" 12 //画像のセット 13 checkView.image = UIImage(named: checkImage)! 14 checkView.frame = CGRectMake(0 ,0 ,100 ,100) 15 //tag番号 16 checkView.tag = 1 17 //画像表示 18 self.view.addSubview(checkView) 19 //画像のアニメーションメソッドを呼ぶ 20 animateImage(checkView) 21} 22 23 24 func animateImage(target:UIView){ 25 print("アニメーションスタート") 26 27 // 拡大アニメーション 28 UIView.animateWithDuration(0.4,delay: 0.0, options : [UIViewAnimationOptions.CurveLinear, .AllowUserInteraction], animations: { () -> Void in 29 // 縮小用アフィン行列を作成. 30 target.transform = CGAffineTransformMakeScale(1.03, 1.03) 31 }) // 連続したアニメーション処理. 32 { (Bool) -> Void in 33 UIView.animateWithDuration(0.4,delay: 0.0, options : [UIViewAnimationOptions.CurveLinear, .AllowUserInteraction], animations: { () -> Void in 34 // 縮小用アフィン行列を作成. 35 target.transform = CGAffineTransformMakeScale(0.97, 0.97) 36 }) // 連続したアニメーション処理. 37 { (Bool) -> Void in 38 // 再度アニメーションを起動 39 self.animateImage(target) 40 } 41 } 42 43 } 44 45 //画像削除メソッド 46 func imageRemove(){ 47 // self.viewの上に乗っているオブジェクトを順番に取得 48 for v in view.subviews { 49 // オブジェクトの型がUIImageView型で、タグが1番〜100番のオブジェクトを取得 50 if let v = v as? UIImageView where v.tag >= 1 && v.tag <= 100 { 51 //アニメーションストップ 52 v.layer.removeAllAnimations() 53 // そのオブジェクトを親のviewから取り除く 54 v.removeFromSuperview() 55 } 56 } 57 } 58

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

completionに渡されるフラグが正常終了しなかったとき(キャンセルされたとき?)にfalseになるようなので、処理をスキップするようにしてみました。

swift

1(前略) 2 }) // 連続したアニメーション処理. 3{ flag1 -> Void in 4 if flag1 { 5 UIView.animateWithDuration(0.4,delay: 0.0, options : [UIViewAnimationOptions.CurveLinear, .AllowUserInteraction], animations: { () -> Void in 6 // 縮小用アフィン行列を作成. 7 target.transform = CGAffineTransformMakeScale(0.97, 0.97) 8 }) // 連続したアニメーション処理. 9 { flag2 -> Void in 10 if flag2 { 11 // 再度アニメーションを起動 12 self.animateImage(target) 13 } 14 } 15 } 16}

ちゃんとコードを理解していないので、ただの対症療法かも知れません。

投稿2016/11/11 10:14

fuzzball

総合スコア16731

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lyzmfeqpxs54

2016/11/11 15:48

いつもお早い解答をありがとうございます。 ご教示いただいたコードを試してみたのですが、画像がアニメーションを行わなくなっていまします。
fuzzball

2016/11/11 17:01 編集

全くアニメーションしなくなったのでしょうか? → コードの修正が間違っていると思われます。 それとも、最初の拡大アニメ終了後に止まってしまうということでしょうか? → flag1の値がどうなっているか教えて下さい。 : { flag1 -> Void in print(flag1) //←これ追加 if flag1 { :
lyzmfeqpxs54

2016/11/12 00:56

全くアニメーションを行わずflag1の値はfalseでした。一度 if flag1 { } を取り去り再帰的にメソッドを呼んだ状態でflag1を確認してみると最初のみfalseで以降trueが繰り返し呼ばれている状態です(ちゃんとアニメーションする)。どのようなことが考えられるか、ご教示いただけると幸いです。
lyzmfeqpxs54

2016/11/12 02:55

アニメーション開始をviewWillAppear内に記載することで解決いたしました。 いつも的確なアドバイスをありがとうございます。 また、よろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問