使用UIScrollView的正確姿勢(shì)

場(chǎng)景分析

在實(shí)際開發(fā)中遇到UIScrollView的場(chǎng)景大概分為兩類: 超過一個(gè)豎屏的信息展示 和 輪播圖眼五,以少數(shù)派App做個(gè)例子

少數(shù)派.gif

技術(shù)難點(diǎn)

通常來說,UIScrollView的布局 有兩種方法:

  • StoryBoard + AutoLayout的方式
  • 代碼 + SnapKit布局的方式 進(jìn)行

不管我們采取哪種布局技術(shù)泞遗,如果我們直接在UIScrollView中添加子視圖,然后給子視圖相對(duì)于UIScrollView添加約束席覆,會(huì)發(fā)現(xiàn)子視圖是無法顯示的史辙,這是什么原因呢?

其實(shí)是因?yàn)椋?UIScrollView的leading/trailing/top/bottom是相對(duì)于自己的ContentSize來說的佩伤,而不是Frame; 而在給所有子視圖添加完視圖前ContentSize還不確定聊倔,我們這時(shí)候又給子視圖添加約束到ContentSize,相互依賴生巡,不就成了蛋生雞耙蔑,雞生蛋的問題了。

解決方案

我們可以給UIScrollView添加一個(gè)充滿自己的ContainerView孤荣,然后我們所有子視圖的布局相對(duì)于這個(gè)ContainerView就好了甸陌; 同時(shí),只要確定了ContainerView的尺寸盐股,也就確定了UIScrollView的ContentSize

干起來

我們通過SnapKit + 代碼的方式給一個(gè)垂直滾動(dòng)的UIScollView加約束來做例子钱豁,其他情況原理都是類似的。

  • Step1: 給UIScollView添加約束,沒什么可說的
    view.addSubview(scrollView)
    scrollView.snp.makeConstraints { (make) in
        make.edges.equalToSuperview()
    }
  • step2 : 給UIScollView添加一個(gè)充滿他的ContainerView(重要)
    注意:ContainerView給定了寬度疯汁,即UIScollView的ContentSize的寬度確定了牲尺,還需要確定高度
    scrollView.addSubview(containerView)
    containerView.snp.makeConstraints { (make) in
          make.edges.equalToSuperview()
          make.width.equalTo(ScreenWidth)
    }

Step3: 在ContainerView中添加子視圖

    //add 5 orange view
        for i in 0..<5 {
            let orangeView = UIView()
            orangeView.backgroundColor = #colorLiteral(red: 0.9372549057, green: 0.3490196168, blue: 0.1921568662, alpha: 1)
            containerView.addSubview(orangeView)
            orangeView.snp.makeConstraints({ (make) in
                make.left.right.equalTo(containerView)
                make.height.equalTo(orangeViewGap)
                
                if i == 0 {
                    make.top.equalTo(containerView.snp.top).offset(orangeViewGap)
                } else if let previousView = containerView.subviews[i-1] as? UIView{
                    make.top.equalTo(previousView.snp.bottom).offset(orangeViewGap)
                }
                
                if i == 4 {
                    containerView.snp.makeConstraints({ (make) in
                        make.bottom.equalTo(orangeView.snp.bottom).offset(orangeViewGap)
                    })
                }
            })
        }

上面代碼中,第一個(gè)View很簡單幌蚊,關(guān)鍵是最后一個(gè)子視圖谤碳,一定要加好最后一個(gè)子視圖到ContainerView的間隔溃卡,即我們確定了ContainerView的高度,那么我們就確定了UIScrollView的ContentSize的高度蜒简,到此瘸羡,完成整個(gè)布局過程; 核心代碼都在上面臭蚁。
最終最铁,完成效果如下:

ScrollView.gif
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市垮兑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌漱挎,老刑警劉巖系枪,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異磕谅,居然都是意外死亡私爷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門膊夹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衬浑,“玉大人,你說我怎么就攤上這事放刨」ぶ龋” “怎么了?”我有些...
    開封第一講書人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵进统,是天一觀的道長助币。 經(jīng)常有香客問我,道長螟碎,這世上最難降的妖魔是什么眉菱? 我笑而不...
    開封第一講書人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮掉分,結(jié)果婚禮上俭缓,老公的妹妹穿的比我還像新娘。我一直安慰自己酥郭,他們只是感情好华坦,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著褥民,像睡著了一般季春。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上消返,一...
    開封第一講書人閱讀 50,050評(píng)論 1 291
  • 那天载弄,我揣著相機(jī)與錄音耘拇,去河邊找鬼。 笑死宇攻,一個(gè)胖子當(dāng)著我的面吹牛惫叛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逞刷,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼嘉涌,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了夸浅?” 一聲冷哼從身側(cè)響起仑最,我...
    開封第一講書人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎帆喇,沒想到半個(gè)月后警医,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡坯钦,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年预皇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片婉刀。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吟温,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出突颊,到底是詐尸還是另有隱情鲁豪,我是刑警寧澤,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布洋丐,位于F島的核電站呈昔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏友绝。R本人自食惡果不足惜堤尾,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望迁客。 院中可真熱鬧郭宝,春花似錦、人聲如沸掷漱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽卜范。三九已至衔统,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锦爵。 一陣腳步聲響...
    開封第一講書人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來泰國打工舱殿, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人险掀。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓沪袭,卻偏偏與公主長得像,于是被迫代替她去往敵國和親樟氢。 傳聞我的和親對(duì)象是個(gè)殘疾皇子冈绊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容