API_UIScrollView

对API中的UIScrollView的属性、方法以及使用的记录,如果有什么不准确的地方,欢迎大家来指出、补充。

更新一篇UIScrollView的API记录,之后会陆续发一些其他类的API记录。代码链接在本文最下方,欢迎Star或者Fark。

//
//  UIScrollView.h
//  UIKit
//
//  Copyright (c) 2007-2015 Apple Inc. All rights reserved.
//
//  Coder_Sun的GitHub地址:https://github.com/272095249
//  Coder_Sun简书网址:http://www.jianshu.com/u/87c7aa9de064
//  iOS-源码解析专栏:http://www.jianshu.com/c/7fe8b38a197b
//

#import <Foundation/Foundation.h>
#import <CoreGraphics/CoreGraphics.h>
#import <UIKit/UIView.h>
#import <UIKit/UIGeometry.h>
#import <UIKit/UIKitDefines.h>

NS_ASSUME_NONNULL_BEGIN

UIScrollViewIndicatorStyle
typedef NS_ENUM(NSInteger, UIScrollViewIndicatorStyle) {
    UIScrollViewIndicatorStyleDefault,     // 黑与白边,在任何背景下都很好
    UIScrollViewIndicatorStyleBlack,       // 只有黑色,小,在白色背景下良好
    UIScrollViewIndicatorStyleWhite        // 只有白色,小,在黑色背景下良好
};
UIScrollViewIndicatorStyle
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
    UIScrollViewKeyboardDismissModeNone,
    UIScrollViewKeyboardDismissModeOnDrag,      // 当拖动时键盘消失
    UIScrollViewKeyboardDismissModeInteractive, // 键盘跟随拖动触摸屏,并可能再次向上拉,取消消失
} NS_ENUM_AVAILABLE_IOS(7_0);


UIKIT_EXTERN const CGFloat UIScrollViewDecelerationRateNormal NS_AVAILABLE_IOS(3_0);
UIKIT_EXTERN const CGFloat UIScrollViewDecelerationRateFast NS_AVAILABLE_IOS(3_0);

@class UIEvent, UIImageView, UIPanGestureRecognizer, UIPinchGestureRecognizer;
@protocol UIScrollViewDelegate;

UIScrollView
NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding>
@property(nonatomic)         CGPoint                      contentOffset;                  // 在滚动视图中,contentOffset属性可以跟踪UIScrollView的具体位置,你能够自己获取和设置它,contentOffset的值是你当前可视内容在滚动视图上面偏移原来的左上角的偏移量
@property(nonatomic)         CGSize                       contentSize;                    // contentSize是内容大小,也就是可以滚动的大小,默认是0,没有滚动效果
@property(nonatomic)         UIEdgeInsets                 contentInset;                   // contentInset增加你在contentSize中指定的内容能够滚动的上下左右区域的距离。
@property(nullable,nonatomic,weak) id<UIScrollViewDelegate>        delegate;                       // default nil. weak reference
@property(nonatomic,getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;         // 默认是NO,指定控件是否只能在一个方向上滚动(默认NO)
@property(nonatomic)         BOOL                         bounces;                        // 默认是YES,就是滚动超过边界会反弹,有反弹回来的效果,如果是NO,那么滚动到达边界会立即停止
@property(nonatomic)         BOOL                         alwaysBounceVertical;           // 默认是NO,如果是YES并且边界可以反弹,即使边界比较小,允许垂直拖动
@property(nonatomic)         BOOL                         alwaysBounceHorizontal;         // 默认是NO,如果是YES并且边界可以反弹,即使边界比较小,允许横向拖动
@property(nonatomic,getter=isPagingEnabled) BOOL          pagingEnabled __TVOS_PROHIBITED;// 当值是YES会自动滚到视图边界的倍数上,默认为NO(也就是是否整页翻动)
@property(nonatomic,getter=isScrollEnabled) BOOL          scrollEnabled;                  // 默认是YES,决定是否可以滚动
@property(nonatomic)         BOOL                         showsHorizontalScrollIndicator; // default YES. 滚动时是否显示水平滚动条
@property(nonatomic)         BOOL                         showsVerticalScrollIndicator;   // default YES. 滚动时是否显示垂直滚动条
@property(nonatomic)         UIEdgeInsets                 scrollIndicatorInsets;          // 设置滚动条的位置
@property(nonatomic)         UIScrollViewIndicatorStyle   indicatorStyle;                 // 滚动条的样式,基本只是设置颜色,总共3个颜色:默认、黑、白
@property(nonatomic)         CGFloat                      decelerationRate NS_AVAILABLE_IOS(3_0);       // 设置手指放开后的减速率


- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;  // 以恒定速度的动画到新的偏移量
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;         // scroll so rect is just visible (nearest edges). nothing if rect completely visible         
// 上面这两个函数用来自动滚到想要的位置,此过程中设置有动画效果,停止时,触发该函数。当animated为YES的时候有动画效果


- (void)flashScrollIndicators;             // 短时间内显示滚动条

/*
 Scrolling with no scroll bars is a bit complex. on touch down, we don't know if the user will want to scroll or track a subview like a control.
 on touch down, we start a timer and also look at any movement. if the time elapses without sufficient change in position, we start sending events to
 the hit view in the content subview. if the user then drags far enough, we switch back to dragging and cancel any tracking in the subview.
 the methods below are called by the scroll view and give subclasses override points to add in custom behaviour.
 you can remove the delay in delivery of touchesBegan:withEvent: to subviews by setting delaysContentTouches to NO.

没有滚动条的滚动是一个有点复杂的。在触摸结束后,我们不知道用户将要滚动画着跟踪视图像控制。
在接触下来,我们开始一个计时器,也看任何运动。如果没有足够的时间改变位置,我们开始向中观的内容试图发送事件。如果用户拖拽足够远,我们切换回拖和取消在子视图的任何跟踪。
下面的方法是由滚动视图调用的,给子类重写点添加自定义行为。
你可以删除交货延迟 touchesBegen:withEvent: 设置子视图的delaysContentTouches


 */

@property(nonatomic,readonly,getter=isTracking)     BOOL tracking;        // 当用户touch后还没有开始拖动的时候是YES,否则为NO
@property(nonatomic,readonly,getter=isDragging)     BOOL dragging;        // 如果scrollView正在被拖动,返回YES(检测当前目标是否正在被拖拽)
@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;    // 当滚动后,手指放开但是孩子啊继续滚动中。这个时候是YES,其他时候是NO(监控当前目标是否正在减速)

@property(nonatomic) BOOL delaysContentTouches;       // 默认是YES,当值是YES的时候,用户触碰开始,scrollView要延迟一会,看看用户是否有意图滚动。加入滚动了,那么捕捉touch-down时间,否则就不捕捉。加入值是NO,当用户触碰,scrollView会立即触发(控制试图是否延时调用开始滚动的方法)

@property(nonatomic) BOOL canCancelContentTouches;    // 当值是YES的时候,用户触碰后,然后在一定时间内没有移动,scrollView发送tracking events,然后用户移动手指足够长度触发滚动事件,这个时候scrollView发送了touchesCancelled:withEvent:到subView,然后scrollView开始滚动。假如为NO,scrollView发送tracking events后,就算用户移动手指,scrollView也不会滚动(控制控件是否接触取消touch的事件)


- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event inContentView:(UIView *)view;    // 默认是YES,当值是YES的时候,用户触碰开始,scrollView要延迟一会,看看用户是否有意图滚动。加入滚动了,那么捕捉touch-down时间,否则就不捕捉。加入值是NO,当用户触碰,scrollView会立即触发(控制试图是否延时调用开始滚动的方法)


- (BOOL)touchesShouldCancelInContentView:(UIView *)view;    // 开始发送tracking message消息给subview的时候调用这个方法,决定是否发送tracking message消息给subView,假如返回NO,发送,YES则不发送




@property(nonatomic) CGFloat minimumZoomScale;     // default is 1.0  表示能缩最小的倍数
@property(nonatomic) CGFloat maximumZoomScale;     // default is 1.0. 表示能放最大的倍数

@property(nonatomic) CGFloat zoomScale NS_AVAILABLE_IOS(3_0);            // default is 1.0
- (void)setZoomScale:(CGFloat)scale animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);
- (void)zoomToRect:(CGRect)rect animated:(BOOL)animated NS_AVAILABLE_IOS(3_0);

@property(nonatomic) BOOL  bouncesZoom;          // 和bounces类似,区别在于:这个效果反应在缩放方面加入缩放超过最大缩放,那么会有反弹效果;假如是NO,则到达最大或者最小的时候立即停止

@property(nonatomic,readonly,getter=isZooming)       BOOL zooming;       // 当正在缩放的时候是YES,否则是NO
@property(nonatomic,readonly,getter=isZoomBouncing)  BOOL zoomBouncing;  // 当内容放大到最大或者缩小到最小的时候值是YES,否则是NO

@property(nonatomic) BOOL  scrollsToTop __TVOS_PROHIBITED;          // default is YES.      是否支持滑动到最顶端(点击状态条的时候)


@property(nonatomic, readonly) UIPanGestureRecognizer *panGestureRecognizer NS_AVAILABLE_IOS(5_0);  // 手势类:拖拽

@property(nullable, nonatomic, readonly) UIPinchGestureRecognizer *pinchGestureRecognizer NS_AVAILABLE_IOS(5_0);  // 手势类:捏合

@property(nonatomic, readonly) UIGestureRecognizer *directionalPressGestureRecognizer UIKIT_AVAILABLE_TVOS_ONLY(9_0);   // 手势识别器

@property(nonatomic) UIScrollViewKeyboardDismissMode keyboardDismissMode NS_AVAILABLE_IOS(7_0); // default is UIScrollViewKeyboardDismissModeNone       当拖动时键盘消失

@end

UIScrollViewDelegate
@protocol UIScrollViewDelegate<NSObject>

@optional

// scrollView已经滑动
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;

// 视图已经放大或者缩小
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2);

// scrollView开始拖动
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;         

// scrollView即将停止拖拽
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);

// scrollView结束拖动
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

// scrollView即将减速完成
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;

// scrollView减速完成
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

// scrollView结束减速并且必须有动画效果才会触发(必须要有动画效果)
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

// 返回缩放后的试图,但只能返回scrollView(内容)上的子视图
- (nullable UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView;

// 开始缩放
- (void)scrollViewWillBeginZooming:(UIScrollView *)scrollView withView:(nullable UIView *)view NS_AVAILABLE_IOS(3_2);

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

// 点击状态栏,调用此方法,此方法能实现的前提是scrollToTop的属性是YES
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

// scrollView已经回到顶部了
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;

@end

NS_ASSUME_NONNULL_END
相关链接:

iOS-源码解析专栏

记录文件已经上传至git:

--> 传送门:SH_The-record-of-the-API

有问题欢迎指正以及相互探讨 —— CoderSun

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,951评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,606评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,601评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,478评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,565评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,587评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,590评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,337评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,785评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,096评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,273评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,935评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,578评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,199评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,440评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,163评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,133评论 2 352

推荐阅读更多精彩内容