LoginSignup
11

More than 5 years have passed since last update.

座標変換について swift

Last updated at Posted at 2017-07-01

ほぼ自分がいまいちわからないので整理のために書いています。
とりあえずその前に一般的な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)

ちなみに現在の表示は…
Simulator Screen Shot 2017.07.02 2.28.15.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()

    }
}

ちなみに現在の表示は…
Simulator Screen Shot 2017.07.02 2.48.48.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)

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

ここからみると変換したいものは最初の引数に
変換したいものは何から変換したいかは第二引数に
何から変換したいものの前のviewをconvert前にかく?

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

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) //意図した値が取れています。

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

ちなみに現在の表示は(わかりやすいように間の距離を書いてみました。)…
スクリーンショット 2017-07-02 3.57.05.png

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11