下記コードの様にCGAffineTransformのrotatedを使用してLabelを回転させるとframe値が予期しない動きをしてしまって困っています。
入力した角度で回転だけしてくれればいいのですが、特定の角度ではframe値がかなりズレたり、Labelが画面から消失したりします。
角度だけ変更するにはどのようにしたらよろしいでしょうか。
CGTranceFormクラスを見たりアフィン変換についても調べてみたのですが、frame値が変わってしまう理由は分かりませんでした。
よろしくおねがします。
環境
Xcode11
Swift5
###print(highlightLabel.frame)の出力結果例
x:100,
y:100,
width:100,
height:100
angleを60としたときの出力結果
(81.69872981077806, 81.69872981077806, 136.6025403784439, 136.6025403784439)
###コード
swift
1 2class ViewController: UIViewController { 3 //Labelの動きを確かめるためのコードなのでヌルチェックは行っていません。 4 @IBOutlet weak var highlightLabel: UILabel! 5 6 @IBOutlet weak var xField: UITextField! 7 @IBOutlet weak var yField: UITextField! 8 @IBOutlet weak var wField: UITextField! 9 @IBOutlet weak var hField: UITextField! 10 @IBOutlet weak var angleField: UITextField! 11 @IBOutlet weak var frameValue: UILabel! 12 13 14 override func viewDidLoad() { 15 super.viewDidLoad() 16 17 } 18 //ラベルを動かす 19 @IBAction func moveLabel(_ sender: Any) { 20 21 let x:Int! = Int(xField.text!) 22 let y:Int! = Int(yField.text!) 23 let w:Int! = Int(wField.text!) 24 let h:Int! = Int(hField.text!) 25 let rotateAngle:Int! = Int(angleField.text!) 26 27 self.highlightLabel.frame = CGRectMake(CGFloat(x), CGFloat(y), CGFloat(w), CGFloat(h)) 28 29 //transRotateメソッドに値を渡す 30 transRotate(disignatedAngle: CGFloat(rotateAngle)) 31 32 print(self.highlightLabel.frame) 33 34 } 35 36 @IBAction func printFrame(_ sender: Any) { 37 38 print(self.highlightLabel.frame) 39 } 40 41 42 func transRotate(disignatedAngle:CGFloat){ 43 let angle = disignatedAngle * CGFloat.pi / 180 44 let transRotate = CGAffineTransform(rotationAngle: CGFloat(angle)); 45 self.highlightLabel.transform = transRotate 46 } 47 48 func CGRectMake(_ x: CGFloat, _ y: CGFloat, _ width: CGFloat, _ height: CGFloat) -> CGRect { 49 return CGRect(x: x, y: y, width: width, height: height) 50 } 51 52 53 54} 55
frame について詳しいわけではありませんが、公式ドキュメントを見ると
Warning
If the transform property is not the identity transform, the value of this property is undefined and therefore should be ignored.
とありますから、transform を使ってアフィン変換を行うと、もはや frame の値は正しく設定されないと読めるようですが、いかがでしょうか(幅、高さについては回転したラベルを囲う矩形の大きさとなるようですが)。
この辺りにも解説があるようです。
https://selection9.blogspot.com/2016/06/uiviewframebounds.html
ご回答ありがとうございます。
ということであれば、frame値を保ったまま回転させる方法を探してからまた別の質問を立てることとします。
回答1件
あなたの回答
tips
プレビュー