UIScrollView(包括它的子类UITableView和UICollectionView)是iOS开发中最常用的UI组件,大部分App的核心界面都是基于三者之一或者三者的组合实现的。UIScrollView是UIKit中为数不多的能响应滑动收拾的View,相比自己用手势去实现,UIScrollView的体验更好。
UIScrollView的常见属性
//展示的大小
@property(nonatomic) CGRect frame;
//内容的大小(可以滚动的大小)
//如果想在水平方向不让滚动,可以设置width=0,也就是如果在垂直方向上不想滚动,可以设置height=0
@property(nonatomic) CGSize contentSize;
//设置scrollView能否滚动
@property(nonatomic,getter=isScrollEnabled) BOOL scrollEnabled;
//能否接收触摸事件
@property (nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled;
//表示scrollView滚动的位置
//内容左上角和scrollView的左上角的间距值
@property(nonatomic) CGPoint contentOffset;
//这个属性能够在UIScrollView的4周增加额外的滚动区域
@property(nonatomic) UIEdgeInsets contentInset;
//设置UIScrollView是否需要弹簧效果
@property(nonatomic) BOOL bounces;
//是否显示水平滚动条
@property(nonatomic) BOOL showsHorizontalScrollIndicator;
//是否显示垂直滚动条
@property(nonatomic) BOOL showsVerticalScrollIndicator;
从网上找了一张图片来描述UIScrollView
的尺寸:
UIScrollView的常用代理
下面列出几个常用的代理方法:
/**
* 只要是拖动,都会调用,调用频率很高,官方的解释是: any offset changes
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
}
/**
* 即将开始拖拽的时候调用
*/
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
}
/**
* 结束拖拽的时候调用
*/
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
}
/**
* (减速完毕)由于惯性停止滚动的时候调用
*/
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
}
UIScrollView的缩放
- 缩放需要设置的几个点:
- 需要设置最大缩放比例和最小缩放比例
- 需要指定缩放的内容
- 这个内容需要在代理中返回
// 最小缩放比例
// 默认是1.0
@property(nonatomic) CGFloat minimumZoomScale;
// 最大缩放比例
// 默认是1.0 必须大于等于 minimumZoomScale
@property(nonatomic) CGFloat maximumZoomScale;
/**
这个方法的返回值决定了要缩放的内容(返回值只能是UIScrollView的子控件)
*/
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
{
}
/**
只要缩放比例有变化,就会调用该方法
*/
- (void)scrollViewDidZoom:(UIScrollView *)scrollView
{
}
UIScrollView和UIPageControl的分页
- 只要将UIScrollView的
pageEnabled
属性设置为YES,UIScrollView会被分割成多个独立的页面,里面的内容就能进行分页展示。 - 一般使用分页功能,都会配合
UIPageControl
增强分页效果
UIPageControl常用属性如下:
//一共多少页
@property(nonatomic) NSInteger numberOfPages;
//当前显示的页码
@property(nonatomic) NSInteger currentPage;
//只有一页时,是否需要隐藏页码指示器
@property(nonatomic) BOOL hidesForSinglePage;
//其他页码指示器的颜色
@property(nonatomic,retain) UIColor *pageIndicatorTintColor;
//当前页码指示器的颜色
@property(nonatomic,retain) UIColor *currentPageIndicatorTintColor;
分页的时候拖动,拖动超过一半的时候放开,会自动进入到下一页,如果没有超过一半,就还是停留在这一页。这个时候我们如果想UIPageControl同步进行页码的更新的话,那么就需要在UIScrollView的代理方法中进行页码的计算:
/**
* 只要scrollView在滚动,就会调用
*/
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
// 0.3 > (int)(0.3 + 0.5) > 0
// 0.6 > (int)(0.6 + 0.5) > 1
// 小数四舍五入为整数 : (int)(小数 + 0.5)
self.pageControl.currentPage = (int)(scrollView.contentOffset.x / scrollView.frame.size.width + 0.5);
}
了解了这些,就可以做出轮播图了。