UIScrollView的基礎(chǔ)使用

UIScrollView的基礎(chǔ)

UIScrollView是一些UIKit類的父類押框,如UITableView、UITextView米碰。
UIScrollView可以看作兩層-scrollView(滾動(dòng)視圖卦尊,用于滾動(dòng))和contentView(內(nèi)容視圖漫萄,用于展示內(nèi)容)。
一個(gè)UIScrollView對(duì)象的核心概念是在內(nèi)容視圖上的原點(diǎn)上是可調(diào)整的缀踪。
UIScrollView對(duì)象以自身尺寸來(lái)剪裁內(nèi)容居砖,但它自身尺寸通常(但不必定)與App的主窗口重合虹脯。
ScrollView跟蹤手指的移動(dòng)并且相應(yīng)的調(diào)整原點(diǎn)。
通過(guò)ScrollView顯示內(nèi)容的View悯蝉,根據(jù)固定在內(nèi)容視圖中的偏移量的新原點(diǎn)繪制自身的部分(ScrollView自身不參與繪制归形,除非顯示垂直或水平的滑動(dòng)指示器)
ScrollView必須知道內(nèi)容的尺寸,以此來(lái)判斷什么時(shí)候停止?jié)L動(dòng)鼻由。
默認(rèn)情況下暇榴,當(dāng)滾動(dòng)內(nèi)容超出范圍,它會(huì)有反彈效果蕉世。
管理ScrollView中繪制內(nèi)容顯示的對(duì)象蔼紧,應(yīng)平鋪內(nèi)容的子視圖,以至于沒有View超出屏幕大小狠轻。
當(dāng)用戶在滾動(dòng)視圖中滾動(dòng)時(shí)奸例,此對(duì)象應(yīng)根據(jù)要求添加或刪除子視圖。

觸摸事件分發(fā)原理

因?yàn)镾crollView沒有ScrollBar向楼,他必須知道一個(gè)觸摸操作是否代表一個(gè)滾動(dòng)意圖還是一個(gè)跟蹤內(nèi)容中的子View的意圖查吊。
為了判斷,它通過(guò)啟動(dòng)一個(gè)計(jì)時(shí)器暫時(shí)攔截觸摸事件湖蜕,并在計(jì)時(shí)器觸發(fā)之前逻卖,查看觸摸是否有移動(dòng)。
若計(jì)時(shí)器在沒有位置變化的情況下觸發(fā)昭抒,則ScrollView將跟蹤事件傳遞給內(nèi)容中的子View评也。
若用戶在計(jì)時(shí)器停止前將手指拖到了足夠遠(yuǎn)的距離,則ScrollView會(huì)取消內(nèi)容中子View的跟蹤事件灭返,并執(zhí)行滾動(dòng)操作盗迟。

子類可以重寫touchesShouldBegin()、isPagingEnabled()和touchesShouldCancel()方法(由scrollView調(diào)用)熙含,來(lái)影響scrollView處理滾動(dòng)手勢(shì)的方式罚缕。

若你給View的restorationIdentifier屬性設(shè)置了值,它會(huì)嘗試在app崩潰時(shí)保留滾動(dòng)相關(guān)的信息婆芦,特殊的怕磨,將保留zoomScale,contentInset和contentOffset屬性的值消约。
在重啟時(shí)肠鲫,ScrollView保存的值,使內(nèi)容顯示滾動(dòng)到以前相同位置或粮。

UIScrollView的主要屬性

屬性 含義
frame 滾動(dòng)視圖(可見區(qū)域)的大小和位置
contentSize 代表內(nèi)容視圖的大小
indicatorStyle 滑動(dòng)光標(biāo)的樣式
bounces 滑動(dòng)到邊緣時(shí)具有反彈效果
isPagingEnabled 分頁(yè)效果导饲,每次移動(dòng)一個(gè)格
contentOffset UIScrollView當(dāng)前顯示區(qū)域的頂點(diǎn)相對(duì)于UIScrollView的frame的坐標(biāo)。
bouncesZoom 類似于bounces屬性,這個(gè)屬性可以讓用戶的縮放操作超出最大或最小縮放級(jí)別渣锦,然后彈回硝岗。
minimumZoomScale 最小縮放比例
maximumZoomScale 最大縮放比例
showsHorizontalScrollIndicator 顯示水平滾動(dòng)條
showsVerticalScrollIndicator 顯?垂直滾動(dòng)條
scrollsToTop 點(diǎn)擊狀態(tài)欄返回頂部

在UIScrollView中添加控件

    func configViews() {
        let scrollView = UIScrollView.init(frame: CGRect.init(x: 0, y: 0, width: 414, height: 200))
        scrollView.contentSize = CGSize.init(width: 414 * 5, height: 200)
        scrollView.backgroundColor = .gray
        scrollView.indicatorStyle = .white
        scrollView.bounces = true
        view.addSubview(scrollView)
        let label = UILabel.init(frame: CGRect.init(x: 414, y: 0, width: 414, height: 50))
        label.textColor = .red
        label.text = "hello"
        scrollView.addSubview(label)
    }

委托代理方法

拓展含有UIScrollView的ViewController繼承UIScrollViewDelegate,其中的一些常用的方法

extension ViewController: UIScrollViewDelegate {
    func scrollViewDidScroll(_ scrollView: UIScrollView) {
        // 滾動(dòng)時(shí)不停的回調(diào)
    }
    func scrollViewDidZoom(_ scrollView: UIScrollView) {
        // 縮放過(guò)程中持續(xù)觸發(fā)
    }
    func scrollViewWillBeginDragging(_ scrollView: UIScrollView) {
        // 用戶首次拖動(dòng)時(shí)調(diào)用
    }
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        // 將要結(jié)束拖動(dòng)時(shí)調(diào)用
    }
    func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) {
        // 用戶手指停止拖動(dòng)袋毙,離開屏幕時(shí)調(diào)用
    }
    func scrollViewWillBeginDecelerating(_ scrollView: UIScrollView) {
        // 將要開始減速時(shí)調(diào)用
    }
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        // 減速完成時(shí)觸發(fā)型檀,速度為0,通常在這里獲取scrollView的contentOffset
    }
    func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
        // 給scrollView設(shè)置一個(gè)結(jié)束動(dòng)畫的時(shí)候觸發(fā)听盖,不指定動(dòng)畫不會(huì)觸發(fā)
    }
    func scrollViewWillBeginZooming(_ scrollView: UIScrollView, with view: UIView?) {
        // 將要開始縮放時(shí)觸發(fā)
    }
    func scrollViewDidEndZooming(_ scrollView: UIScrollView, with view: UIView?, atScale scale: CGFloat) {
        // 結(jié)束縮放時(shí)觸發(fā)
    }
    func scrollViewShouldScrollToTop(_ scrollView: UIScrollView) -> Bool {
        // 設(shè)置點(diǎn)擊狀態(tài)欄時(shí)是否會(huì)到頂部
        return true
    }
    func scrollViewDidScrollToTop(_ scrollView: UIScrollView) {
        // scrollView已返回頂部時(shí)觸發(fā)
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胀溺,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子皆看,更是在濱河造成了極大的恐慌仓坞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件腰吟,死亡現(xiàn)場(chǎng)離奇詭異无埃,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)毛雇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嫉称,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人灵疮,你說(shuō)我怎么就攤上這事澎埠。” “怎么了始藕?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)氮趋。 經(jīng)常有香客問(wèn)我伍派,道長(zhǎng),這世上最難降的妖魔是什么剩胁? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任诉植,我火速辦了婚禮,結(jié)果婚禮上昵观,老公的妹妹穿的比我還像新娘晾腔。我一直安慰自己,他們只是感情好啊犬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布灼擂。 她就那樣靜靜地躺著,像睡著了一般觉至。 火紅的嫁衣襯著肌膚如雪剔应。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音峻贮,去河邊找鬼席怪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纤控,可吹牛的內(nèi)容都是我干的挂捻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼船万,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼刻撒!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起唬涧,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤号涯,失蹤者是張志新(化名)和其女友劉穎蜂莉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘟栖,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了憾朴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片贫贝。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖殖氏,靈堂內(nèi)的尸體忽然破棺而出晚树,到底是詐尸還是另有隱情,我是刑警寧澤雅采,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布爵憎,位于F島的核電站,受9級(jí)特大地震影響婚瓜,放射性物質(zhì)發(fā)生泄漏宝鼓。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一巴刻、第九天 我趴在偏房一處隱蔽的房頂上張望愚铡。 院中可真熱鬧,春花似錦胡陪、人聲如沸沥寥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)邑雅。三九已至,卻和暖如春愚隧,著一層夾襖步出監(jiān)牢的瞬間蒂阱,已是汗流浹背锻全。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留录煤,地道東北人鳄厌。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像妈踊,于是被迫代替她去往敵國(guó)和親了嚎。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • 1 UIScrollView原理 在滾動(dòng)過(guò)程當(dāng)中廊营,其實(shí)是在修改原點(diǎn)坐標(biāo)歪泳。當(dāng)手指觸摸后,scroll view...
    Kevin_Junbaozi閱讀 994評(píng)論 0 1
  • 一、簡(jiǎn)介 <<繼承關(guān)系:UIScrollView --> UIView-->UIResponder-->NSObj...
    無(wú)邪8閱讀 1,859評(píng)論 0 0
  • 在iOS中露筒,滾動(dòng)視圖UIScrollView用于查看大于屏幕的內(nèi)容呐伞。Scroll View有兩個(gè)主要目的: 讓用戶...
    pro648閱讀 38,224評(píng)論 4 37
  • 1.UIScrollView是什么? 移動(dòng)設(shè)備的屏幕?小是極其有限的,因此直接展?在用戶眼前的內(nèi)容也相當(dāng)有限,當(dāng)展...
    happycolt閱讀 10,475評(píng)論 1 16
  • 建中,是陜西煤炭建設(shè)公司第一中學(xué)的簡(jiǎn)稱慎式。她位于黃土高原南緣一個(gè)山地小城西南角伶氢,坐落在兩山之間,門前公路和鐵路瘪吏,后有...
    primates閱讀 310評(píng)論 0 1