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

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

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

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

Q&A

解決済

1回答

939閲覧

画面向き変更後にオブジェクト位置を再編成するとレイアウトが崩れる

koala2

総合スコア24

Swift

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

0グッド

0クリップ

投稿2019/01/16 01:42

・実現したいこと
画面A(画面向き:横)からボタンを押してカメラモードに移行(この時画面向き:縦に変更)。その後カメラモードから画面Aに戻る際に画面の向き:横に戻してオブジェクトの位置を再編成させる関数を通す。
※画面Aは縦画面と横画面でレイアウトが違うものになっているため画面向き変更があるたび逐一オブジェクト位置を再編成する必要があります。

・結果
カメラ→画面Aに戻る際に画面向きは変更できているのですが、オブジェクトが指定の場所に配置されません。デバッグで値をひとつひとつ確認したところ所定の座標の値がとれているはずなのですが、実際には画面上の違う場所に配置されてしまいます。

原因?
画面の向き変更をviewWillAppear内で以下のコードで行なっています。
UIDevice.current.setValue(value, forKey: "orientation")

・画面向きを変更するコード
・画面向きを変更する場所

などが原因なのかと思っていますがなかなかうまくいきません。

ご回答お待ちしております。。。

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

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

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

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

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

fuzzball

2019/01/16 01:47

なにか参考にされた記事はありますか? viewWillAppearで回転処理を行ったり、強制的に回転させたり、やり方がかなり古いように感じるのですが。
takabosoft

2019/01/16 01:52

「カメラモード」というのは画面Aとは別のViewControllerなんでしょうかね?
koala2

2019/01/16 02:05

fuzzball様 viewWillAppear内に書くということについては以下の記事を参考にさせていただきました。 https://teratail.com/questions/47254 最近Swiftでの開発を始めたものでどれが最新の方法なのかわからず日々右往左往しております。
koala2

2019/01/16 02:05

takabosoft様 その通りです。
takabosoft

2019/01/16 02:16

「※画面Aは縦画面と横画面でレイアウトが違うものになっているため画面向き変更があるたび逐一オブジェクト位置を再編成する必要があります。」というのは、どのトリガーで実行されているのでしょうか?また、AutoLayoutは使っていますか?
fuzzball

2019/01/16 02:19

リンク先の質問には画面回転については触れてないですね。 回転については一度調べてみた方がいいと思います。(複数の新しめの情報に当たって下さい) あと、強制回転はどこかでハマりますよ。やらずに済むならやらない方がいいです。(裏技だと思っておいたほうがいいです)
koala2

2019/01/16 02:28

takabosoft様 オブジェクト位置再編成はviewDidLoad、supportedInterfaceOrientationsの2箇所で実行するようにしています。AutoLayoutについてはView内部に入れているオブジェクトには使用していますが、オブジェクト位置再編成の関数で実際に移動するオブジェクトに関してはAutoLayoutは使用していません。
koala2

2019/01/16 02:34

fuzzball様 回転についてはもう一度調べてみようと思います。 カメラモードをLandscapeのままで実行すると実際にカメラを上にあげると画面上では左に移動したりするのでどうしてもPortraitに変更する必要があると思い、回転処理を施したのですが、何か良い方法はあったりしないでしょうか・・・
koala2

2019/01/16 02:38

takabosoft様 ごめんなさい間違えてました。 AutoLayoutじゃなくてAutoResizeの間違いです。 AutoLayoutは一切使っていません。
guest

回答1

0

ベストアンサー

オブジェクト位置再編成はviewDidLoad、supportedInterfaceOrientationsの2箇所で実行するようにしています。

これはちょっと良くないです。

supportedInterfaceOrientationsは「お前の対応している画面の向きを教えろ」と聞いてきているだけなので、そこでレイアウトをしてはいけません。

「オブジェクト位置再編成」とやらはviewDidLayoutSubviewsで一回書けばたぶん満たせると思います。

参考:iOSでの各回転検知方法とその結果
https://qiita.com/www51k/items/7be9abff8f6efea5748e

投稿2019/01/16 02:39

takabosoft

総合スコア8356

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

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

koala2

2019/01/16 02:59

viewDidLayoutSubviews に1箇所書くだけで要件を満たすことができました。 また viewDidLayoutSubviews 内に書くことによって原因は不明ですがレイアウトが崩れる問題も解消されました。 https://qiita.com/motokiee/items/0ca628b4cc74c8c5599d 上記の記事を見てみるとレイアウト開始処理の前にオブジェクト位置を動かす処理をしたのが問題だったのかな・・・ 兎にも角にも問題は解決することができ大変助かりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問