- 父類是UIView
- UIScrollView是一個(gè)能夠滾動(dòng)的視圖控件,可以用來展示大量的內(nèi)容部凑,并且可以滾動(dòng)查看所有的內(nèi)容
UIScrollView的基本使用
1. 將需要展示的內(nèi)容添加到UIScrollView中
2. 設(shè)置UIScrollView的contentSize屬性露乏,告訴UIScrollVie滾動(dòng)的范圍
3. 顯示細(xì)節(jié):
1. 超出UIScrollView邊框的內(nèi)容會(huì)被自動(dòng)隱藏
2. 用戶可以用過手勢(shì)拖動(dòng)來查看超出邊框并被隱藏的內(nèi)容
UIScrollView無法滾動(dòng)情況
- 沒有設(shè)置
contentSize
scrollEnabled = NO
- 沒有接收到觸摸事件:
userInteractionEnabled = NO
- 這時(shí)控件內(nèi)所有子控件都不可與用戶交互
UIScrollView常見屬性
--
// 表示UIScrollView滾動(dòng)的位置
// 是內(nèi)容層左上角與scrollView左上角的間距值)
scrollView.contentOffset = CGPointMake(10, 10);
// 滾動(dòng)范圍
scrollView.contentSize = CGSizeMake(300, 300);
// 設(shè)置內(nèi)邊距
// 用來避免scrollView的內(nèi)容被其他控件擋住
scrollView.contentInset = UIEdgeInsetsMake(10, 10,10, 10);
// 是否能滾動(dòng)
self.scrollView.scrollEnabled = YES;
// 設(shè)置彈簧效果
// 設(shè)置UIScrollView是否需要彈簧效果(默認(rèn)YES)
scrollView.bounces = YES;
// 若bounces設(shè)置為NO涂邀,則下面兩項(xiàng)無論怎么設(shè)置都不會(huì)滾動(dòng)
// 設(shè)置水平方向是否需要彈簧效果(默認(rèn)YES)
scrollView.alwaysBounceHorizontal = YES;
// 設(shè)置垂直方向是否需要彈簧效果(默認(rèn)NO)
scrollView.alwaysBounceVertical = YES;
// 設(shè)置縮放比例
scrollView.maximumZoomScale = 2.0;//最大放大比例
scrollView.minimumZoomScale = 0.2;//最小縮小比例
self.scrollView.zoomScale = 3;
//手動(dòng)設(shè)置圖片當(dāng)前伸縮比例
// 設(shè)置指示器
// 指示器風(fēng)格
scrollView.indicatorStyle = UIScrollViewIndicatorStyleWhite;
// 指示器邊距
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(20, 20, 20, 20);
// 是否展示水平的指示器
scrollView.showsHorizontalScrollIndicator = NO;
// 是否展示垂直的指示器
scrollView.showsVerticalScrollIndicator = NO;
// 是否分頁
scrollView.pagingEnabled = YES;
監(jiān)聽UIScrollView的滾動(dòng)
- 設(shè)置代理
self.scrollView.delegate = self;
- 讓控制器遵守協(xié)議
@interface FZQpageView()<UIScrollViewDelegate>
- 實(shí)現(xiàn)協(xié)議中的方法
// 用戶開始拖拽時(shí)調(diào)用 -(void)scrollViewWillBeginDragging:(UIScrollview *)scrollView; //滾動(dòng)到某個(gè)位置時(shí)調(diào)用 -(void)scrollViewDidScroll:(UIScrollView *)scrollView; // 用戶結(jié)束拖拽時(shí)調(diào)用 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate; //屏幕停止?jié)L動(dòng)時(shí)調(diào)用 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
監(jiān)聽UIScrollView的縮放
MAC中按住option縮放
-
縮放實(shí)現(xiàn)步驟:
- 設(shè)置UIScrollView的id<UISCrollViewDelegate> delegate代理對(duì)象
self.scrollView.delegate = self;
- 設(shè)置縮放比例
// 設(shè)置縮放比例 scrollView.maximumZoomScale = 2.0;//最大放大比例 scrollView.minimumZoomScale = 0.2;//最小縮小比例
- 讓代理對(duì)象實(shí)現(xiàn)下面的方法观蜗,返回需要縮放的視圖控件
// 返回需要縮放的視圖控件 - (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { // 返回scrollView的子控件 return self.imageView; }
- 跟縮放相關(guān)的其他代理方法
// 縮放即將開始的時(shí)候調(diào)用 - (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view; // 正在縮放的時(shí)候調(diào)用 - (void)scrollViewDidZoom:(UIScrollView *)scrollView;
UIScrollView在storyboard中的自動(dòng)布局(不推薦)
- 詳見UIStoryboard中
在storyboard\xib中給UIScrollView子控件添加約束
UIScrollView滾動(dòng)原理->修改bonuds
- 矩形框和內(nèi)容的理解
1. 矩形框
1. 控件自己的顯示位置和尺寸
2. 內(nèi)容
2. 每個(gè)控件內(nèi)部都有一個(gè)內(nèi)容層,無限大
frame和bounds的重新認(rèn)識(shí)
1. frame
1. 以父控件的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自身的位置和尺寸
2. bounds
1. 以內(nèi)容的左上角為坐標(biāo)原點(diǎn), 計(jì)算出的控件自身矩形框的位置和尺寸
3. 概括
1. frame.size == bounds.size
2. scrollView.bounds.origin == scrollView.contentOffset-
bounds和frame的區(qū)別
-
UIScrollView的底層實(shí)現(xiàn)模仿
/* 目標(biāo):模仿UIScrollView,修改bounds 1. 添加拖動(dòng)手勢(shì) 2. 獲取手指偏離量,改變bounds */ - (void)viewDidLoad { [super viewDidLoad]; UIView *scrollView = [[UIView alloc] initWithFrame:self.view.bounds]; [self.view addSubview:scrollView]; // 添加子控件 UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; redView.backgroundColor = [UIColor redColor]; [scrollView addSubview:redView]; ## 下面的代碼相當(dāng)于設(shè)置contentsize // 添加拖動(dòng)手勢(shì) UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)]; [scrollView addGestureRecognizer:pan]; } // 手指拖動(dòng)就會(huì)調(diào)用 - (void)pan:(UIPanGestureRecognizer *)pan { // 獲取偏移量 CGFloat transY = [pan translationInView:pan.view].y; CGFloat y = pan.view.bounds.origin.y - transY; // 修改bounds pan.view.bounds = CGRectMake(0, y, self.view.bounds.size.width, self.view.bounds.size.height); // 復(fù)位 [pan setTranslation:CGPointZero inView:pan.view]; }