UIViewを再描画させたい。
Swift初心者です。勉強のために、二次元図形(円)を描画し、設置したtextfieldに中心座標を入力してreturnを押すと、その座標を中心として円が再描画されるという簡単なアプリを作っています。
アプリ起動時に円を描画することはできましたが、textfieldに座標を入力してもそれが反映されず、円がアプリ起動時の座標のまま変化しません。
おそらく再描画する処理ができていないせいだと思いますが、どのタイミング・場所で再描画を行えば良いかが分かりません。
どなたか教えていただけるとありがたいです。
以下がコードになります。
//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!
let nextView = TestDraw()
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// キーボードを閉じる
textField.resignFirstResponder()
// 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
nextView.setNeedsDisplay()
break
case 2:
// 同様のことをyTextについてもやる
let yDouble: Double = atof(textField.text)
let y:CGFloat = CGFloat(yDouble)
nextView.y = y
nextView.setNeedsDisplay()
break
default:
print("エラー")
break
}
return true
}
}
//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()
print(x) // ログ
print(y)
}
}
この状態でsimulatorを起動させると、以下の画像のようになります。
中心のX座標の初期値は150にしていますので、textfieldに200を入れreturnを押しても、以下の画像のように円の位置が変わっていません。
TestDraw.swiftのdraw内にログを仕込んでみたところ、setNeedsDisplay()をしてもdrawが呼ばれていませんでした。