UIScrollView(包括它的子類UITableView和UICollectionView)是iOS開(kāi)發(fā)中最常用的UI組件灯荧,大部分App的核心界面都是基于三者之一或者三者的組合實(shí)現(xiàn)的步脓。UIScrollView是UIKit中為數(shù)不多的能響應(yīng)滑動(dòng)收拾的View歹颓,相比自己用手勢(shì)去實(shí)現(xiàn)欧引,UIScrollView的體驗(yàn)更好。
UIScrollView的常見(jiàn)屬性
//展示的大小
@property(nonatomic) CGRect frame;
//內(nèi)容的大小(可以滾動(dòng)的大小)
//如果想在水平方向不讓滾動(dòng)耐床,可以設(shè)置width=0澜公,也就是如果在垂直方向上不想滾動(dòng),可以設(shè)置height=0
@property(nonatomic) CGSize contentSize;
//設(shè)置scrollView能否滾動(dòng)
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
//能否接收觸摸事件
@property (nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled;
//表示scrollView滾動(dòng)的位置
//內(nèi)容左上角和scrollView的左上角的間距值
@property(nonatomic) CGPoint contentOffset;
//這個(gè)屬性能夠在UIScrollView的4周增加額外的滾動(dòng)區(qū)域
@property(nonatomic) UIEdgeInsets contentInset;
//設(shè)置UIScrollView是否需要彈簧效果
@property(nonatomic) BOOL bounces;
//是否顯示水平滾動(dòng)條
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
//是否顯示垂直滾動(dòng)條
@property(nonatomic) BOOL showsVerticalScrollIndicator;
從網(wǎng)上找了一張圖片來(lái)描述UIScrollView
的尺寸:
UIScrollView的常用代理
下面列出幾個(gè)常用的代理方法:
/**
* 只要是拖動(dòng)萍歉,都會(huì)調(diào)用侣颂,調(diào)用頻率很高,官方的解釋是: any offset changes
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
}
/**
* 即將開(kāi)始拖拽的時(shí)候調(diào)用
*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
}
/**
* 結(jié)束拖拽的時(shí)候調(diào)用
*/
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
}
/**
* (減速完畢)由于慣性停止?jié)L動(dòng)的時(shí)候調(diào)用
*/
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
}
UIScrollView的縮放
- 縮放需要設(shè)置的幾個(gè)點(diǎn):
- 需要設(shè)置最大縮放比例和最小縮放比例
- 需要指定縮放的內(nèi)容
- 這個(gè)內(nèi)容需要在代理中返回
// 最小縮放比例
// 默認(rèn)是1.0
@property(nonatomic) CGFloat minimumZoomScale;
// 最大縮放比例
// 默認(rèn)是1.0 必須大于等于 minimumZoomScale
@property(nonatomic) CGFloat maximumZoomScale;
/**
這個(gè)方法的返回值決定了要縮放的內(nèi)容(返回值只能是UIScrollView的子控件)
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
}
/**
只要縮放比例有變化枪孩,就會(huì)調(diào)用該方法
*/
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
}
UIScrollView和UIPageControl的分頁(yè)
- 只要將UIScrollView的
pageEnabled
屬性設(shè)置為YES憔晒,UIScrollView會(huì)被分割成多個(gè)獨(dú)立的頁(yè)面,里面的內(nèi)容就能進(jìn)行分頁(yè)展示蔑舞。 - 一般使用分頁(yè)功能拒担,都會(huì)配合
UIPageControl
增強(qiáng)分頁(yè)效果
UIPageControl常用屬性如下:
//一共多少頁(yè)
@property(nonatomic) NSInteger numberOfPages;
//當(dāng)前顯示的頁(yè)碼
@property(nonatomic) NSInteger currentPage;
//只有一頁(yè)時(shí),是否需要隱藏頁(yè)碼指示器
@property(nonatomic) BOOL hidesForSinglePage;
//其他頁(yè)碼指示器的顏色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
//當(dāng)前頁(yè)碼指示器的顏色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
分頁(yè)的時(shí)候拖動(dòng)攻询,拖動(dòng)超過(guò)一半的時(shí)候放開(kāi)从撼,會(huì)自動(dòng)進(jìn)入到下一頁(yè),如果沒(méi)有超過(guò)一半钧栖,就還是停留在這一頁(yè)低零。這個(gè)時(shí)候我們?nèi)绻險(xiǎn)IPageControl同步進(jìn)行頁(yè)碼的更新的話,那么就需要在UIScrollView的代理方法中進(jìn)行頁(yè)碼的計(jì)算:
/**
* 只要scrollView在滾動(dòng)拯杠,就會(huì)調(diào)用
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 0.3 > (int)(0.3 + 0.5) > 0
// 0.6 > (int)(0.6 + 0.5) > 1
// 小數(shù)四舍五入為整數(shù) : (int)(小數(shù) + 0.5)
self.pageControl.currentPage = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
}
了解了這些掏婶,就可以做出輪播圖了。