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

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

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

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

Swift

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

解決済

【swift】円の中心座標をテキストフィールドに入力すると、その座標に円が再描画されるような挙動を実現したい。

naoharuiwai
naoharuiwai

総合スコア18

iOS

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

Swift

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

1回答

0評価

0クリップ

145閲覧

投稿2018/09/15 19:48

前提・実現したいこと

Swift初心者です。勉強のために、二次元図形(円)を描画し、設置したtextfieldに中心座標を入力してreturnを押すと、その座標を中心として円が再描画されるという簡単なアプリを作っています。

アプリ起動時に円を描画することはできましたが、textfieldに座標を入力してもそれが反映されず、円がアプリ起動時に描画された座標のまま変化しません。
おそらく再描画する処理ができていないせいだと思いますが、どのタイミング・場所で再描画を行えば良いかが分かりません。
どなたか教えていただけるとありがたいです。

発生している問題・エラーメッセージ

設定したtextfieldに新規座標を入力しても、それがviewに反映されない

該当のソースコード

lang

//ViewController.swift import UIKit class ViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // テキスト毎にタグを設定 xText.delegate = self xText.tag = 1 yText.delegate = self yText.tag = 2 self.view.backgroundColor = UIColor.gray // 全体背景をグレーに設定 } @IBOutlet weak var xLabel: UILabel! @IBOutlet weak var ylabel: UILabel! @IBOutlet weak var xText: UITextField! @IBOutlet weak var yText: UITextField! func textFieldShouldReturn(_ textField: UITextField) -> Bool { // キーボードを閉じる textField.resignFirstResponder() let nextView = TestDraw() // インスタンスを生成 // switch文により、xtextに入力した場合とytextに入力した場合を分ける switch textField.tag { case 1: // xTextに入力した値をStringからCGFloatに変換 let xDouble: Double = atof(textField.text) let x: CGFloat = CGFloat(xDouble) // 入力された値をTestDraw.swift内に存在する座標変数へと格納 nextView.x = x break case 2: // 同様のことをyTextについてもやる let yDouble: Double = atof(textField.text) let y:CGFloat = CGFloat(yDouble) nextView.y = y break default: print("エラー") break } return true } }

lang

//TestDraw.swift import UIKit class TestDraw: UIView { /* // Only override draw() if you perform custom drawing. // An empty implementation adversely affects performance during animation. */ // ViewControllerのxtextからの値を格納する変数 var x:CGFloat = 150 // 初期値 // 同じくyTextからの値を格納する変数 var y:CGFloat = 100 // 初期値 override func draw(_ rect: CGRect) { // Drawing code // 円の描画 let circle = UIBezierPath(arcCenter: CGPoint(x: x, y: y), radius: 80, startAngle: CGFloat(Double.pi*2.0*0.0/360.0), endAngle: CGFloat(Double.pi*2.0*360.0/360.0), clockwise: true) let circleColor = UIColor.red circleColor.setStroke() // 線の色を設定 circleColor.setFill() // 内側塗りつぶし色の設定 circle.fill() // 内側塗りつぶし circle.lineWidth = 4 circle.stroke() } }

試したこと

このプログラムでSimulatorを起動してみた画像が以下になります。

イメージ説明

円の中心座標XとYの初期値は、それぞれ150と100に設定していますので、異なる値を入力してみます。

イメージ説明

この状態でキーボードのreturnキーを押しても、変更が円に反映されませんでした。

ViewController.swiftを以下のようにし、returnキー押下時にTestDraw.swiftのxとyが正しく変化しているのか確認してみました。

lang

//ViewController.swift import UIKit class ViewController: UIViewController, UITextFieldDelegate { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // テキスト毎にタグを設定 xText.delegate = self xText.tag = 1 yText.delegate = self yText.tag = 2 self.view.backgroundColor = UIColor.gray // 全体背景をグレーに設定 } @IBOutlet weak var xLabel: UILabel! @IBOutlet weak var ylabel: UILabel! @IBOutlet weak var xText: UITextField! @IBOutlet weak var yText: UITextField! func textFieldShouldReturn(_ textField: UITextField) -> Bool { // キーボードを閉じる textField.resignFirstResponder() let nextView = TestDraw() // インスタンスを生成 // switch文により、xtextに入力した場合とytextに入力した場合を分ける switch textField.tag { case 1: // xTextに入力した値をStringからCGFloatに変換 let xDouble: Double = atof(textField.text) let x: CGFloat = CGFloat(xDouble) // 入力された値をTestDraw.swift内に存在する座標変数へと格納 nextView.x = x print("x = (nextView.x)") // 追加箇所 break case 2: // 同様のことをyTextについてもやる let yDouble: Double = atof(textField.text) let y:CGFloat = CGFloat(yDouble) nextView.y = y print("y = (nextView.y)") // 追加箇所 break default: print("エラー") break } return true } }

それぞれのtextfield内に、以下のように値を入力してみます。

イメージ説明

returnキーを押した後の出力は以下のようになりました。

x = 200.0
y = 150.0

これを見る限り、値はきちんと代入されているのだと思います、、。

補足情報(FW/ツールのバージョンなど)

Swift4.2
Xcode10

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

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

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

iOS

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

Swift

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