[英]UIScrollView not scrolling in Swift
我的 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)
}
您需要設置UIScrollView
的frame
,使其小於contentSize
。 否則,它不會滾動。
另外,我建議您將以下內容添加到viewDidLoad
方法中:
scroller.contentSize = CGSize(width: 400, height: 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)
}
只要你按照我上面說的去做,這段代碼就可以正常工作
如果您使用自動版式
在適合我的viewDidAppear 中設置內容大小。
override func viewDidAppear(_ animated: Bool) {
scrollView.contentSize = CGSize(width: UIScreen.main.bounds.width, height: UIScreen.main.bounds.height+300)
}
斯威夫特 3.0 版本
scroller.contentSize = CGSize(width: scroller.contentSize.width, height: 2000)
不要為滾動視圖提供固定高度,並始終將第一個子視圖的頂部設置為滾動視圖,將最后一個子視圖的底部設置為滾動視圖。 通過這種方式,滾動視圖將根據包含的子視圖的大小自動增長。 無需為滾動視圖提供 contentSize。它適用於小型和大型 iPhone。
如果您使用自動布局,則 contentSize 屬性將停止工作,它將嘗試從約束推斷內容大小。 如果是這種情況,那么您的問題可能是您沒有為內容視圖定義必要的約束,以便滾動視圖可以推斷內容大小。 您應該將內容視圖的約束定義為滾動視圖的頂部和底部邊緣。
就我而言,我在 UIScrollView 中使用了 UIStackView。
將代碼中的一些視圖元素添加到 stackview。 它不會滾動。
通過將 stackview 的userInteractionEnabled
設置為false
來修復它。
問題可能是你的 scrollView 不知道它的 contentSize 如上所述,但修復比上面的答案更容易。 就像卡洛斯說的,但我會詳細說明。 如果您希望您的 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,但在這里更容易理解)來自自動布局規范。
如果您使用的是Storyboard
:
UIScrollView
top
、 bottom
、 left
和right
約束heights
和widths
約束Equal Heights Constraint
優先級設置為250
。 對於水平滾動,將Equal Widths Constraint
優先級設置為250
由於您的代碼非常完美,因此視圖可能似乎沒有向下移動有兩個原因。
第二個原因還不足以說你的視圖不是滾動但如果你沒有看到滾動指示器,那么你可能會認為視圖實際上並沒有滾動。
我在故事板中未設置約束時發生的第一個原因,特別是如果故事板中的視圖控制器大小設置為“任何”。 滾動視圖將比模擬或真實設備的屏幕寬,因此滾動指示器將在可見屏幕之外。
我遇到了這個問題,在我解決之前找不到答案。 我在普通視圖中有一個滾動視圖,一旦用“滾動視圖”替換“視圖”,它就滾動得很好。 只是因為任何人絆倒了。
我不確定那是否意味着阻止它工作,因為我很缺乏經驗,但這似乎是我的解決方案。 希望它可以幫助某人。
對於 Swift 5.6 和 iOS 15:
let scrollView = UIScrollView()
scrollView.translatesAutoresizingMaskIntoConstraints = false
let subView: UIView = UILabel()
subView.text = String(repeating: "MMMMMMM ", count: 100)
NSLayoutConstraint.activate([
subView.topAnchor.constraint(equalTo: scrollView.topAnchor),
subView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor),
subView.leftAnchor.constraint(equalTo: scrollView.leftAnchor),
subView.rightAnchor.constraint(equalTo: scrollView.rightAnchor),
// Constrain width so the label text wraps and we scroll vertically.
subView.widthAnchor.constraint(lessThanOrEqualTo: scrollView.widthAnchor),
])
增加內容高度對我有用。
我不知道這是一個很好的解決方案,但您可以嘗試將 headerview 設置為空 UITableView。
let scrollView: UIView = UIView(frame: CGRectMake(0, 0, 400, 2300))
tableView.tableHeaderView = scrollView
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.