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

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

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

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

Q&A

解決済

1回答

578閲覧

[Swift]CGAffineTransformのrotatedを使用した際のlabel.frame値が変わってしまう問題の解消方法

ichina

総合スコア6

Swift

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

0グッド

0クリップ

投稿2020/08/01 07:54

下記コードの様に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

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

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

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

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

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

TsukubaDepot

2020/08/02 09:54

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
ichina

2020/08/04 08:02

ご回答ありがとうございます。 ということであれば、frame値を保ったまま回転させる方法を探してからまた別の質問を立てることとします。
guest

回答1

0

自己解決

viewオブジェクトに対してtransformをするとそのviewを囲う矩形のframe値が適用されるためtransformをする場合はcenterやboundsを使う必要があるようです。

投稿2020/08/04 14:50

ichina

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問