ほぼ自分がいまいちわからないので整理のために書いています。
とりあえずその前に一般的なframeとboundの関係
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 100, y: 100, width:100 , height: 100)
imgView.frame = rec
self.view.addSubview(imgView)
self.view.backgroundColor = UIColor.black
print("superViewからは\(imgView.frame)")
print("自分からは\(imgView.bounds)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
結果は……
superViewからは(100.0, 100.0, 100.0, 100.0)
自分からは(0.0, 0.0, 100.0, 100.0)
ちなみによく私たちが知りたいのはsuperView(親Viewの位置からの気がします。)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 100, y: 100, width:100 , height: 100)
imgView.frame = rec
self.view.addSubview(imgView)
self.view.backgroundColor = UIColor.black
print("superViewからは\(imgView.frame)")
print("自分からは\(imgView.bounds)")
let conversion_view = self.view.convert(imgView.frame, to: self.view)
print("変換後\(conversion_view)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
結果は……
superViewからは(100.0, 100.0, 100.0, 100.0)
自分からは(0.0, 0.0, 100.0, 100.0)
変換後(100.0, 100.0, 100.0, 100.0)
とりあえず欲しい値は取得できました。変換した座標が一番上のframeになればいいので…
次に本当にこの書き方でおかしくならないか試して見ます。
※frameと同じ座標にしたいので先ほどと同じ書き方をします。
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 100, y: 100, width:100 , height: 100)
imgView.frame = rec
let ViewSample = UIView()
ViewSample.backgroundColor = UIColor.blue
let samplerec = CGRect(x: 50, y: 50, width:300 , height: 300)
ViewSample.frame = samplerec
ViewSample.addSubview(imgView)
self.view.addSubview(ViewSample)
print("imgViewのframe\(imgView.frame)")
print("imgViewのbound\(imgView.bounds)")
print("ViewSampleのframe\(ViewSample.frame)")
print("ViewSampleのbound\(ViewSample.bounds)")
let conversion_view0 = self.view.convert(imgView.frame, to: self.view)
print("変換後\(conversion_view0)")
let conversion_view1 = self.view.convert(ViewSample.frame, to: self.view)
print("変換後\(conversion_view1)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
結果は……
imgViewのframe(100.0, 100.0, 100.0, 100.0)
imgViewのbound(0.0, 0.0, 100.0, 100.0)
ViewSampleのframe(50.0, 50.0, 300.0, 300.0)
ViewSampleのbound(0.0, 0.0, 300.0, 300.0)
変換後(100.0, 100.0, 100.0, 100.0)
変換後(50.0, 50.0, 300.0, 300.0)
とりあえず欲しい値は取得できました。
この容量で行けば青いviewからみた赤いviewの位置も取得できるか試してみたいと思います。青いviewのX軸y軸共に50ずつしか離れていないのでそうなれば大丈夫です。
しかし…
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 100, y: 100, width:100 , height: 100)
imgView.frame = rec
let ViewSample = UIView()
ViewSample.backgroundColor = UIColor.blue
let samplerec = CGRect(x: 50, y: 50, width:300 , height: 300)
ViewSample.frame = samplerec
ViewSample.addSubview(imgView)
self.view.addSubview(ViewSample)
let conversion_blueView = ViewSample.convert(imgView.frame, to: ViewSample)
print("imgViewをViewSampleから見た時\(conversion_blueView)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
だと結果は
imgViewをViewSampleから見た時(100.0, 100.0, 100.0, 100.0)
になりただのimgViewの座標となってしまいます。
ちなみにできたものは、あとしっかり試したかったのでx軸とy軸を変えました。
codeは
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 100, y: 100, width:100 , height: 100)
imgView.frame = rec
let ViewSample = UIView()
ViewSample.backgroundColor = UIColor.blue
let samplerec = CGRect(x: 56, y: 51, width:300 , height: 300)
ViewSample.frame = samplerec
ViewSample.addSubview(imgView)
self.view.addSubview(ViewSample)
let conversion_blueView = self.view.convert(imgView.frame, to: ViewSample)
print("imgViewをViewSampleから見た時\(conversion_blueView)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
結果は……
imgViewをViewSampleから見た時(44.0, 49.0, 100.0, 100.0)
意図したものが取れています。
ここからみると変換したいものは最初の引数に
変換したいものは何から変換したいかは第二引数に
何から変換したいものの前のviewをconvert前にかく?
それも踏まえて色々かくと、
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.view.backgroundColor = UIColor.black
let imgView = UIImageView()
imgView.backgroundColor = UIColor.red
let rec = CGRect(x: 7, y: 8, width:400 , height: 400)
imgView.frame = rec
let ViewSample0 = UIView()
ViewSample0.backgroundColor = UIColor.blue
let rec1 = CGRect(x: 12, y: 14, width:300 , height: 300)
ViewSample0.frame = rec1
let ViewSample1 = UIView()
ViewSample1.backgroundColor = UIColor.purple
let rec2 = CGRect(x: 30, y: 34, width:200 , height: 200)
ViewSample1.frame = rec2
let ViewSample2 = UIView()
ViewSample2.backgroundColor = UIColor.yellow
let rec3 = CGRect(x: 100, y: 101, width:50 , height: 50)
ViewSample2.frame = rec3
ViewSample1.addSubview(ViewSample2)
ViewSample0.addSubview(ViewSample1)
imgView.addSubview(ViewSample0)
self.view.addSubview(imgView)
let conversion_yellow0 = self.view.convert(ViewSample2.frame, to: ViewSample1)
print("パターン0\(conversion_yellow0)")
let conversion_yellow1 = imgView.convert(ViewSample2.frame, to: ViewSample1)
print("パターン1\(conversion_yellow1)")
let conversion_yellow2 = ViewSample0.convert(ViewSample2.frame, to: ViewSample1)
print("パターン2\(conversion_yellow2)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
結果は……
パターン0(51.0, 45.0, 50.0, 50.0) //x軸が100-30-12-7の値になってます。
パターン1(58.0, 53.0, 50.0, 50.0) //x軸が100-30-12の値になってます。
パターン2(70.0, 67.0, 50.0, 50.0) //意図した値が取れています。
よって第二引数の直近にあるiewをconvert前にかくと意図した値が取れるみたいです。
ちなみに現在の表示は(わかりやすいように間の距離を書いてみました。)…
とりあえず、試して見よう、結果をみて見ようなやり方なので、考え方がいいかわわかりませんが、とりあえず、表示的なものを残しときたかったので書いてみました。
ちなみにこんなやりかたでなくもっとしっかり書かれているURL乗せておきます。
色々頑張らなくっちゃ!!