07-UIScrollView

移動(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),滾到哪里是盡頭)


image.png

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è)理解成周圍的厚度)


image.png

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)擊和拉拽(意思是禁止和用戶交互)
*/


image.png

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)過程


image.png
仔細(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),并且減速");
    }
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容