本文共 8518 字,大约阅读时间需要 28 分钟。
1. sb中拖scrollView2. 设置scrollView上下左右为04. 拖一个UIView"yellowView"到scrollView中(不是imageView)5. 设置yellowView的自动布局上下左右为0(此时报错,实际缺少尺寸"无法算出contentSize")6. 设置yellowView和scrollView等宽等高7. 更新frame,并运行
8.设置yellowView宽约束的是scrollView宽的2倍,并运行
9. 设置yellowView顶部约束为64,并运行,会影响它的contentSize10. 给yellowView上的添加按钮,并设置约束,演示分页属性,并运行
1. 设置scrollView中内容的距离scrollView四边边距值,会影响contentSize即滚动范围,上下间距 会影响contentSize的Hieght"垂直滚动范围",左右间距会影响水平滚动范围(不常用,了解装逼使用)2. 如果用AutoLayout约束scrollView中的内容时只设置四边间距约束是不够的,还要设置view宽高3. 除了UIImageView可以不用直接设置宽高,因为它里面如果设置了图片,imageView的size会根据图片 自适应,对应设置 scrollView的contentSize4. 切记scrollView在实用自动布局时比较特殊5. 建议:如果一个scrollView中有很多小控件可以把小控件添加一个容器视图 view,设置容器view的尺 寸为contentSize
- (void)scrollViewDidScroll:(UIScrollView *)scrollView { NSLog(@"%@", @"scrollview视图开始滚动");}- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView { NSLog(@"%@", @"将要减速 - 在释放开手之后调用");}- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView { NSLog(@"%@", @"完成减速 - 完全静止后调用");}
实现缩放的两个步骤
- 需要设置最小缩放比例(minimumZoomScale)和最大缩放比例(maximumZoomScale)都为1时无法缩放
- 需要实现 “viewForZoomingInScrollView” 方法 告诉 scrollView 缩放的视图
( 只要缩放就会调用 )
// 告诉滚动视图缩放的视图- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView { return _imageView;}// @param scrollView 滚动视图// @param view 缩放的视图- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view { NSLog(@"%@", @"缩放开始时调用");}/// @param scrollView 滚动视图- (void)scrollViewDidZoom:(UIScrollView *)scrollView { NSLog(@"%@",@"正在缩放时调用");}/// @param scrollView 滚动视图/// @param view 缩放的视图/// @param scale 缩放的比例- (void)scrollViewDidEndZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view atScale:(CGFloat)scale { NSLog(@"%@",@" 缩放结束后调用");}
/// @param scrollView 滚动视图- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { NSLog(@"%@", @"将要开始拖拽");}/// @param scrollView 滚动视图/// @param velocity 速度/// @param targetContentOffset 目标偏移位置- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset { NSLog(@"%@", @"将要结束拖拽");}/// @param scrollView 滚动视图/// @param decelerate 是否减速- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { NSLog(@"%@ %d", @"完成拖拽方法,手指放开后调用", decelerate); }
结合 self.scrollView.scrollsToTop = YES;使用要告诉它点了状态栏对那个scrollView进行滚动- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView { NSLog(@"%@", @"将要滚动到顶部,点击状态栏时调用"); return YES;}- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView { NSLog(@"%@", @"已经滚动到状态栏");}
/** The scroll view calls this method at the end of its implementations of the setContentOffset:animated: and scrollRectToVisible:animated: methods, but only if animations are requested. 滚动视图会在实现了 setContentOffset:animated: & scrollRectToVisible:animated: 方法之后 调用此方法 同时必须在上述两个方法中允许动画 */- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView { NSLog(@"%@", @"调用动画结束");}
scrollView知道被滚动了,但是不知道被滚动以后将要做什么
手写代理步骤
// 内容偏移位置@property(nonatomic) CGPoint contentOffset; // default CGPointZero// 内容大小,设置了才可以滚动@property(nonatomic) CGSize contentSize; // default CGSizeZero// 内容间距@property(nonatomic) UIEdgeInsets contentInset;
@property(nullable,nonatomic,weak) iddelegate;要想监听滚动视图的滚动 / 拖拽 / 缩放 / 状态栏交互需要设置 delegate实现相关协议方法
// 允许弹簧效果@property(nonatomic) BOOL bounces; // default YES. if YES, bounces past edge of content and back again// 始终允许垂直弹@property(nonatomic) BOOL alwaysBounceVertical; // default NO. if YES and bounces is YES, even if content is smaller than bounds, allow drag vertically// 始终允许水平弹@property(nonatomic) BOOL alwaysBounceHorizontal;
// 允许分页@property(nonatomic,getter=isPagingEnabled) BOOL pagingEnabled __TVOS_PROHIBITED;// default NO. if YES, stop on multiples of view bounds
// 显示水平指示器@property(nonatomic) BOOL showsHorizontalScrollIndicator; // default YES. show indicator while we are tracking. fades out after tracking// 显示垂直指示器@property(nonatomic) BOOL showsVerticalScrollIndicator; // default YES. show indicator while we are tracking. fades out after tracking// 指示器间距@property(nonatomic) UIEdgeInsets scrollIndicatorInsets; // default is UIEdgeInsetsZero. adjust indicators inside of insets// 指示器样式@property(nonatomic) UIScrollViewIndicatorStyle indicatorStyle; // default is UIScrollViewIndicatorStyleDefault在 scrollView 中指示器本质上就是 UIImageView通过查看视图层次结构可以看到
// 最小缩放比例@property(nonatomic) CGFloat minimumZoomScale; // default is 1.0// 最大缩放比例@property(nonatomic) CGFloat maximumZoomScale; // default is 1.0. must be > minimum zoom scale to enable zooming要允许缩放必须设置以上两个属性同时遵守协议实现协议方法 -viewForZoomingInScrollView:
// 点击状态栏滚动到顶部// default is YES. TVOS上此属性禁用,@property(nonatomic) BOOL scrollsToTop __TVOS_PROHIBITED; 一个视图中,如果有多个 scrollView只有唯一一个 scrollView 的 scrollsToTop 属性设置为 YES,才支持点击状态栏滚动到顶部虽然此属性默认值即为YES不过还要要设置,不然不知道点了状态栏要对那个scrollView进行滚动
// 键盘解除模式@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode NS_AVAILABLE_IOS(7_0); // default is UIScrollViewKeyboardDismissModeNone如果是 UITextView,通常需要将 alwaysBounceVertical 属性设置为 YEStypedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) { // 无 UIScrollViewKeyboardDismissModeNone, // 拖拽关闭键盘 UIScrollViewKeyboardDismissModeOnDrag, // dismisses the keyboard when a drag begins // 必须要拖拽到键盘才可以关闭键盘,很少使用 UIScrollViewKeyboardDismissModeInteractive, // the keyboard follows the dragging touch off screen, and may be pulled upward again to cancel the dismiss} NS_ENUM_AVAILABLE_IOS(7_0);
// 动画设置偏移位置- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated; // animate at constant velocity to new offset// 动画设置滚动区域- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated; // scroll so rect is just visible (nearest edges). nothing if rect completely visible
- scale的意思是:缩放,在contentMode中出现的话,就是要改变图形的大小了。- aspect的意思是纵横的比例,在contentMode中的意思是保持图形的纵横比,保持图片不变形。scale to fill:缩放图片,使图片充满容器。因为没有aspect,所以是不保持纵横比的。图片不是按比例缩放的。scale aspect fit: 在保持纵横比(aspect)的前提下,缩放图片(scale),使图片在容器内都显示出来(fit)。 保证图片完整显示,但不保证能充满容器。scale aspect fill:在保持纵横比(aspect)的前提下,缩放图片(scale),使图片充满容器(fill)。保证图片能 充满容器,不保证图片能完整显示。
ZFBGuideView *guideView = [[ZFBGuideView alloc] initWithFrame:self.view.bounds];
ZFBGuideView *guideView = [[ZFBGuideView alloc] init];guideView.frame = self.view.bounds;
转载地址:http://tykii.baihongyu.com/