座標変換について　swift

ほぼ自分がいまいちわからないので整理のために書いています。
とりあえずその前に一般的なframeとboundの関係

```ViewController.swift

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)

ちなみに現在の表示は…
<img width="414" alt="Simulator Screen Shot 2017.07.02 2.28.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/ca29e3f6-73fc-8e59-9bb4-658a3d76e9bf.png">

ちなみによく私たちが知りたいのはsuperView(親Viewの位置からの気がします。)

```ViewController.swift
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になればいいので…

:sun_with_face:次に本当にこの書き方でおかしくならないか試して見ます。:sun_with_face:
※frameと同じ座標にしたいので先ほどと同じ書き方をします。

```ViewController.swift
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()
        
    }
}

```
ちなみに現在の表示は…
<img width="414" alt="Simulator Screen Shot 2017.07.02 2.48.48.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/9360475b-678d-728f-8765-2726e7b5ea92.png">


結果は……
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ずつしか離れていないのでそうなれば大丈夫です。

しかし…


```ViewController.swift
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は

```ViewController.swift
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)

意図したものが取れています。

<font color="red">ここからみると変換したいものは最初の引数に
変換したいものは何から変換したいかは第二引数に
何から変換したいものの前のviewをconvert前にかく?</font>

それも踏まえて色々かくと、

```ViewController.swift
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) //<font color="red">意図した値が取れています。</font>

<font color="blue">よって第二引数の直近にあるiewをconvert前にかくと意図した値が取れるみたいです。</font>

ちなみに現在の表示は(わかりやすいように間の距離を書いてみました。)…
<img width="337" alt="スクリーンショット 2017-07-02 3.57.05.png" src="https://qiita-image-store.s3.amazonaws.com/0/133940/e8f5a32f-b0fe-c3f7-438d-21a95478a333.png">

とりあえず、試して見よう、結果をみて見ようなやり方なので、考え方がいいかわわかりませんが、とりあえず、表示的なものを残しときたかったので書いてみました。

ちなみにこんなやりかたでなくもっとしっかり書かれているURL乗せておきます。

http://qiita.com/edo_m18/items/06e55b60f4d7adb9e0ea

http://qiita.com/glayash/items/25d54ff2c9d91f0b6673

色々頑張らなくっちゃ！！:hatched_chick::fire: