🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Swift

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

Q&A

解決済

1回答

892閲覧

タップされたButtonが乗っているTableViewCellのインデックスパスを座標から求めたい。

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/11/29 01:35

編集2018/11/29 01:48

いつもお世話になります。

送られてきたUIButtonの座標をtableViewの座標に変換してそこからインデックスパスを取得したいのですが、
tableViewの座標(CGPoint)に変換した際に、xの値が画面外を示してしまいます。どこか設定漏れ等あるのでしょうか?
ボタンが乗っているCellはXIBをレジスタして使用しています。

現状他の方法(open func indexPath(for cell: UITableViewCell) -> IndexPath? )をつかってセルを投げてそこから
インデックスを取得しているのですが、座標から求めたいので、ご存知でしたら教えてください。

class ViewController: UIViewController, UITableViewDataSource, TestDelegate { func printTappedCellIndexPath(tappedBtn: UIButton) { print(tappedBtn) // => frame: = (257.667 60; 60 30) //タップされたボタンの乗っているセルのインデックスパスを取得する let point = tTableView.convert(tappedBtn.center, from: tappedBtn) print(tTableView.frame) //=> (18.666666666666657, 63.99999999999997, 337.6666666666667, 440.3333333333333) print(point) // => point: (545.3333333333334, 285.0) xがやたら大きい // 座標からindexPathを取得する =>ここでnil guard let indexPath = tTableView.indexPathForRow(at: point) else { return } print("### indexPath:", indexPath) } @IBOutlet weak var tTableView: UITableView! var tArray = ["AAA", "BBB", "CCC", "DDD"] override func viewDidLoad() { super.viewDidLoad() let cellNib = UINib.init(nibName: "CustomCell", bundle: Bundle.main) tTableView.register(cellNib, forCellReuseIdentifier: "CCell") } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return tArray.count } func tableView( _ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell( withIdentifier: "CCell", for: indexPath) as! CustomCell cell.TestDelegate = self cell.tLabel.text = tArray[indexPath.row] return cell } } protocol TestDelegate: class { func printTappedCellIndexPath(tappedBtn: UIButton) }

swift

1import UIKit 2 3class CustomCell: UITableViewCell { 4 5 //MARK: - delegate 6 weak var TestDelegate: TestDelegate? 7 8 @IBOutlet weak var tLabel: UILabel! 9 10 override func awakeFromNib() { 11 super.awakeFromNib() 12 // Initialization code 13 } 14 15 override func setSelected(_ selected: Bool, animated: Bool) { 16 super.setSelected(selected, animated: animated) 17 18 // Configure the view for the selected state 19 } 20 21 @IBAction func btnTapped(_ sender: UIButton) { 22 TestDelegate?.printTappedCellIndexPath(tappedBtn: sender) 23 } 24 25 26} 27

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

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

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

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

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

guest

回答1

0

ベストアンサー

let point = tTableView.convert(tappedBtn.center, from: tappedBtn)

let point = tTableView.convert(CGPoint.zero, from: tappedBtn)

で良いかと思います。

tappedBtn.centerという座標はtappedBtn.superviewから見た座標を示します。
tappedBtnからみた座標系の(0,0)をテーブルビューに変換すればよいです。

投稿2018/11/29 01:55

takabosoft

総合スコア8356

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

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

退会済みユーザー

退会済みユーザー

2018/11/29 02:09 編集

ありがとうございます。 tappedBtn.Centerの値を確認して理解できました centerはboundsと基準が同じだと思ってつかってました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問