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

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

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

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

3回答

761閲覧

画像の表示位置がずれる

meia

総合スコア26

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2017/09/16 09:37

編集2017/09/22 11:48

###前提・実現したいこと

まずは見てくださってありがとうございます。

swift3
xcode8.3.3
を使っています。

StroryBoardでアプリのレイアウトを作成しているのですが、画像を表示する際に画像が文章と被ってしまい、困っています。

①画面下部にあるボタンを押すと正否が表示
②textviewとimageviewの内容が変わる
③次の問題へ行く

という機能を作っています。

しかし、「ときどき」なのですが、画像のようにimageViewがtextviewに被ってしまうことがあります。

###発生している問題・エラーメッセージ

StoryBoard上での表示
StoryBoard上での表示

直接開いた場合
直線開いた時

ボタンで変更した時
ボタンで変更した時

###該当のソースコード

swift

1 2//Viewに文章と画像を入れる 3func setquestion() { 4 5 var imgCount: Int = 0 6 7 dataDetail = self.delegate.dataDetail 8 9 testtext.text = "" 10 11 questionNum = dataDetail[0] + dataDetail[1] + dataDetail[2] 12 13 dataPosition = String(self.delegate.indexRow + 1) + "/" + String(self.delegate.dataList.count) 14 label.title = questionNum + "-" + dataPosition + "問" 15 16 17 for i in 8...19 { 18 if dataDetail[i] != ""{ 19 testtext.text = testtext.text + dataDetail[i] + "\n" 20 } 21 if i == 9{ 22 testtext.text = testtext.text + "\n" 23 } 24 } 25 26 testtext.text = testtext.text.replacingOccurrences(of: " ", with: "\n ") 27 28 imgToatalHeight = 0 29 30 autoreleasepool{ 31 32 for i in 0...4 { 33 if dataDetail[21 + i] != "" { 34 35 let filePath = dataDetail[0] + "/" + dataDetail[0] + dataDetail[1] + "/" + dataDetail[21 + i] 36 let imgPath = Bundle.main.path(forResource: filePath, ofType: "png") 37 let theImage = UIImage(contentsOfFile: imgPath!) 38 ratio = CGFloat((theImage?.size.height)! / (theImage?.size.width)!) 39 40 imgView[i].image = theImage 41 imgView[i].frame = CGRect(x: 0, y: 0, width: imgWidth, height: imgWidth * ratio) 42 imgCount += 1 43 }else{ 44 imgView[i].image = nil 45 imgView[i].frame = CGRect(x: 0, y: 0, width: 0, height: 0) 46 47 } 48 imgHeight[i].constant = imgView[i].frame.height 49 imgToatalHeight = imgToatalHeight + imgView[i].frame.height 50 } 51 52 } 53 54 let imgSpace: Int = 8 * imgCount 55 imgToatalHeight = imgToatalHeight + CGFloat(imgSpace) 56 57 nextButton.setTitleColor(UIColor.black, for: .normal) 58 nextButton.layer.masksToBounds = true 59 nextButton.layer.cornerRadius = 10.0 60 61 if self.delegate.dataList.last != self.delegate.dataList[self.delegate.indexRow]{ 62 nextButton.alpha = 1 63 }else{ 64 nextButton.alpha = 0 65 } 66 67 myscroll.contentOffset = CGPoint(x: 0, y: -myscroll.contentInset.top) 68 if let nv = navigationController { 69 nv.setNavigationBarHidden(false, animated: false) 70 } 71 makeScroll() 72 } 73 74 75 76 77//scrollViewのContentのHeightを決める 78 79 func makeScroll(){ 80 81 testtext.sizeToFit() 82 textheight.constant = testtext.contentSize.height 83 84 let totalheight: CGFloat = testtext.contentSize.height + imgToatalHeight 85 86 myscroll.contentSize.height = totalheight 87 viewheight.constant = totalheight 88} 89 90 91//他に関係がありそうな箇所 92 93override func viewWillAppear(_ animated: Bool) { 94 super.viewWillAppear(true) 95 96 let userdefaults = UserDefaults.standard 97 userdefaults.register(defaults: ["characterSize":"17"]) 98 if let cSize :Int = userdefaults.integer(forKey: "characterSize") as Int?{ 99 let cgSize = CGFloat(cSize) 100 testtext.font = UIFont.boldSystemFont(ofSize: cgSize) 101 102 makeScroll() 103 } 104 } 105 106 107 override func viewDidLayoutSubviews() { 108 super.viewDidLayoutSubviews() 109 110 makeScroll() 111 } 112 113

###試したこと

①この被りは該当する問題を直接開いた時には発生せず、ボタンを押して変更した時のみ起こります。
②特定の並びでは必ず再現され、他の画像や同じ画像を利用する別の問題では起こりませんでした。

状況がかなりわかりにくくなっているのですが、同じような経験をされた方はいらっしゃいませんでしょうか?
もしどなたか原因や修正方法がわかる方がいたら、教えていただきたいです。
足りない情報は追加させていただきますので、指摘をしていただければと思います。

よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

textheightやviewheightが制約へのアウトレットだと仮定しての話ですが、制約を変更した後にlayoutIfNeeded()を呼んでみて下さい。

投稿2017/09/27 01:16

fuzzball

総合スコア16731

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

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

meia

2017/09/30 07:26 編集

いつも回答ありがとうございます! 書いていただいたことをヒントに検索し、 self.view.layoutIfNeeded() や self.view.setNeedsLayout() をmakeScroll()に追加したり、imageViewに対して使ってみたりしたのですが、うまくいきませんでした…
guest

0

最終的な結果だけから見ると、テキスト部分の高さがゼロで計算されているように見えます。
なので、textheight.constant = testtext.contentSize.height のところにブレークポイントを入れて値を見てみてはどうでしょうか。

もし実際にゼロになっていたら、なぜゼロになるのかを追ってみれば良いかと思います。

投稿2017/09/20 14:04

YokemuraTakeshi

総合スコア297

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

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

meia

2017/09/22 11:45

回答ありがとうございます!早速アドバイス通りに試してみました。 heightの値は503で、ずれる場合(ボタンで変化させた時)とずれない場合(直接開いた時)では値の変化がありませんでした… 差があるとすれば、直接開いた時はviewWillAppearで文字の大きさを調節するようにしているので、何回かviewDidLayoutSubviewにあるmakeScroll()が呼ばれて、値が1100くらい→800くらい→503に変化すると言うところくらいでしょうか? 設問に関連するコードを追加させていただきます。もしお時間があったらでいいので、見ていただけると助かります…
guest

0

自己解決

imgView[i].frame = CGRect(x: 0, y: 0, width: imgWidth, height: imgWidth * ratio)

CGRectのxとyの値を変更したところ、画像がずれた場合にその値が反映されていることがわかりました。

そこで姑息的ではあるのですが、画像に合わせてxとyの値を変更することで、ひとまずこの問題を解決することができました。

どういう条件でConstraintsより優先してxとyの値が反映されたのかはわからないままです…
もしどなたかご存知であればご教授いただければと思います。

今回は曖昧な条件下での質問で、すいませんでした。

投稿2017/10/07 01:39

meia

総合スコア26

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問