iOS ScrollView實(shí)現(xiàn)自動布局的方法(適用Swift 3.0 )
前言
眾所周知我們大家在開發(fā)中,可能會有一些頁面顯示的元素很多,可能會超出一個屏幕,但也不適合用 TableView 或者 CollectionView,此時我們一般會用 ScrollView,那么就會出現(xiàn)自動布局的問題。下面話不多說了,來一起看看詳細(xì)的介紹吧。
實(shí)現(xiàn)方式
純代碼
- 特點(diǎn)編碼繁瑣:需要手寫控件
- 安全:只要正確地設(shè)置約束或者 frame、contentSize,一般不會出現(xiàn)滾動問題
示例
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) }
效果圖
Storyboard + 內(nèi)部View
特點(diǎn)
- 搭建界面簡單
- 直觀
- 需要占位視圖
頁面結(jié)構(gòu)如圖
可能出現(xiàn)的問題
- ScrollView 中直接添加子元素,報錯:Has ambiguous scrollable content height
- ScrollView 內(nèi)容超出屏幕仍不能滾動
實(shí)現(xiàn)滾動的代碼
override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() let statusBarH: CGFloat = 20 // 如果沒有導(dǎo)航欄,就返回狀態(tài)欄的高度 let navH = gationController?.navigationBar.frame.maxY ?? statusBarH let deltaH = (screenH - navH) - bottomView.frame.maxY placeholderViewBottomConstraint.constant = deltaH }
效果圖
Storyboard + 外部View
特點(diǎn)
- 搭建界面簡單
- 直觀
- 不需要占位視圖,不需要對 ScrollView 的布局做特殊處理
- 需要處理外部視圖的 frame(如果沒有用戶交互,可以忽略)
頁面結(jié)構(gòu)如圖
可能出現(xiàn)的問題
- ScrollView 中直接添加子元素,報錯:Has ambiguous scrollable content height
- 當(dāng)內(nèi)容超出屏幕高度時,必須得設(shè)置 ContainerView 的 frame,否則不能滾動或者超出屏幕部分不接受事件
實(shí)現(xiàn)滾動的代碼
override func viewDidLoad() { super.viewDidLoad() scrollView.addSubview(containerView) } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() var f = containerView.frame f.size.width = screenW // 這句代碼很重要,處理超出屏幕無法響應(yīng)事件問題 f.size.height = bottomView.frame.maxY containerView.frame = f scrollView.contentSize = CGSize(width: screenW, height: omView.frame.maxY) }
效果圖
總結(jié)
ScrollView 不能滾動的原因
- contentSize 小于自身 frame 的尺寸
- isScrollEnabled 屬性,不過它默認(rèn)就是 true,默認(rèn)無需設(shè)置
- ScrollView 或者其父元素?zé)o法交互,此時我們需要檢查 isUserInteractionEnabled 屬性是否為 true
ScrollView 一直支持滾動
默認(rèn)情況下,當(dāng) ScrollView 里的元素不足一個屏幕高度時,不能滾動,如需滾動(彈簧效果),需要設(shè)置 alwaysBounceVertical 屬性為 true(水平方向亦如此)
關(guān)于 ScrollView 布局的選擇
純代碼布局
如果是純代碼布局,只能用方式一。老老實(shí)實(shí)、一行一行代碼實(shí)現(xiàn)布局,雖然代碼繁雜,但是坑少。(現(xiàn)在仍有不少公司是這樣編程的)
界面布局
推薦方式三,這樣 ScrollView 和 其子元素分離,可以簡化很多約束問題,更直觀
以上代碼,適用于 Swift 3.0 語法。
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
iOS開發(fā)中使用CoreLocation框架處理地理編碼的方法
這篇文章主要介紹了iOS開發(fā)中使用CoreLocation框架處理地理編碼的方法,代碼基于傳統(tǒng)的Objective-C,需要的朋友可以參考下2015-12-12iOS中tableview實(shí)現(xiàn)編輯、全選及刪除等功能的方法示例
這篇文章主要給大家介紹了關(guān)于iOS中tableview實(shí)現(xiàn)編輯、全選及刪除等功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),不僅是介紹實(shí)現(xiàn)的方法,將實(shí)現(xiàn)過程中遇到的問題也都分享出來了,需要的朋友們下面來一起看看吧。2017-07-07iOS 檢測網(wǎng)絡(luò)狀態(tài)的兩種方法
一般有Reachability和AFNetworking監(jiān)測兩種方式,都是第三方的框架,下文逐一詳細(xì)給大家講解,感興趣的朋友一起看看吧2016-10-10iOS開發(fā)之時間戳(或date)轉(zhuǎn)字符串的實(shí)例代碼
這篇文章主要介紹了iOS開發(fā)之時間戳(或date)轉(zhuǎn)字符串的實(shí)例代碼,需要的朋友可以參考下2017-10-10簡單掌握iOS應(yīng)用開發(fā)中sandbox沙盒的使用
這篇文章主要介紹了iOS應(yīng)用開發(fā)中sandbox沙盒的使用,即將應(yīng)用的存儲區(qū)域單獨(dú)隔離開來,開發(fā)時經(jīng)??梢杂玫?需要的朋友可以參考下2016-01-01iOS WKWebView無法處理URL Scheme和App Store鏈接的問題解決
這篇文章主要給大家介紹了關(guān)于iOS WKWebView無法處理URL Scheme和App Store鏈接的問題解決的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03