在最美的年齡,為最初的夢想,盡最大的努力!
做iOS開發(fā)有段時間了,后來因為公司的要求,轉了前端的開發(fā),回過頭來再溫習iOS有了不同的感觸,寫文章還是第一次,希望通過簡書來記錄一個菜鳥程序員的成長。
UIScrollVIew 知識總結
- scrollView 常用屬性
//監(jiān)控目前滾動的位置
CGPoint contentOffSet
//滾動范圍的大小
CGSize contentSize
//視圖在scrollView中的位置
UIEdgeInsets contentInset
//設置協(xié)議
id<UIScrollerViewDelegate>delegate
//控制控件遇到邊框是否反彈
BOOL bounces
//控制垂直方向遇到邊框是否反彈
BOOL alwaysBounceVertical
//控制水平方向遇到邊框是否反彈
BOOL alwaysBounceHorizontal
//控制控件是否整頁翻動
BOOL pagingEnabled
//控制控件是否能滾動
BOOL scrollEnabled
//控制是否顯示水平方向的滾動條
BOOL showsHorizontalScrollIndicator
//控制是否顯示垂直方向的滾動條
BOOLshowsVerticalScrollIndicator
//指定滾動條在scrollerView中的位置
UIEdgeInsets scrollIndicatorInsets
//設定滾動條的樣式
UIScrollViewIndicatorStyleindicatorStyle
//縮小的最小比例
float minimumZoomScale
//放大的最大比例
float maximumZoomScale
//設置變化比例
float zoomScale
//控制縮放的時候是否會反彈
BOOL bouncesZoom
//判斷控件的大小是否正在改變
BOOL zooming
//控制控件滾動到頂部
BOOL scrollsToTop
- scrollView 常用代理方法
//滑動時觸發(fā)
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
//捏合時觸發(fā)
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
//將要開始拽動時觸發(fā)
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;
//將要結束拖拽時觸發(fā)
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView
//已經結束拖拽時
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView
//拖拽結束會有個慣性減速過程,這個過程即將開始時觸發(fā)
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;
//慣性結束時
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;
//非人為托轉,代碼控制scroll滑動動畫結束時觸發(fā)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;
//返回一個可以進行捏合的view (必須是scroll的子控件)
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;
//將要開始進行捏合操作事觸發(fā)
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view
//結束捏合時觸發(fā)
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale;
//是否可以滑到頂部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;
//滑動到頂部時
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;
UIScrollVIew 實現(xiàn)輪播圖
想想以前面試官問你怎么寫輪播圖,我還很裝逼的說5123451思路制造假象實現(xiàn)跳轉輪播,現(xiàn)在想想,真是 too young too simple,于是我自己試著封裝了一個利用三個UIImageVIew 思路 進行無限輪播
實現(xiàn)思路:默認加載三張UIImageView,無論怎么滑動永遠顯示中間那張,每次滑動先渲染圖片在切換scrollView的contentOffSet到中間,造成無限循環(huán)的假象
- 核心代碼
首先渲染三張圖片 最后一張 第一張 第二張,渲染后讓scrollView滑到中間圖片位置,然后向右滑動 到第二張的位置 渲染三張圖片為 第一張 第二張 第三張, 然后讓scrollVIew滑動到中間第二張的位置,依次類推,造成循環(huán)的假象!
#pragma mark 更新圖片 渲染
//渲染圖片的方法
- (void)updateImage{
//始終讓中間的圖片顯示
//圖片變換順序后 設置scrollView contentOffset 顯示中間
for (int i = 0; i < COUNT; i++) {
ZZHImageView * imageView = self.scrollView.subviews[i];
NSInteger index = self.pageControl.currentPage;
if(i == 0){
index --;
}else if (i == 2){
index++;
}
if (index < 0) {
//第一張的前一張是最后一張
index = self.imageArr.count - 1;
} else if (index >= self.imageArr.count) {
//最后一張的的后一張是第一張
index = 0;
}
//把index賦給imageView 起到媒介作用, 后面拿到tag 就是pageControl的index
imageView.tag = index;
imageView.image = [UIImage imageNamed:self.imageArr[index]];
}
//跳轉到中間圖片位置
self.scrollView.contentOffset = CGPointMake(self.scrollView.frame.size.width, 0);
}
在scrollViewDidScroll方法中獲取滑動結束后停留在最中間位置的UIImageView, 就是當前顯示的圖片。
#pragma mark - UIScrollviewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
//找到位于最中間的imageView;
//scroll滾動時 判斷三個圖片的x與scrollView的contentOffset的x 的絕對值最小的就是即將停在最中間的imageView
NSInteger page = 0;
CGFloat minDistance = MAXFLOAT;
for (int i = 0; i<COUNT; i++) {
ZZHImageView *imageView = self.scrollView.subviews[i];
CGFloat distance = ABS(imageView.frame.origin.x - scrollView.contentOffset.x);
if (distance < minDistance) {
minDistance = distance;
//拿到中間位置的tag 設置 pageControl 的currentPage
page = imageView.tag;
}
}
//當前是第幾張圖片
self.pageControl.currentPage = page;
}
//手動拖拽結束后重新渲染
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self updateImage];
}
//定時器 動畫結束后重新渲染
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView
{
[self updateImage];
}
Demo地址( https://github.com/heiheiLqq/ZZHBannerDemo )
UIScrollVIew 實現(xiàn)相冊圖片放大縮小功能
通常我們看到的類似相冊捏合放大縮小圖片的功能也是用scrollView做的
- 一個簡單的例子
//在scrollView中添加一個UIImageView
UIImageView *imageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"我是圖片"]];
[self.scrollview addSubview:imageView];
self.imageView = imageView;
//設置捏合的形變最大值最小值
self.scrollview.maximumZoomScale = 2.0;
self.scrollview.minimumZoomScale = 0.2;
//在代理方法設置進行可以進行捏合的控件,必須是scrollView的子控件
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
return self.imageView;
}
//用戶捏合過程中會走一下的代理方法
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
//被捏合控件的形變值
NSLog(@"縮放ing-----%f", scrollView.zoomScale);
//圖片縮小放大的時候圖片不會居中,在該方法中設置圖片中心點
self.imageView.center=self.scrollview.center
}
UIScrollView無法滾動的解決辦法
- 沒有設置contentSize
- scrollEnabled = NO
- 沒有接收到觸摸事件:userInteractionEnabled = NO
這波總結先到這作為程序員我還是個小白,其實最常用的UITableView和UICollectionView ,準備接下來兩天在自己總結下,第一次在簡書上寫文章,希望像記筆記一樣記錄一下自己的成長,希望大家多多支持!