移動(dòng)設(shè)備的屏幕大小是極其有限的,因此直接展示在用戶眼前的內(nèi)容也相當(dāng)有限
當(dāng)展示的內(nèi)容較多,超出一個(gè)屏幕時(shí),用戶可通過滾動(dòng)手勢來查看屏幕以外的內(nèi)容
普通的UIView不具備滾動(dòng)功能,不能顯示過多的內(nèi)容
UIScrollView是一個(gè)能夠滾動(dòng)的視圖控件,可以用來展示大量的內(nèi)容,并且可以通過滾動(dòng)查看所有的內(nèi)容
舉例:手機(jī)上的“設(shè)置”、其他示例程序
UIScrollView的基本使用
_customScrollView = [[UIScrollView alloc] init];
_customScrollView.frame = CGRectMake(0, 0, mainScreenW, mainScreenH - 49);
_customScrollView.contentSize = CGSizeMake(mainScreenW, 860 *SIZEW + 280);//345 *SIZEW + 700*SIZEW
_customScrollView.showsHorizontalScrollIndicator = NO;
_customScrollView.showsVerticalScrollIndicator = NO;
_customScrollView.delegate = self;
_customScrollView.backgroundColor = main16Color(0xFFFFFF);
_customScrollView.mj_header = [MJRefreshNormalHeader headerWithRefreshingTarget:self refreshingAction:@selector(honeNetworkRequest)];//設(shè)置刷新控件
if (@available(iOS 11.0, *)) {
_customScrollView.contentInsetAdjustmentBehavior = UIScrollViewContentInsetAdjustmentNever;
} else {
AdjustsScrollViewInsets_NO(_customScrollView, self);
// self.automaticallyAdjustsScrollViewInsets = NO;
}
[self.view addSubview:_customScrollView];
scrollView的代理方法
scrollView 正在滾動(dòng)的時(shí)候調(diào)用 偏移量一直變化
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
scrollView正在縮放
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
開始拖拽的時(shí)候調(diào)用
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
即將停止拖拽的時(shí)候調(diào)用
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);
已經(jīng)停止拖拽調(diào)用
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;
scrollView即將開始減速
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;
scrollView 停止減速 停止
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
scrollView 停止?jié)L的的動(dòng)畫
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
在scrollView中 哪些控件是需要縮放的
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
scrollView即將開始縮放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view NS_AVAILABLE_IOS(3_2);
scrollView結(jié)束縮放
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale;
scrollView 即將滾動(dòng)到頂部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;
scrollView 已經(jīng)滾動(dòng)到頂部
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;
UIScrollView 的用法很簡單
將需要展示的內(nèi)容添加到UIScrollView中
設(shè)置UIScrollView的contentSize屬性,告訴UIScrollView所有內(nèi)容的尺寸,也就是告訴它滾動(dòng)的范圍(能滾多遠(yuǎn),滾到哪里是盡頭)

UIScrollView的常見屬性
@property(nonatomic) CGSize contentSize;
這個(gè)屬性用來表示UIScrollView內(nèi)容的尺寸,滾動(dòng)范圍(能滾多遠(yuǎn))
@property(nonatomic) CGPoint contentOffset;
(又叫內(nèi)容偏移量:內(nèi)容左上角減去scoreView左上角差的值,用戶只要稍微動(dòng)一下,圖片就會(huì)再次彈回原始的位置)
這個(gè)屬性用來表示UIScrollView滾動(dòng)到的位置
@property(nonatomic) UIEdgeInsets contentInset;
這個(gè)屬性能夠在UIScrollView的4周增加額外的滾動(dòng)區(qū)域(也可以把這個(gè)理解成周圍的厚度)

UIScrollView的其他屬性
@property(nonatomic) BOOL bounces;
設(shè)置UIScrollView是否需要彈簧效果
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
設(shè)置UIScrollView是否能滾動(dòng)
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
是否顯示水平滾動(dòng)條
@property(nonatomic) BOOL showsVerticalScrollIndicator;
是否顯示垂直滾動(dòng)條
tracking
當(dāng) touch 后還沒有拖動(dòng)的時(shí)候值是YES,否則NO
zoomBouncing
當(dāng)內(nèi)容放大到最大或者最小的時(shí)候值是 YES,否則 NO
zooming
當(dāng)正在縮放的時(shí)候值是 YES,否則 NO
decelerating
當(dāng)滾動(dòng)后,手指放開但是還在繼續(xù)滾動(dòng)中。這個(gè)時(shí)候是 YES,其它時(shí)候是 NO
decelerationRate
設(shè)置手指放開后的減速率
maximumZoomScale
一個(gè)浮點(diǎn)數(shù),表示能放最大的倍數(shù)
minimumZoomScale
一個(gè)浮點(diǎn)數(shù),表示能縮最小的倍數(shù)
pagingEnabled
當(dāng)值是 YES 會(huì)自動(dòng)滾動(dòng)到 subview 的邊界。默認(rèn)是NO
scrollEnabled
決定是否可以滾動(dòng)
如果scrollView不是通過storyboard、xib創(chuàng)建,那么一開始的subviews里面沒有子控件這就是和手動(dòng)創(chuàng)建的最大的區(qū)別
在scoreView里面在水平滾動(dòng)條和垂直滾動(dòng)條沒有設(shè)置為NO的情況下,它也算做ScrollView的一部分(在scoreView里面刪除子控件的時(shí)候要格外的注意,但是可以把這兩個(gè)滾動(dòng)條給禁止設(shè)置為NO)
意思是需要?jiǎng)赢? 但是時(shí)間是蘋果自己定義的 第一個(gè)參數(shù)是你要滾動(dòng)到的位置 第二個(gè)參數(shù)是是否要?jiǎng)赢嬓Ч?
[self.scrollView setContentOffset:CGPointMake(0, self.scrollView.contentOffset.y) animated:YES];
是否有彈簧效果
self.scrollView.bounces = NO;
不管有沒有contentSize,都能擁有彈簧效果(一般適用于下拉刷新功能,上拉刷新)
self.scrollView.alwaysBounceVertical = YES; (彈簧效果)
self.scrollView.alwaysBounceHorizontal = YES;(水平效果可以滾來滾去)
是否要顯示滾動(dòng)條
self.scrollView.showsHorizontalScrollIndicator = NO;
self.scrollView.showsVerticalScrollIndicator = NO;
self.scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
NSLog(@"%@", self.scrollView.subviews);
[[self.scrollView.subviews firstObject] removeFromSuperview];
/**
UIControlStateNormal;
UIControlStateHighlighted;
UIControlStateDisabled; 禁止?fàn)顟B(tài)// 只能通過enabled=NO達(dá)到這個(gè)狀態(tài)
設(shè)置userInteractionEnabled=NO,可以禁止一些事件,比如點(diǎn)擊和拉拽(意思是禁止和用戶交互)
*/

UIScrollView的代理(delegate)
代理三部曲:作用
1.代理一般都是控制器對象
2.代理一般都是id類型 (注意代理是弱指針,如果是強(qiáng)指針會(huì)內(nèi)存泄露)
3.代理協(xié)議的格式:控件類名Delegata
4.代理方法:方法名一般都是以控件名開頭,比如UIScrollView的代理方法就是ScrollViewDelegata
5.如何監(jiān)聽控件的行為
通過addTarget(只有繼承自UIControl的控件,才有這個(gè)功能)
通過Delegate(只有擁有delagate的屬性的控件,才有這個(gè)功能,有的控件兩個(gè)功能都有)
(比如讓控制器監(jiān)聽ScoreView的行為)
注意:給其設(shè)置背景色的時(shí)候只有運(yùn)行的時(shí)候才能看到
1.設(shè)置scorollView的deledate(代理)為控制器對象
scorollView.deledata = 控制器
2.控制器要遵守協(xié)議 <UIScrollViewDelegata>
3.控制器要實(shí)現(xiàn)UIscoreView協(xié)議里面的代理方法
很多時(shí)候,我們想在UIScrollView正在滾動(dòng) 或 滾動(dòng)到某個(gè)位置 或者 停止?jié)L動(dòng) 時(shí)做一些特定的操作
要想完成上述功能,前提條件就是能夠監(jiān)聽到UIScrollView的整個(gè)滾動(dòng)過程
當(dāng)UIScrollView發(fā)生一系列的滾動(dòng)操作時(shí), 會(huì)自動(dòng)通知它的代理(delegate)對象,給它的代理發(fā)送相應(yīng)的消息,讓代理得知它的滾動(dòng)情況
也就是說,要想監(jiān)聽UIScrollView的滾動(dòng)過程,就必須先給UIScrollView設(shè)置一個(gè)代理對象,然后通過代理得知UIScrollView的滾動(dòng)過程

仔細(xì)看這個(gè)方法
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"minion"]];
這個(gè)方法的意思是通過一張圖片來初始化這個(gè)UIImageView,并且UIImageView的尺寸就是圖片的尺寸!
[scrollView addSubview:imageView];
scrollView.contentSize = imageView.frame.size;
設(shè)置代理(監(jiān)聽scrollView的各種行為)
scrollView.delegate = self;
#pragma mark - <UIScrollViewDelegate> 代理方法
只要scrollView在滾動(dòng),就會(huì)調(diào)用這個(gè)方法(監(jiān)聽scrollView的滾動(dòng))
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
NSLog(@"scrollViewDidScroll");
}
用戶即將開始拖拽scrollView,就會(huì)調(diào)用這個(gè)方法
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
NSLog(@"scrollViewWillBeginDragging");
}
用戶即將停止拖拽scrollView,就會(huì)調(diào)用這個(gè)方法
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset
{
NSLog(@"scrollViewWillEndDragging");
}
scrollView已經(jīng)停止減速,就會(huì)調(diào)用這個(gè)方法(停止?jié)L動(dòng))
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
NSLog(@"scrollView減速完畢,停止?jié)L動(dòng),完全靜止");
}
用戶已經(jīng)停止拖拽scrollView,就會(huì)調(diào)用這個(gè)方法
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (decelerate == NO) {
NSLog(@"scrollView停止?jié)L動(dòng),完全靜止");
} else {
NSLog(@"用戶停止拖拽,但是scrollView由于慣性,會(huì)繼續(xù)滾動(dòng),并且減速");
}
}