UIScrollView

1、创建与设置控件

UIScrollView *scrollView = [[UIScrollView alloc] init];
[self addSubview:scrollView];
scrollView.frame = CGRectMake(10, 10, 100, 100);
scrollView.backgroundColor = [UIColor yellowColor];

UIButton *button = [UIButton buttonWithType:UIButtonTypeSystem];
button.backgroundColor = [UIColor blueColor];
button.frame = CGRectMake(10, 10, 300, 100);
[scrollView addSubview:button];

// 设置可以滚动的范围, 默认 CGSizeZero == CGSizeMake(0, 0)
scrollView.contentSize = CGSizeMake(1000, 1000);
// 偏移量, 滚动的位置, 默认 CGPointZero
// 不设置contentSize, contentOffset也可以改变
// 问题: 改变contentOffset什么变了?
// 答案: 改变contentOffset, 实质上是对scrollView的bounds进行了改变.(改变子视图的坐标)
scrollView.contentOffset = CGPointMake(0, 500);
// 添加滚动区域四周的滚动范围
scrollView.contentInset = UIEdgeInsetsMake(10, 10, 10, 10);
// 锁定垂直或水平滚动(45度角, 锁会失效)
scrollView.directionalLockEnabled = YES;
// 回弹效果:边缘弹动动画关闭 NO
// scrollView.bounces = NO;
// 在没有垂直方向的滚动范围时(0), 保证垂直方向的回弹效果
scrollView.alwaysBounceVertical = YES;
// 在没有水平方向的滚动范围时(0), 保证垂直方向的回弹效果
scrollView.alwaysBounceHorizontal = YES;
// 按页滚动
scrollView.pagingEnabled = YES;
// 滚动视图能否滚动, 默认为YES, NO(不可以滚)
scrollView.scrollEnabled = YES;
// 是否显示水平滚动指示器
scrollView.showsHorizontalScrollIndicator = YES;
// 是否显示垂直滚动的指示器
scrollView.showsVerticalScrollIndicator = YES;
// 滚动指示器的边距
scrollView.scrollIndicatorInsets = UIEdgeInsetsMake(0, 100, 0, 0);
// 滚动指示器的颜色(深色背景丶浅色背景)
scrollView.indicatorStyle = UIScrollViewIndicatorStyleBlack;
// scrollsToTop 滚动视图, 双击状态栏手势是否存在
scrollView.scrollsToTop = NO;
// 键盘消失模式(一般用这个UIScrollViewKeyboardDismissModeOnDrag)
scrollView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;
// 缩放系数:如果想进行视图放大缩小, 必须实现viewForZoomingInScrollview:
scrollView.minimumZoomScale = 2;
scrollView.maximumZoomScale = 6;
// 获取当前缩放倍数
CGFloat zoomScale = scrollView.zoomScale;
// 代理
scrollView.delegate = self;

2、代理方法

  • 2.1 拖拽

// 将要开始拖拽
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {

}

// 将要结束拖拽
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset {

}

// 已经结束拖拽,decelerate 松手后 是否有惯性滚动 0:没有,1:有
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate {

}
  • 2.2 滚动

// 滚动过程中,只要滚动就会触发
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { 

}

// 已经结束滚动,滚动动画停止时执行,代码改变时触发,也就是 setContentOffset 改变时
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView {

}
  • 2.3 惯性滚动

// 将要开始惯性滚动
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView {

}

// 已经结束惯性滚动
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView {

}
  • 2.4 滚到顶端

// 设置点击状态栏时是否滚到顶端
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView {
    return YES;
}

// 已经滚到顶端,点击状态栏时调用
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView {

}
  • 2.5 缩放

// 设置被缩放的空间,一个 scrollView 中只能有一个子控件被缩放,如果有很多个子控件缩放时会引起错乱
- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return [scrollView.subviews[0] viewWithTag:100];
}

// 将要开始缩放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(UIView *)view {

}

// 已经结束缩放
- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(UIView *)view atScale:(CGFloat)scale {

}

// 缩放过程中,只要缩放就会触发
- (void)scrollViewDidZoom:(UIScrollView *)scrollView {

}

3、常见问题

  • 3.1 如果 UIScrollView 无法滚动,可能是以下原因:

    • 没有设置 contentSize
    • scrollEnabled = NO
    • 没有接收到触摸事件 userInteractionEnabled = NO
posted @ 2019-10-15 22:27  CH520  阅读(197)  评论(0编辑  收藏  举报