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

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

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

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

Swift

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

解決済

StackView内の部品の座標が(0,0)になる。

tafuzz
tafuzz

総合スコア0

Xcode

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

Swift

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

1回答

0評価

0クリップ

1087閲覧

投稿2019/12/26 07:12

ストーリーボードでsafe areascrollViewを配置し、その中にstackViewを配置しています。
そして以下のコード(一部抜き出し)で、ストーリーボードで配置したaddButtonをタップされたらstackViewtextFielddeleteButtonが追加されるようにしました。

TextFieldの編集が開始されたタイミングで、編集を開始したtextFieldの座標を取得したいと考えています。
しかし、print(textField.frame)で確認したところ、Y座標が0になってしまいます。

stackViewに対する座標を取得したいのですが、どのように書けば良いでしょうか?

=====
例えば、addButtonで追加された1つ目のtextFieldのY座標は32、2つ目のtextFieldのY座標は80のような数値を取得したいです。
(textFieldの高さが32、stackViewのスペースが16です。)
=====

import UIKit class ViewController: UIViewController, UIScrollViewDelegate { @IBOutlet weak var scrollView: UIScrollView! @IBOutlet weak var stackView: UIStackView! var userPath:String! let fileManager = FileManager() var appDelegate:AppDelegate = UIApplication.shared.delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() scrollView.delegate = self scrollView.bounces = false // TextFieldの処理 configureTextField() configureTapGesture() scrollView.addSubview(stackView) } override func viewDidAppear(_ animated: Bool) { let rect = stackView.frame scrollView.contentSize = CGSize(width: rect.size.width, height: rect.size.height + 112) } //---------------- @IBAction func addButton(_ sender: Any) { createTextField(id:Id ,text: "") } //---------------- //TextFieldを生成 func createTextField(id: Int, text: String) { let newView = StackViewCell() newView.heightAnchor.constraint(equalToConstant: 32).isActive = true newView.translatesAutoresizingMaskIntoConstraints = false newView.textField.delegate = self newView.textField.text = text stackView.addArrangedSubview(newView) let rect = stackView.frame scrollView.contentSize = CGSize(width: rect.size.width, height: rect.size.height + 112) } @objc func handleTap() { view.endEditing(true) print("handleTap") } private func configureTapGesture() { let tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.handleTap)) view.addGestureRecognizer(tapGesture) } private func configureTextField() { } } extension ViewController: UITextFieldDelegate { func textFieldShouldReturn(_ textField: UITextField) -> Bool { textField.resignFirstResponder() return true } func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { print("Start") print(scrollView.frame) // -> (58.0, 184.0, 298.0, 662.0) print(textField.frame) // -> (0.0, 1.0, 250.0, 30.0) return true } func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { print("end") return true } } class StackViewCell: UIView { let textField = UITextField() let deleteButton = UIButton() init() { super.init(frame: CGRect()) // 削除ボタン deleteButton.setImage(UIImage(named: "マイナス(削除)ボタン"), for: .normal) deleteButton.addTarget(self, action: #selector(tapDeleteButton(_:)), for: .touchUpInside) addSubview(deleteButton) deleteButton.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true deleteButton.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true deleteButton.heightAnchor.constraint(equalTo: heightAnchor).isActive = true deleteButton.widthAnchor.constraint(equalTo: heightAnchor).isActive = true deleteButton.translatesAutoresizingMaskIntoConstraints = false // textField textField.clearButtonMode = UITextField.ViewMode.always textField.backgroundColor = UIColor.white textField.borderStyle = .roundedRect addSubview(textField) textField.centerYAnchor.constraint(equalTo: centerYAnchor).isActive = true textField.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 0.0).isActive = true textField.widthAnchor.constraint(equalTo: widthAnchor, constant: -48 ).isActive = true textField.translatesAutoresizingMaskIntoConstraints = false } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } @objc func tapDeleteButton(_ sender: UIButton) { // superview(StackView)から自身を削除 removeFromSuperview() } }

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Xcode

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

Swift

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