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

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

新規登録して質問してみよう
ただいま回答率
85.35%
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回答

1367閲覧

iOS UIView 現在タッチしているUIViewをコードで解除したい

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

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

Xcode

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

Swift

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

0グッド

1クリップ

投稿2020/03/28 08:59

環境

  • Swift 5.2
  • Xcode 11.4

概要

現在、以下のようにドラッグすると動くViewを実装中です。
このViewを特定のタイミングでユーザーのタッチ対象から外したいのですが、
実装がわからず。ご教授いただけますと幸いです。

ソースコード

Swift

1final class View: UIView { 2 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 3 guard let touch = touches.first else { return } 4 let location = touch.location(in: self) 5 let previousLocation = touch.previousLocation(in: self) 6 let draggedDistanceX = location.x - previousLocation.x 7 let draggedDistanceY = location.y - previousLocation.y 8 var newFrame = frame 9 newFrame.origin.x += draggedDistanceX 10 newFrame.origin.y += draggedDistanceY 11 frame = newFrame 12 } 13} 14 15final class ViewController: UIViewController { 16 private let view = View() 17 18 private func hoge() { 19 // ここで特定のコードを用いて、Viewのタッチを解除したい 20 } 21} 22```

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

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

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

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

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

guest

回答2

0

ベストアンサー

現在のViewの作りですと、仮に touchView.isUserInteractionEnabledfalseにしても、touchesMoved()が呼ばれ続けてしまうため、Viewのドラッグは止まらないかと思います。

下記のサンプルコードでは次のような対応をおこないました。

  • ViewのtouchesBegan()でドラッグされているかどうかのフラグを追加しました
  • フラグが立っていなければ Viewが動かないようにしました
  • hoge() が実行されたら touchesEnded() を呼ぶようにしました
  • それ以降はフラグが落ちるので Viewが動かなくなります
import UIKit final class View: UIView { var touched: Bool = false override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesBegan(touches, with: event) touched = true } override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { guard touched else { return } guard let touch = touches.first else { return } let location = touch.location(in: self) let previousLocation = touch.previousLocation(in: self) let draggedDistanceX = location.x - previousLocation.x let draggedDistanceY = location.y - previousLocation.y var newFrame = frame newFrame.origin.x += draggedDistanceX newFrame.origin.y += draggedDistanceY frame = newFrame } override func touchesCancelled(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesCancelled(touches, with: event) touched = false } override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { super.touchesEnded(touches, with: event) touched = false } } class ViewController: UIViewController { @IBOutlet weak var touchView: View! @IBOutlet weak var label: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. // 5秒後にタッチをドラッグを強制的にキャンセルする DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(5)) { [weak self] in self?.hoge() } } private func hoge() { label.text = "called hoge." resignFirstResponder() touchView.touchesEnded([UITouch()], with: UIEvent()) } }

上記のサンプルコードを実行した動画を添付します。5秒のタイマーが満了するとhoge()を実行してタッチ対象から外すようにしました。

イメージ説明

  • Xcode 11.4
  • iOS 13.4

にて検証をおこないました。GitHubに検証に使ったプロジェクトをアップロードいたしました。参考になれば幸いです。

投稿2020/03/29 13:56

編集2020/04/04 07:00
ch3cooh

総合スコア287

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

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

0

そのViewのタッチイベントを無効にするとどうなりますか?

apple

投稿2020/03/28 15:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問