1. 程式人生 > >scrollView中contentSize、contentInset和contentOffset知識點回顧

scrollView中contentSize、contentInset和contentOffset知識點回顧

一、概述
IOS中,UIScrollView是可以滾動的檢視,它有兩個子類,分別是UITableView和UITextView。UIScrollView有三個容易讓人混淆的屬性變數:
contentSize、contentInset和contentOffset。

二、具體比較
1、首先,UIScrollView有一個frame屬性,一般為整個手機螢幕或者手機螢幕上某一塊固定的區域,總之,我們看到的UIScrollView的大小實際就是其frame的大小,這一塊區域設定後就是固定不動的。

2、contentSize 即scrollview可以滾動的區域,通過滾動,該contentSize範圍內的檢視都可以在UIScrollView的frame內看到。其屬性型別如下:

struct CGSize {
    CGFloat width;
    CGFloat height;
};
typedef struct CGSize CGSize;

假如一個scrollview的frame為(0,0,320,480),而它的contentSize為(320,960),即要通過上下滑動scrollview來檢視(320,480)後的內容。

3、contentOffset 用來記錄scrollview的滾動位置,即scrollview的contentSize區域頂點相對於frame頂點的偏移量。其屬性型別為:

struct CGPoint {
    CGFloat x;
    CGFloat
y; }; typedef struct CGPoint CGPoint;

小記:CGFloat offsetY = scrollView.contentOffset.y;
假設初始時contentSize區域的頂點和frame的頂點重合,那麼當scrollview向下拉時,offsetY為負數;當上拉時,offsetY為正數,並不斷增大。因為contentOffset代表的是偏移量,即相當於用“frame的頂點座標(x1, y1)“減去“當前位置contentSize的頂點座標(x2, y2)“,所以才有上述規律。

4、contentInset
<1> contentView是scrollview的內容顯示區域,一般情況下和scrollview的contentSize保持一致;

<2> contentInset標識了contenView開始顯示的位置,通過它可以為UIScrollView增加額外的滾動區域。(上,左,下,右)逆時針;

其屬性型別為:

typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right;
} UIEdgeInsets;

<3> contentInset的API文件的解釋是”內容檢視嵌入到封閉的滾動檢視的距離”,可以理解為contenView(內容檢視)的上下左右四個邊擴展出去的大小。contentInset的單位是UIEdgeInsets,預設值為UIEdgeInsetsZero,也就是沒有擴充套件的邊。(這個屬性和css中的margin屬性類似)

<4> 預設情況下,scrollview的contentInset屬性值為UIEdgeInsetsZero,不論scrollview的contentInset屬性值是否為0,都不會對scrollview的contentOffset屬性造成影響;

<5> 常用於判斷scrollview是否滑動到底部的方法:

第一種:(只考慮scrollView的contentSize區域是否滑動到了底部)

// 第一種表達方式
contentSize.height - contentOffset.y <= frame.size.height

// 第二種表達方式(當前顯示的控制器中有tabBar時)
scrollView.contentSize.height - scrollView.contentOffset.y <= self.view.height - self.tabBarController.tabBar.height;

第二種:(考慮整個scrollView的區域是否滑動到了底部,包括了scrollview的contentInset區域)

// 第一種表達方式
 self.scrollView.contentSize.height + self.scrollViewOriginalInset.bottom + self.scrollViewOriginalInset.top - self.scrollView.frame.size.height >= 0;

// 第二種表達方式
 contentOffset.y + frame.size.height – contentInset.bottom = size.height;

// 第三種表達方式
scrollView.contentOffset.y >= scrollView.contentSize.height + scrollView.contentInset.bottom - scrollView.height - self.tableView.tableFooterView.height;

5、小記
contentInset:除具體內容以外的邊框尺寸(相當於為contentSize四周增加一定寬度的邊框,只能看,不能放內容,只是增加了contentSize的滾動範圍);
contentSize: 裡面的具體內容(header、cell、footer),除掉contentInset以外的尺寸;
contentOffset:
(1)它可以用來判斷scrollView滾動到什麼位置;
(2)指scrollView的內容(contentSize)超出了scrollView的(frame)頂部的距離(除掉contentInset以外的尺寸);