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

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回答

2552閲覧

[UICollectionView] ドラッグされた(なぞられた)セルをリアルタイムで取得する

sssskkkktttt

総合スコア11

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グッド

2クリップ

投稿2018/02/13 02:11

編集2018/02/13 05:53

現在SwiftでUICollectionViewを使ったアプリを開発しています。
セルを格子状に配置しており、なぞられたセルの背景色をリアルタイムで変更したいのですが方法が分かりません。
touchesBeganメソッドでなぞられた座標をリアルタイムで取得することはできています。
解決策をご教授いただければ幸いです。

Swift

1import UIKit 2 3class ViewController: UIViewController, UICollectionViewDataSource, UICollectionViewDelegate { 4 @IBOutlet weak var myCollectionView: UICollectionView! 5 6 override func viewDidLoad() { 7 super.viewDidLoad() 8 let flowLayout = UICollectionViewFlowLayout() 9 let margin: CGFloat = 0.2 10 flowLayout.itemSize = CGSize(width: 10.0, height: 10.0) 11 flowLayout.minimumInteritemSpacing = margin 12 flowLayout.minimumLineSpacing = margin 13 flowLayout.sectionInset = UIEdgeInsets(top: margin, left: margin, bottom: margin, right: margin) 14 myCollectionView.collectionViewLayout = flowLayout 15 myCollectionView.allowsMultipleSelection = true 16 17 } 18 19 // cellの数 20 func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 21 return 100 22 } 23 24 // cellの情報 25 func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 26 let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "cell", for: indexPath) 27 cell.backgroundColor = UIColor.white 28 29 return cell 30 } 31 32 func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 33 let cell = collectionView.cellForItem(at: indexPath) 34 cell?.backgroundColor = UIColor.green 35 } 36 37 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 38 print("touchesMoved") 39 } 40} 41 42extension UICollectionView { 43 override open func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 44 self.next?.touchesBegan(touches, with: event) 45 } 46 47 override open func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 48 self.next?.touchesMoved(touches, with: event) 49 // タッチイベントを取得 50 let touchEvent = touches.first! 51 52 // ドラッグ後の座標 53 let newDx = touchEvent.location(in: self).x 54 let newDy = touchEvent.location(in: self).y 55 print(newDx, newDy) 56 } 57}

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

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

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

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

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

fuzzball

2018/02/13 02:22

何が分からないのでしょうか?セルの特定?背景色の変更?リアルタイム?
sssskkkktttt

2018/02/13 02:53

なぞられたセルの背景色の変更方法です。
fuzzball

2018/02/13 05:40

聞き方を変えます。(1)座標からセルを特定する方法は分かっているのでしょうか?(2)背景色の変更方法は分かっているのでしょうか?(3)背景色をリアルタイムに変更する方法は分かっているのでしょうか?
sssskkkktttt

2018/02/13 05:52

(1)座標からセルを特定する方法が分かっていません。背景色のリアルタイム変更に関しては(1)の方法が分かれば解決できると思います。
fuzzball

2018/02/13 07:54

セルの数は実際に100なのでしょうか?CollectionViewはスクロールしますか?
sssskkkktttt

2018/02/13 08:30

実際には画面内に収まるセル数にする予定なので、スクロールはしません。
guest

回答2

0

ベストアンサー

スクロールしない前提なので直接セルの背景色を変えています。

swift

1let point = touchEvent.location(in: self) 2if let indexPath = self.indexPathForItem(at: point), let cell = self.cellForItem(at: indexPath) { 3 cell.backgroundColor = .green 4}

投稿2018/02/13 08:42

編集2018/02/13 09:14
fuzzball

総合スコア16731

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

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

sssskkkktttt

2018/02/13 09:11

ご回答ありがとうございます。 教えていただいたコードでドラッグによるセルの塗りつぶしは実装できました。 しかし、セルの数が増えると起動時の描写に時間がかかってしまいます。 作りたいアプリは10000を超えるセルが必要になると思いますのでCollectionViewでは厳しいかもしてません。 Viewを使う場合も同様にtouchesMoved()メソッドで実装可能でしょうか?
fuzzball

2018/02/13 09:15

回答を修正しました。 indexPathを取れたので数が増えても遅くなりません。
sssskkkktttt

2018/02/13 11:05

ありがとうございます。 修正していただいたコードで試してみましたが、やはりセルの数が多いとアプリ起動時の描写に時間がかかってしまいます。
fuzzball

2018/02/13 11:11

それってtouchesMovedのコードは関係ないのでは? 10000もあるなら、Viewを並べるのではなく、Viewに直接描画した方が良いと思います。
sssskkkktttt

2018/02/13 11:18

CollectionViewCellの描画の問題です。 Viewに直接描画する方向で実装しようと思います。 ありがとうございました。
guest

0

「なぞられたセルとはタップされたセルということでOKでしょうか?

タップされたセルということなら、
座標でなくて、inndexPathでcellを特定するのが普通?かと思います。
↓のところで、タップされたindexpathを取得・Cellを特定・背景色を緑に変更ってやってますので。
ビルド通って動いていればcellの背景色は変わってると思うのですが?

swift

1func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 2 let cell = collectionView.cellForItem(at: indexPath) 3 cell?.backgroundColor = UIColor.green 4}

ご自身の環境でBuildして動かしたらどうなります?

投稿2018/02/13 03:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

sssskkkktttt

2018/02/13 05:35

タップされたセルの背景色はそちらのコードで変更することができます。 今回行いたい処理は、ペイントで線を描くときのように指が通ったセルの色がどんどん変わっていくというものです。
退会済みユーザー

退会済みユーザー

2018/02/13 05:41

タップじゃなくて、ドラッグっということでしょうか? 画面に指を触れたまま移動させて、通った後だけセルの背景色を変更するわけですね。 確かに移動してる座標を取得してますもんね。
sssskkkktttt

2018/02/13 05:46

はい、ドラッグ操作になります。 できればSpriteKitなどのフレームワークを使用せず実装を行いたいです。
退会済みユーザー

退会済みユーザー

2018/02/13 05:55

私も利用しそうなので、解決策知りたいです。 座標をindexPathに変換してセル特定、変換した値の変化を監視して、ごにょごにょするとかですかね? って適当言ってすいません。
sssskkkktttt

2018/02/13 06:09

座標→indexPathの変換ができれば、私のやりたいことは実現できると思います。 ただ、リアルタイムでの描画を行いたいので、touchesMoved()内で処理できることが理想です。
退会済みユーザー

退会済みユーザー

2018/02/13 06:11

余計なことかもしれませんが、使えるかは置いといて変換はぐぐると出てきますよ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問