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

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

ただいまの
回答率

89.98%

scrollviewの中にtextviewとimageviewを並べる

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,370

meia

score 24

前提・実現したいこと

swift3.0
xcode8.21 で作業しています

スクロールビューの中にテキストビューとイメージビューを何個か並べて、スクロールビューをその2つの大きさによって、スクロールできるようにするのが目標です

テキストビューの高さはviewcontrollerで指定した内容によって、変化するようにしていて、イメージビューをそのテキストビューのから一定距離のところに配置したいです

できればAutolayoutで編集する方法を知りたいのですが、自分で調べてみて今はコードで動かす方法しかないのかなー、と考えています

イメージ説明

該当のソースコード

    override func viewDidLoad() {
        imgview.translatesAutoresizingMaskIntoConstraints = false
    }

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

//      ここもいつか可変長にしたいです
        myscroll.contentSize.height = 1000

// テキストビューの大きさを文字の量に合わせる
        testtext.sizeToFit()

//        「//」を外すと画像自体が消えてしまいました
//        imgview.removeConstraints(imgview.constraints)

        myscroll.addConstraints([
            NSLayoutConstraint(item: imgview,
                               attribute: NSLayoutAttribute.top,
                               relatedBy: NSLayoutRelation.equal,
                               toItem: testtext,
                               attribute: NSLayoutAttribute.bottom,
                               multiplier: 1.0,
                               constant:5
            )
            ])

    }

試したこと

上記の方法とは別にこのリンク先の内容も試したのですが、テキストビューごと消えました。。。
参考先2

補足情報(言語/FW/ツール等のバージョンなど)

ちなみにこのままだとautolayoutに従って、テキストにかぶって画像が表示されています

もし足りない情報があれば、教えていただけたら助かります
よろしくお願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+3

テキストビューの高さはviewcontrollerで指定した内容によって、変化するようにしていて、イメージビューをそのテキストビューのから一定距離のところに配置したいです

2オブジェクト間の距離は一定にということであれば、
imageview上からTexttest上へcontrolキーを押しながらドラッグすると、どのプロパティに対してconstraintを張るかを指定できますが、いかがでしょう。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/28 20:17

    回答ありがとうございます!こんな便利な方法があるとは知りませんでした!

    おっしゃっていただた通りに試してみたのですが、画像の位置は移動したのですが、やはりテキストビューにイメージビューがかぶってしまいました…

    testtext.sizeToFit()がviewDidLayoutSubviews()にあるのが原因かと思って、viewWillAppearの方に入れてみたのですが、そうすると今度はテキストビューが小さいままになってしまいました

    続けて質問して申し訳ないのですが、何かいい方法はありますでしょうか?

    キャンセル

  • 2016/12/28 21:16

    imageviewはTesttextのどのプロパティに対してconstraintを付けましたでしょうか。
    あとは予想になりますが、
    記述したconstraintに関するコードを消してMyscroll>Viewに対してTesttextのconstraintをつけなおしてみるとどうなるかあたりでしょうか。

    http://blog.asobicocoro.com/entry/2016/07/01/000419

    キャンセル

  • 2016/12/28 22:11

    vertical spacingというものを使いました!

    myscroll.addconstraints〜コードを消してみても相変わらずですね…
    autolayoutの使い方が悪いんでしょうか…

    キャンセル

checkベストアンサー

+1

スクロールビューはあまり関係ない話ですね。
動的に変化するけど初期状態をストボーで設計したいというのであれば、制約をコードとアウトレット接続するのが良いと思います。その際、TextViewのHeightの変更であればframeプロパティを操作するのでなく、高さの制約を操作するようにすれば下の部品もマージンを維持しつつ移動します。

buttonを押すとテキストビューの高さが変わり、伴ってラベルが動くサンプルです。画像の用意が面倒なのでラベルでやってます。ラベルのY座標をTextViewに依存するようにPinで上マージンを設定してください。
イメージ説明

 追記

sizeToFit()で高さを取る場合はこうなります

        textView.text = 内容
        textView.sizeToFit()
        textViewHeightConstraint.constant = textView.frame.height

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/29 20:55

    詳しく教えていただいてありがとうございます!

    kensiiさんの方法だけでできなかったのは、constraintsの競合?もあったせいみたいです。
    お2人のおかげで、思い描いていたものと同じようにできました!

    キャンセル

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

  • ただいまの回答率 89.98%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる