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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

2回答

1236閲覧

storyboard上のImage Viewをドラッグした時の判定

o.tom

総合スコア7

iOS

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

Xcode

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

Swift

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

1グッド

0クリップ

投稿2017/09/19 05:15

編集2017/09/20 04:01

###前提・実現したいこと
storyboard上の複数のImage View全てをドラッグ終了したあとに画面遷移をしたいです。
Image Viewはドラッグをするとアニメーションで消えるようにしています。

###該当のソースコード

import UIKit class ViewController: UIViewController { //ドラッグのカウント var flg = 0 //フェードアウトが完了したら実行 func fadeoutAndRemove(_ view:UIView) { UIView.animate( withDuration: 3.0, delay: 0, options: [.curveEaseInOut], animations: { view.removeFromSuperview() }) } @IBAction func drag01(_ sender: UIPanGestureRecognizer) { //ドラッグしているビュー let fl01 = sender.view! //透明度 fl01.alpha = 1.0 //指の座標に合わせる fl01.center = sender.location(in: self.view) //フェードアウトのアニメーション UIView.animate( withDuration: 3.0, delay: 0, options: [.curveEaseInOut], animations: { //移動する fl01.center.y += 1 //消える fl01.alpha = 0.0 }, completion: {(finished: Bool) in //終わったら self.fadeoutAndRemove(fl01) //ドラッグのカウント1プラス self.flg += 1 print(self.flg) }) } @IBAction func drag02(_ sender: UIPanGestureRecognizer) { //ドラッグしているビュー let fl02 = sender.view! //透明度 fl02.alpha = 1.0 //指の座標に合わせる fl02.center = sender.location(in: self.view) //フェードアウトする UIView.animate( withDuration: 3.0, delay: 0, options: [.curveEaseInOut], animations: { //移動する fl02.center.y += 1 //消える fl02.alpha = 0.0 }, completion: {(finished: Bool) in //終わったら self.fadeoutAndRemove(fl02) //ドラッグのカウント1プラス self.flg += 1 print(self.flg) }) } override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }

###試したこと
現状は、ドラッグが終了した時の判別方法が分からず、悩んでおります。
判別方法として考えたのは、各IBActionにflgをつけてImage Viewの個数分のカウントができるかと思ったのですが、アニメーションをしているせいかアニメーションが終わるまでflgが加算されてしまいました。

sakko69👍を押しています

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

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

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

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

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

guest

回答2

0

ベストアンサー

UIPanGestureRecognizerのアクションは、ドラッグ終了時だけではなく、移動中などにも呼ばれますのでsenderのstateを見て適切な処理を行って下さい。

具体的に書くと、ドラッグ終了時は.endedになりますので、

swift

1if sender.state == .ended { 2 //フェードアウト処理 3}

となります。

また、質問のコードではdrag01()とdrag02()が同じ処理のようですが、同じ処理なのであれば関数を2つ用意する必要はなく、1つの関数に2つ(以上)のアクションを繋いでやればいいです。

投稿2017/09/20 04:26

fuzzball

総合スコア16731

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

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

o.tom

2017/09/20 06:58

ご回答ありがとうございます。 こちらのコードでフェードアウトのアニメーションとflgを囲ったところ、実現できました。 解決いたしました。 どうもありがとうございました。
guest

0

completionの中でflg += 1してはダメなのですか?
アニメーションが終わった時のコールバックなので、そこでカウントすれば良いと思うのですが・・・

投稿2017/09/19 14:25

mtdsnsk

総合スコア789

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

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

o.tom

2017/09/20 01:20

ご回答ありがとうございます。 completionの中でflg += 1してみたのですが、completionの中でループしているらしく012345...と、どんどん加算されてしまいました。。。
fuzzball

2017/09/20 01:40

質問内のコードを「completionの中でflg += 1してみたのですが」に修正もしくは追加して下さい。
o.tom

2017/09/20 04:02

ご指摘ありがとうございます。コードを修正しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問