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

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

ただいまの
回答率

90.99%

  • Swift

    6096questions

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

  • Xcode

    3516questions

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

  • iOS

    3469questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 111

o.tom

score 1

前提・実現したいこと

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が加算されてしまいました。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+2

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

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

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

となります。

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/20 15:58

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/20 10:20

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

    キャンセル

  • 2017/09/20 10:40

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

    キャンセル

  • 2017/09/20 13:02

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

    キャンセル

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

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

関連した質問

同じタグがついた質問を見る

  • Swift

    6096questions

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

  • Xcode

    3516questions

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

  • iOS

    3469questions

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