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

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

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

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

Q&A

解決済

1回答

2888閲覧

swiftで画面遷移後にself.viewの位置が画面からずれる

退会済みユーザー

退会済みユーザー

総合スコア0

Swift

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

0グッド

0クリップ

投稿2018/09/07 07:22

編集2018/09/07 08:10

tvOSでアプリを作っています。
画面A⇢B⇢Aと遷移すると、画面Aのself.viewの位置がスクリーンショットのようにずれて表示されてしまいます。
(初回起動時の画面Aの表示はずれません。)

確認のためself.view.backgroundColorに色を付けているので、それも表示されていないということは画面に対してself.view自体がずれてしまっているのだと思います。
画面AのviewWillAppearself.view.frame.origin.xself.view.frame.origin.yを確認できるよう仕込んだのですが、画面遷移前後ともに0.0でした。

self.view以外に、画面AにあるUIViewを調べましたが、正しい位置の座標が返ってきています。
ちなみに、画面AはUIViewControllerで、ソースは以下のとおりです。

class ViewController: UIViewController { var baseView: UIView = UIView()! var containerView1: UIView! = UIView()! var containerView2: UIView! = UIView()! override func viewDidLoad() { super.viewDidLoad() self.view.translatesAutoresizingMaskIntoConstraints = false self.baseView.translatesAutoresizingMaskIntoConstraints = false self.containerView1.translatesAutoresizingMaskIntoConstraints = false self.containerView2.translatesAutoresizingMaskIntoConstraints = false self.view.addSubview(self.bgView) self.bgView.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true self.bgView.leftAnchor.constraint(equalTo: self.view.leftAnchor).isActive = true self.bgView.widthAnchor.constraint(equalTo: self.view.widthAnchor).isActive = true self.bgView.heightAnchor.constraint(equalTo: self.view.heightAnchor).isActive = true self.baseView.addSubview(self.containerView1) self.containerView1.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true self.containerView1.leftAnchor.constraint(equalTo: self.baseView.leftAnchor).isActive = true self.containerView1.widthAnchor.constraint(equalToConstant: 500.0).isActive = true self.containerView1.heightAnchor.constraint(equalTo: self.baseView.heightAnchor).isActive = true self.baseView.addSubview(self.containerView2) self.containerView2.topAnchor.constraint(equalTo: self.view.topAnchor).isActive = true self.containerView2.leftAnchor.constraint(equalTo: self.baseView.leftAnchor, constant: 500.0).isActive = true self.containerView2.widthAnchor.constraint(equalToConstant: 1000.0).isActive = true self.containerView2.heightAnchor.constraint(equalTo: self.baseView.heightAnchor).isActive = true let asset = AVAsset(url: URL(string: "http://xxxxxxx.m3u8") let playerItem = AVPlayerItem(asset: asset) let player = AVPlayer(playerItem: playerItem) player.play() let movieLayer = AVPlayerLayer(player: player) moviewLayer.frame = view.bounes moviewLayer.videoGravity = .resizeAspectFill movieLayer.zPosition = -1 view.layer.insertSublayer(self.movieLayer, at: 0) } }

正しい位置のスクリーンショット
正しい状態のスクリーンショット

ずれた位置のスクリーンショット
ずれたスクリーンショット

##追記
画面A⇢画面B⇢A①⇢B⇢A②
のように画面遷移を行ったとき、①のタイミングと②のタイミングで座標の値が異なることがわかりました。
②以降、B⇢Aと何回遷移を繰り返しても②と同じ座標が返ってきます。

// ①のときの各Viewの座標 self.view.frame (0.0, 0.0, 1920.0, 1080.0) self.view.bounds (0.0, 0.0, 1920.0, 1080.0) self.view.layer.frame (0.0, 0.0, 1920.0, 1080.0) self.view.layer.bounds (0.0, 0.0, 1920.0, 1080.0) self.baseView.frame (0.0, 0.0, 1920.0, 1080.0) self.baseView.bounds (0.0, 0.0, 1920.0, 1080.0) self.ContainerView1.frame (0.0, 0.0, 500.0, 1080.0) self.ContainerView1.bounds (0.0, 0.0, 500.0, 1080.0) self.ContainerView2.frame (500.0, 0.0, 1000.0, 1080.0) self.ContainerView2.bounds (0.0, 0.0, 1000.0, 1080.0) // ②のときの各Viewの座標 self.view.frame (-265.0, -162.0, 1920.0, 1080.0) self.view.bounds (0.0, 0.0, 1920.0, 1080.0) self.view.layer.frame (-265.0, -162.0, 1920.0, 1080.0) self.view.layer.bounds (0.0, 0.0, 1920.0, 1080.0) self.baseView.frame (0.0, 0.0, 1920.0, 1080.0) self.baseView.bounds (0.0, 0.0, 1920.0, 1080.0) self.ContainerView1.frame (0.0, 0.0, 500.0, 1080.0) self.ContainerView1.bounds (0.0, 0.0, 500.0, 1080.0) self.ContainerView2.frame (500.0, 0.0, 1000.0, 1080.0) self.ContainerView2.bounds (0.0, 0.0, 1000.0, 1080.0)

なぜこのようなことが起こってしまうのか、どう解決策を探したら良いのか検討もつきません。
〜の設定が悪いのではないか、〜がおかしいのではないか、など、何かアタリがつく方いましたら教えてください。

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

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

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

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

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

fuzzball

2018/09/07 07:28

ズレてないときのSSを載せて下さい。
fuzzball

2018/09/07 07:30

self.viewに乗っている他のviewの座標も調べて下さい。
fuzzball

2018/09/07 07:44 編集

調べた座標などの情報は、そのまま書いて下さい。「正しい位置の座標が返ってきています」なんて情報は何の役にも立ちません。また、座標はframeとboundsの両方を調べて下さい。あと、Viewを構成するためのコードを全て書いて下さい。
fuzzball

2018/09/07 08:18

self.view.translatesAutoresizingMaskIntoConstraints = false をコメントアウトするとどうなりますか?
退会済みユーザー

退会済みユーザー

2018/09/07 08:22

ありがとうございます。self.view.translatesAutoresizingMaskIntoConstraints = falseをコメントアウトしたら直りました!もともとこの記載なしに動かした際にautolayout系のエラーが出たことがあり、view系には一律falseを指定していました。
fuzzball

2018/09/07 08:29

自己解決にしてcloseしておいて下さい。
guest

回答1

0

ベストアンサー

self.view.translatesAutoresizingMaskIntoConstraints = false
をかけていたことが原因でした。
上記記載を削除したら直りました。

投稿2018/09/07 08:38

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問