移動的設備的屏幕大小有限,當一個視圖要顯示的內容大于屏幕尺寸的時候就要用到滾動視圖,比如一個網頁的內容通常比屏幕尺寸大,那么瀏覽器就使用了滾動視圖。
UIScrollView有一個contentSize屬性,聲明如下:
@PRoperty(nonatomic) CGSize contentSize;
這個屬性表示滾動視圖的內容有多大。
創建滾動視圖實例:
- (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. UIScrollView *sv = [[UIScrollView alloc] initWithFrame:self.view.frame]; sv.contentSize = CGSizeMake(1000, 1000); sv.backgroundColor = [UIColor redColor]; [self.view addSubview:sv];}
效果圖:
contentSize 屬性為{1000,1000},可以很明顯的看到橫向和縱向滾動條。
1. 滾動
視圖的滾動也沒什么好說的,主要是設置一些屬性:
scrollEnabled 是否開啟滾動
scrollsToTop 默認為YES,用戶可以單擊狀態欄滾動至頂部
bounces 默認為YES,當滾動至邊界時還可以進一步滾動,松開時迅速彈回至原位
directionalLockEnabled 如果為YES,僅可以同時在一個方向上滾動
decelerationRate 在輕彈屏幕后,滾動的速度逐漸衰減,較低的值衰減越快
showsHorizontalScrollIndicator、showsVerticalScrollIndicator 默認為YES,滾動時滾動指示條可見
indicatorStyle 滾動條的樣式(UIScrollViewIndicatorStyleBlack,UIScrollViewIndicatorStyleDefaultUIScrollViewIndicatorStyleWhite)
contentInset 指定內容四周的余量(上 左 下 右的順序)
scrollIndicatorInsets 指定了滾動指示條在位置的切換
contentOffset 內容的定位點,當前顯示內容的左上角
2. 分頁
當內容大于屏幕時就可以分頁,設置pagingEnabled屬性為YES,滾動視圖就不允許用戶自由滑動,只能通過滑動至相鄰的部分。
3. 縮放
使滾動視圖可以縮放需要時設置minimumZoomScale和maximumZoomScale兩個屬性的值(默認為1),還需要在滾動視圖的委托中實現viewForZoomingInScrollView:方法,該方法返回滾動視圖中哪個子視圖是可以縮放的,如果滾動視圖有多個子視圖,但是通常我們需要縮放整個滾動視圖的內容,那么將多個視圖放在一個視圖即可,在將這個視圖成為滾動視圖的子視圖。
滾動視圖通過對捏合手勢的響應進行縮放,如果縮放超出了我們設置的限制,當手勢結束時,尺寸退回到我們設置的限制。如果想要嚴格的限制縮放不超過我們設置的限制,將bouncesZoom設置為NO就可以了。
在某種情況下,比如我們雙擊需要進行縮放的時候,就要用代碼進行縮放,使用下面兩個方法:
- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);
setZoomScale:animated: 根據比例縮放
zoomToRect:animated: 給定矩形的大小進行縮放
4. 委托
UIScrollViewDelegate可以接收大量消息開幫助你跟蹤滾動視圖的工作
下面是協議的定義
@protocol UIScrollViewDelegate<NSObject>@optional- (void)scrollViewDidScroll:(UIScrollView *)scrollView; // any offset changes- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2); // any zoom scale changes// called on start of dragging (may require some time and or distance to move)- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;// called on finger up if the user dragged. velocity is in points/millisecond. targetContentOffset may be changed to adjust where the scroll view comes to rest- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);// called on finger up if the user dragged. decelerate is true if it will continue moving afterwards- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView; // called on finger up as we are moving- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView; // called when scroll view grinds to a halt- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView; // called when setContentOffset/scrollRectVisible:animated: finishes. not called if not animating- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView; // return a view that will be scaled. if delegate returns nil, nothing happens- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2); // called before the scroll view begins zooming its content- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale; // scale between minimum and maximum. called after any 'bounce' animations- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView; // return a yes if you want to scroll to the top. if not defined, assumes YES- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView; // called when scrolling animation finished. may be called immediately if already at top@end
這些方法的意思就不解釋了,有注釋的,學習最快的方法就是看這些頭文件。
新聞熱點
疑難解答