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

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

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

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

Xcode

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

Swift

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

Q&A

解決済

1回答

1151閲覧

CGAffineTransformの移動について

AppDvl

総合スコア58

iOS

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

Xcode

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

Swift

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

0グッド

0クリップ

投稿2020/03/22 11:54

#####状況
UIViewを拡大して上下左右に動かすアプリを作っています。
そのなかで拡大ボタンをおして、上ボタンをおすと左斜上に動きます。
真上に動かすにはCGAffineTransformのxyの座標をどのように指定すればよいか教えていただきたいです。
拡大する前、先に上ボタンを動かすと正しく動きます。

#####解決したいこと

問題の箇所はコードの一番下”///上ボタンのアクション”です。
CGAffineTransformは何上の座標を指定すればよいのでしょうか?
座標 y = imageView.frame.origin.y に他の取得方法があるのでしょうか?

よろしくお願いします。

swift

1import UIKit 2 3class ViewController: UIViewController,UIGestureRecognizerDelegate{ 4 5 6 let photoBtn = UIButton() 7 let expBtn = UIButton()//Expansionエクスペンション 8 let reducBtn = UIButton()//Reductionリダクション 9 let cUpBtn = UIButton()//chevronシェブロン 10 let imageView = UIImageView() 11 var width = CGFloat() 12 var height = CGFloat() 13 var safeAreaInsets = UIEdgeInsets() //セーフエリアを取得する 14 var navBarHeight = CGFloat()//ナビゲーションバーの高さ 15 var x = CGFloat()//UIImageのx 16 var y = CGFloat()//UIImageのy 17 18 //セーフエリアの大きさを取得 19 override func viewWillLayoutSubviews() { 20 super.viewWillLayoutSubviews() 21 if #available(iOS 11.0, *) { 22 safeAreaInsets = view.safeAreaInsets 23 } 24 } 25 26 override func viewDidLoad() { 27 super.viewDidLoad() 28 self.view.backgroundColor = UIColor.white 29 //MARK:- ボタンの設置 30 width = self.view.bounds.width 31 height = self.view.bounds.height 32 navBarHeight = (self.navigationController?.navigationBar.frame.size.height)! 33 34 ///画像追加ボタンを生成 35 let photoImage = UIImage(named: "Photo")//ボタン画像のインスタンス化 36 photoBtn.setImage(photoImage,for: .normal)//ボタンに画像セット 37 photoBtn.layer.shadowColor = UIColor.black.cgColor 38 photoBtn.layer.shadowOpacity = 0.5 39 photoBtn.layer.shadowRadius = 2.0 40 photoBtn.layer.shadowOffset = CGSize(width: 2, height: 2) 41 photoBtn.layer.masksToBounds = true 42 photoBtn.frame = CGRect(x: 0, y: 0, width: 53, height: 53) 43 photoBtn.center = CGPoint(x: width * 0.9 / 10, y: height-47) 44 photoBtn.addTarget(self, action: #selector(self.photoBtnTapped(sender:)), for: .touchUpInside)//#selectorでメソッドを呼び出す 45 // photoBtn.setTitle("画像",for:.normal) 46 photoBtn.backgroundColor = UIColor.clear 47 self.view.addSubview(photoBtn) 48 49 50 ///拡大ボタンを生成 51 let expImage = UIImage(named: "Expension")//ボタン画像のインスタンス化 52 expBtn.setImage(expImage,for: .normal)//ボタンに画像セット 53 expBtn.layer.shadowColor = UIColor.black.cgColor 54 expBtn.layer.shadowOpacity = 0.5 55 expBtn.layer.shadowRadius = 2.0 56 expBtn.layer.shadowOffset = CGSize(width: 2, height: 2) 57 expBtn.layer.masksToBounds = true 58 59 expBtn.frame = CGRect(x:0,y:0,width:50,height:50) 60 expBtn.center = CGPoint(x:width * 4 / 10,y:height - 50) 61 expBtn.addTarget(self, action: #selector(ViewController.expBtnTapped(sender:)), for: .touchUpInside)//#selectorでメソッドを呼び出す 62 // expBtn.setTitle("拡大ボタン",for:.normal) 63 expBtn.backgroundColor = UIColor.clear 64 self.view.addSubview(expBtn) 65 66 67 68 ///上ボタンを生成 69 70 let cUpBtnImage = (UIImage(systemName: "chevron.up")?.withRenderingMode(.alwaysTemplate))!//.withRenderingMode(.alwaysTemplate)で色を変えるモードを指定 71 cUpBtn.setImage(cUpBtnImage,for: .normal)//ボタンに画像セット 72 cUpBtn.tintColor = .white//白に変換デフォは青 73 cUpBtn.layer.shadowColor = UIColor.black.cgColor 74 cUpBtn.layer.shadowOpacity = 1 75 cUpBtn.layer.shadowRadius = 2.0 76 cUpBtn.layer.shadowOffset = CGSize(width: 2, height: 2) 77 cUpBtn.layer.masksToBounds = true 78 79 cUpBtn.frame = CGRect(x:0,y:0,width:20,height:20) 80 cUpBtn.center = CGPoint(x:50,y:height/10*2+navBarHeight-30) 81 cUpBtn.addTarget(self, action: #selector(ViewController.cUpBtnTapped(sender:)), for: .touchUpInside)//#selectorでメソッドを呼び出す 82 cUpBtn.backgroundColor = UIColor.clear 83 self.view.addSubview(cUpBtn) 84 85 86 } 87 88 //MARK:- 図を描く 89 ///画像追加ボタンのアクション 90 @objc func photoBtnTapped(sender:UIButton){ 91 //@objcを付けられたメソッド、プロパティにはSwiftの実装に加え、Objective-Cで用いられるふたつの隠し引数を持った関数を同時に作成するようになります。このことで@objcを付けたメソッド、プロパティはObective-Cからも正しく利用することができるようになります。 92 93 // カメラロールの呼び出しはシンプル。let picker = UIImagePickerController() と present(picker, animated: true) 94 let picker = UIImagePickerController() 95 //写真選択・キャンセルはカメラロール側の処理。てことで「カメラロールで写真を選んだよ!」という情報をカメラロール側から通知するために、デリゲートをしておく。 96 picker.delegate = self 97 present(picker, animated: true) 98 99 100 } 101 102 103 ///拡大ボタンアクション 104 @objc func expBtnTapped(sender:UIButton){ 105 print("expBtnTapped") 106 print(imageView.transform.a) 107 108 switch imageView.transform.a {//拡大 109 case 1.0: 110 imageView.transform = CGAffineTransform(scaleX: 1.25, y: 1.25) 111 print("x(x),y(y)") 112 case 1.25: 113 imageView.transform = CGAffineTransform(scaleX: 1.50, y: 1.5) 114 print("x(x),y(y)") 115 case 1.5: 116 imageView.transform = CGAffineTransform(scaleX: 1.75, y: 1.75) 117 print("x(x),y(y)") 118 case 1.75: 119 imageView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0) 120 print("x(x),y(y)") 121 case 2.0: 122 imageView.transform = CGAffineTransform(scaleX: 2.0, y: 2.0) 123 print("x(x),y(y)") 124 default: 125 print("2以外") 126 } 127 } 128 129 ///上ボタンのアクション 130 @objc func cUpBtnTapped(sender:UIButton){ 131 print("cUpBtnTapped") 132 x = imageView.frame.origin.x//現在の座標 133 y = imageView.frame.origin.y 134 let a = imageView.transform.a//現在の拡大率 135 y = y - 50// ー50しておく 136 let tran1 = CGAffineTransform(translationX: x, y: y)//移動 137 let tran2 = CGAffineTransform(scaleX: a, y: a)//拡大り率 138 let tran3 = tran2.concatenating(tran1) //CGAffineTransformの組合せ 139 imageView.transform = tran3 140 } 141 142 } 143 144

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

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

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

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

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

guest

回答1

0

ベストアンサー

x = imageView.frame.origin.x//現在の座標

y = imageView.frame.origin.y

これは
imageView.transform.tx
imageView.transform.ty
を使ったほうが良さそうかなと思いました。

投稿2020/03/23 04:41

takabosoft

総合スコア8356

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

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

AppDvl

2020/03/23 09:44

takabosoftさん .txは原点0として0からどれだけ移動する距離を指定するのですね。 コレがしたかったです。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問