web-dev-qa-db-ja.com

Swift-UIScrollViewがスクロールしない

UIScrollViewが下にスクロールしません。理由がわかりません。私はすでにこの問題に関するAppleのドキュメントに従っています。

@IBOutlet weak var scroller: UIScrollView!

    override func viewDidLoad() {
    super.viewDidLoad()

    // Do any additional setup after loading the view.

}

override func viewDidLayoutSubviews() {
    scroller.scrollEnabled = true
    // Do any additional setup after loading the view
    scroller.contentSize = CGSizeMake(400, 2300)
}

ご意見をお聞かせください。ありがとうございました。

31
Mohammad Nurdin

frameよりも小さくなるように、UIScrollViewcontentsizeを設定する必要があります。そうしないと、スクロールしません。

また、viewDidLoadメソッドにscroller.contentSize = CGSizeMake(400, 2300)を追加することをお勧めします。

41
Christian Wörz

多くの場合、チュートリアルに従っていればコードは正しいですが、多くの初心者が知らないのは、scrollViewがシミュレータを正常にスクロールしないことです。マウスパッドを押し下げて同時にスクロールする場合にのみスクロールすることを想定しています。多くの経験のあるXCode/Swift/Obj-Cユーザーはこれに慣れているため、初心者がどのように見落としているのかわかりません。チャオ:-)

@IBOutlet weak var scrollView: UIScrollView!
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(scrollView)
// Do any additional setup after the view
}

override func viewWillLayoutSubviews(){
super.viewWillLayoutSubviews()
scrollView.contentSize = CGSize(width: 375, height: 800)
}

このコードは、上で言ったことをすれば完璧に機能します。

18
flo527

Swift 3.0バージョン

scroller.contentSize = CGSize(width: scroller.contentSize.width, height: 2000)
10
Fangming

AutoLayoutを使用する場合、

コンテンツサイズをviewdidAppearに設定してください。

func viewDidAppear(_ animated:Bool){

    scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height+300)

}
7
satheesh

スクロールビューの高さを固定せず、常に最初のサブビューの上部をスクロールビューに、最後のサブビューの下部をスクロールビューに設定します。これにより、スクロールビューは、含まれるサブビューのサイズに応じて自動的に拡大します。 scrollViewにcontentSizeを指定する必要はありません。小さいサイズのiPhoneでも大きいサイズのiPhoneでも機能します。

5
Sheetal Shinde

Autolayoutを使用している場合、contentSizeプロパティは機能を停止し、制約からコンテンツサイズを推測しようとします。その場合、問題は、スクロールビューがコンテンツサイズを推測できるように、コンテンツビューに必要な制約を定義していないことです。コンテンツビューの制約をスクロールビューの上端と下端に定義する必要があります。

5
Carlos Compean

私はそれが良い解決策だとは知りませんが、headerviewを空のUITableViewに設定してみてください。

let scrollView: UIView = UIView(frame: CGRectMake(0, 0, 400, 2300))

tableView.tableHeaderView = scrollView
2
gellezzz

問題は、上記のようにscrollViewがcontentSizeを知らないことですが、修正は上記の答えよりも簡単です。 Carlos のように言ったが、さらに詳しく説明する。 scrollViewを垂直方向(上下)にスクロールする場合は、scrollViewの階層にあるcontentViewをViewControllerと同じ幅にし、プロジェクトで機能する高さ制限(700)を指定します。高さをViewControllerと等しくし、幅をプロジェクトで機能する大きな数値にします。

1
Jevon Charles

FWIW、私は上からsathishのソリューションを使用する必要があることを発見しましたが、viewDidAppearだけで介入を行うには不十分でした。代わりに、新しいコンテンツの割り当てごとに調整を行う必要がありました。

func display(pattern: Pattern) {
    let text : NSAttributedString = pattern.body()
    patternTextView.attributedText = text

    // Set the size of the view. Autolayout seems to get in the way of
    // a correct size calculation
    patternTextView.contentSize = CGSize(width: 348, height: 620)
}

マニフェスト定数(はい、わかっています、Yuk、しかしここではわかりやすくなっています)は、自動レイアウト仕様に基づいています。

0
Cope

コードは完全に健全であるため、ビューは2つの理由で下に移動していないように見える場合があります。

  • 最初の理由は、スクロールインジケータが表示されないことです
  • 2番目の理由は、表示するビューに何もない

2番目の理由は、ビューがスクロールしていないと言うには十分ではありませんが、スクロールインジケーターが表示されない場合は、実際にはビューがスクロールしてもビューがスクロールしないと考えるかもしれません。

ストーリーボードで制約が設定されていない場合、特にストーリーボードのView Controllerのサイズが「Any」に設定されている場合に発生する最初の理由。スクロールビューは、シミュレートされたデバイスまたは実際のデバイスの画面よりも広くなるため、スクロールインジケーターは表示画面の外側になります。

0
Tokuriku

私の場合、UIScrollView内でUIStackViewを使用しました。

コードからのview-elementsをstackviewに追加しました。スクロールしません。

StackviewのuserInteractionEnabledfalseに設定することで修正しました。

これには問題があり、解決するまで答えを見つけることができませんでした。通常のビュー内にスクロールビューがあり、「ビュー」を「スクロールビュー」に置き換えるとすぐに正常にスクロールしました。誰かがそれにつまずくように包んでください。

私は非常に経験が浅いので、それが機能を停止するのかどうかはわかりませんが、それは私の解決策のように見えました。それが誰かを助けることを願っています。

0
Steve