国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > iOS > 正文

iOS ScrollView實現自動布局的方法(適用Swift 3.0 )

2020-07-26 02:34:16
字體:
來源:轉載
供稿:網友

前言

眾所周知我們大家在開發中,可能會有一些頁面顯示的元素很多,可能會超出一個屏幕,但也不適合用 TableView 或者 CollectionView,此時我們一般會用 ScrollView,那么就會出現自動布局的問題。下面話不多說了,來一起看看詳細的介紹吧。

實現方式

純代碼

  • 特點編碼繁瑣:需要手寫控件
  • 安全:只要正確地設置約束或者 frame、contentSize,一般不會出現滾動問題

示例

lazy var scrollView: UIScrollView = { let obj = UIScrollView(frame: CGRect(x: 0, y: 0, width: .screenW, height: self.screenH)) return obj}()override func viewDidLoad() { super.viewDidLoad() view.addSubview(scrollView) let subViewH: CGFloat = 400 let topView = UIView(frame: CGRect(x: 0, y: 0, width: enW, height: subViewH)) topView.backgroundColor = UIColor.red scrollView.addSubview(topView) let bottomView = UIView(frame: CGRect(x: 0, y: subViewH, h: screenW, height: subViewH)) bottomView.backgroundColor = UIColor.purple scrollView.addSubview(bottomView) scrollView.contentSize = CGSize(width: screenW, height: iewH * 2)}

效果圖

scrollview_純代碼實現.gif

Storyboard + 內部View

特點

  • 搭建界面簡單
  • 直觀
  • 需要占位視圖

頁面結構如圖

Scrollview_SB_InnerView.png

可能出現的問題

  • ScrollView 中直接添加子元素,報錯:Has ambiguous scrollable content height
  • ScrollView 內容超出屏幕仍不能滾動

Scrollview_layout_error.png

實現滾動的代碼

override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let statusBarH: CGFloat = 20 // 如果沒有導航欄,就返回狀態欄的高度 let navH = gationController?.navigationBar.frame.maxY ?? statusBarH let deltaH = (screenH - navH) - bottomView.frame.maxY placeholderViewBottomConstraint.constant = deltaH}

效果圖

Scrollview_SB+InnerView.gif

Storyboard + 外部View

特點

  • 搭建界面簡單
  • 直觀
  • 不需要占位視圖,不需要對 ScrollView 的布局做特殊處理
  • 需要處理外部視圖的 frame(如果沒有用戶交互,可以忽略)

頁面結構如圖

Scrollview_SB+OutterView.png

可能出現的問題

  • ScrollView 中直接添加子元素,報錯:Has ambiguous scrollable content height
  • 當內容超出屏幕高度時,必須得設置 ContainerView 的 frame,否則不能滾動或者超出屏幕部分不接受事件

Scrollview_SB+OutterView_事件問題.png

實現滾動的代碼

override func viewDidLoad() { super.viewDidLoad() scrollView.addSubview(containerView)}override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() var f = containerView.frame f.size.width = screenW // 這句代碼很重要,處理超出屏幕無法響應事件問題 f.size.height = bottomView.frame.maxY containerView.frame = f scrollView.contentSize = CGSize(width: screenW, height: omView.frame.maxY)}

效果圖

Scrollview_SB+OutterView.gif

總結

ScrollView 不能滾動的原因

  • contentSize 小于自身 frame 的尺寸
  • isScrollEnabled 屬性,不過它默認就是 true,默認無需設置
  • ScrollView 或者其父元素無法交互,此時我們需要檢查 isUserInteractionEnabled 屬性是否為 true

ScrollView 一直支持滾動

默認情況下,當 ScrollView 里的元素不足一個屏幕高度時,不能滾動,如需滾動(彈簧效果),需要設置 alwaysBounceVertical 屬性為 true(水平方向亦如此)

關于 ScrollView 布局的選擇

純代碼布局

如果是純代碼布局,只能用方式一。老老實實、一行一行代碼實現布局,雖然代碼繁雜,但是坑少。(現在仍有不少公司是這樣編程的)

界面布局

推薦方式三,這樣 ScrollView 和 其子元素分離,可以簡化很多約束問題,更直觀

以上代碼,適用于 Swift 3.0 語法。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對武林網的支持。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 广灵县| 洞头县| 宁阳县| 西丰县| 巴里| 西盟| 长汀县| 永昌县| 阿图什市| 兴国县| 玉环县| 石渠县| 黄骅市| 鄂托克旗| 肃宁县| 柳江县| 巴中市| 黄石市| 东港市| 苍南县| 高台县| 麻城市| 遵化市| 兴文县| 鞍山市| 礼泉县| 乐业县| 广元市| 陇川县| 于田县| 章丘市| 上高县| 如东县| 丰镇市| 沁源县| 扎囊县| 西贡区| 化隆| 溧水县| 南通市| 迁安市|