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)
}
ご意見をお聞かせください。ありがとうございました。
frame
よりも小さくなるように、UIScrollView
のcontentsize
を設定する必要があります。そうしないと、スクロールしません。
また、viewDidLoad
メソッドにscroller.contentSize = CGSizeMake(400, 2300)
を追加することをお勧めします。
多くの場合、チュートリアルに従っていればコードは正しいですが、多くの初心者が知らないのは、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)
}
このコードは、上で言ったことをすれば完璧に機能します。
Swift 3.0バージョン
scroller.contentSize = CGSize(width: scroller.contentSize.width, height: 2000)
AutoLayoutを使用する場合、
コンテンツサイズをviewdidAppearに設定してください。
func viewDidAppear(_ animated:Bool){
scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height+300)
}
スクロールビューの高さを固定せず、常に最初のサブビューの上部をスクロールビューに、最後のサブビューの下部をスクロールビューに設定します。これにより、スクロールビューは、含まれるサブビューのサイズに応じて自動的に拡大します。 scrollViewにcontentSizeを指定する必要はありません。小さいサイズのiPhoneでも大きいサイズのiPhoneでも機能します。
Autolayoutを使用している場合、contentSizeプロパティは機能を停止し、制約からコンテンツサイズを推測しようとします。その場合、問題は、スクロールビューがコンテンツサイズを推測できるように、コンテンツビューに必要な制約を定義していないことです。コンテンツビューの制約をスクロールビューの上端と下端に定義する必要があります。
私はそれが良い解決策だとは知りませんが、headerviewを空のUITableViewに設定してみてください。
let scrollView: UIView = UIView(frame: CGRectMake(0, 0, 400, 2300))
tableView.tableHeaderView = scrollView
問題は、上記のようにscrollViewがcontentSizeを知らないことですが、修正は上記の答えよりも簡単です。 Carlos のように言ったが、さらに詳しく説明する。 scrollViewを垂直方向(上下)にスクロールする場合は、scrollViewの階層にあるcontentViewをViewControllerと同じ幅にし、プロジェクトで機能する高さ制限(700)を指定します。高さをViewControllerと等しくし、幅をプロジェクトで機能する大きな数値にします。
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、しかしここではわかりやすくなっています)は、自動レイアウト仕様に基づいています。
コードは完全に健全であるため、ビューは2つの理由で下に移動していないように見える場合があります。
2番目の理由は、ビューがスクロールしていないと言うには十分ではありませんが、スクロールインジケーターが表示されない場合は、実際にはビューがスクロールしてもビューがスクロールしないと考えるかもしれません。
ストーリーボードで制約が設定されていない場合、特にストーリーボードのView Controllerのサイズが「Any」に設定されている場合に発生する最初の理由。スクロールビューは、シミュレートされたデバイスまたは実際のデバイスの画面よりも広くなるため、スクロールインジケーターは表示画面の外側になります。
私の場合、UIScrollView内でUIStackViewを使用しました。
コードからのview-elementsをstackviewに追加しました。スクロールしません。
StackviewのuserInteractionEnabled
をfalse
に設定することで修正しました。
これには問題があり、解決するまで答えを見つけることができませんでした。通常のビュー内にスクロールビューがあり、「ビュー」を「スクロールビュー」に置き換えるとすぐに正常にスクロールしました。誰かがそれにつまずくように包んでください。
私は非常に経験が浅いので、それが機能を停止するのかどうかはわかりませんが、それは私の解決策のように見えました。それが誰かを助けることを願っています。