API--UIScrollView API详解

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

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;

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding>

  //默认为 CGPointZero 设置滚动的偏移量
@property(nonatomic)         CGPoint                      contentOffset;

 // 默认为 CGSizeZero 设置滚动的区域
@property(nonatomic)         CGSize                       contentSize;

 // 内容视图边缘嵌入的间距
@property(nonatomic)         UIEdgeInsets                 contentInset;

    // 默认为nil 弱引用 UIScrollView的代理
@property(nullable,nonatomic,weak) id<UIScrollViewDelegate>        delegate;

 //设置是否锁定,这个属性很有意思,默认为NO,当设置为YES时,你的滚动视图只能同一时间在一个方向上滚动,但是当你从对角线拖动时,是时刻在水平和竖直方向同时滚动的。
@property(nonatomic,getter=isDirectionalLockEnabled) BOOL directionalLockEnabled;

 // 默认为YES,回弹效果
@property(nonatomic)         BOOL                         bounces;

 // 默认为NO,竖直方向上的回弹效果
@property(nonatomic)         BOOL                         alwaysBounceVertical;

// 默认为NO,水平方向上的回弹效果
@property(nonatomic)         BOOL                         alwaysBounceHorizontal;

// 默认为NO. 是否开启翻页效果
@property(nonatomic,getter=isPagingEnabled) BOOL          pagingEnabled 

__TVOS_PROHIBITED;
 // 默认YES,是否可以拉动
@property(nonatomic,getter=isScrollEnabled) BOOL          scrollEnabled;

//默认为YES,展示水平或者竖直上的滑块
@property(nonatomic)         BOOL                         showsHorizontalScrollIndicator;
@property(nonatomic)         BOOL                         showsVerticalScrollIndicator;

//设置滑动条的位置
@property(nonatomic)         UIEdgeInsets                 scrollIndicatorInsets;

//设置滑动条风格,枚举如下:
@property(nonatomic)         UIScrollViewIndicatorStyle   indicatorStyle;
typedef NS_ENUM(NSInteger, UIScrollViewIndicatorStyle) {
    UIScrollViewIndicatorStyleDefault,     //默认
    UIScrollViewIndicatorStyleBlack,       //黑色风格
    UIScrollViewIndicatorStyleWhite        //白色风格
};

//  设置滑动速度  值域 0~1 值越小减速停止的时间越短
@property(nonatomic)         CGFloat                      decelerationRate NS_AVAILABLE_IOS(3_0);

//设置滚动视图内容的偏移量,可以带动画效果
- (void)setContentOffset:(CGPoint)contentOffset animated:(BOOL)animated;
- 
// 设置滚动视图滚动到某个可见区域,可以带动画效果
- (void)scrollRectToVisible:(CGRect)rect animated:(BOOL)animated;

//显示一个短暂的滚动指示器
- (void)flashScrollIndicators;


//获取用户是否触及视图内容,如果已经触摸,还没移动返回yes
@property(nonatomic,readonly,getter=isTracking)     BOOL tracking;

//获取用户是否开始拖动视图,如果开始滚动,到到达目标位置之间的时间内返回yes
@property(nonatomic,readonly,getter=isDragging)     BOOL dragging;

//获取视图是否开始减速(用户停止拖动但视图仍在滚动)
@property(nonatomic,readonly,getter=isDecelerating) BOOL decelerating;

//设置视图是否延迟处理触摸事件(会将消息传递给子视图),默认为yes,如果no,立刻会触发-touchesShouldBegin:withEvent:inContentView:
//是个布尔值,当值是 YES 的时候,用户触碰开始,scroll view要延迟一会,看看是否用户有意图滚动。假如滚动了,那么捕捉 touch-down 事件,否则就不捕捉。
//假如值是NO,当用户触碰, scroll view 会立即触发 touchesShouldBegin:withEvent:inContentView:,默认是 YES
@property(nonatomic) BOOL delaysContentTouches;

//当值是 YES 的时候,用户触碰后,然后在一定时间内没有移动,scrollView 发送 tracking events,然后用户移动手指足够长度触发滚动事件,
//这个时候,scrollView 发送了 touchesCancelled:withEvent: 到 subview,然后 scroView 开始滚动。假如值是 NO,scrollView 发送 tracking events 后,就算用户移动手指,scrollView 也不会滚动
//设置是否给子视图传递取消动作的消息(默认设置为YES,当scrollView触发事件的时候,其子视图不能触发,如果设置为NO,则子视图会继续触发事件)
@property(nonatomic) BOOL canCancelContentTouches;

//重写这两个方法可以控制起子视图的事件响应
- (BOOL)touchesShouldBegin:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event inContentView:(UIView *)view;
- (BOOL)touchesShouldCancelInContentView:(UIView *)view;

//设置内容最小缩放比例,默认为1.0
@property(nonatomic) CGFloat minimumZoomScale;

//设置内容最大缩放比例,默认为1.0,必须大于最小缩放比例
@property(nonatomic) CGFloat maximumZoomScale;

//设置缩放比例,默认1.0
@property(nonatomic) CGFloat zoomScale NS_AVAILABLE_IOS(3_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);

//设置是否可以缩放回弹,默认为YES
@property(nonatomic) BOOL  bouncesZoom;

//获取是否正在缩放模式
@property(nonatomic,readonly,getter=isZooming)       BOOL zooming;

//获取是否当前的缩放比例超出设置的峰值,
@property(nonatomic,readonly,getter=isZoomBouncing)  BOOL zoomBouncing;

//设置是否点击状态栏滚动到scrollView的最上端,默认yes
@property(nonatomic) BOOL  scrollsToTop __TVOS_PROHIBITED;

//只读,移动的手势
@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); 

// 默认为UIScrollViewKeyboardDismissModeNone
typedef NS_ENUM(NSInteger, UIScrollViewKeyboardDismissMode) {
    UIScrollViewKeyboardDismissModeNone,       // 不作为
    UIScrollViewKeyboardDismissModeOnDrag,      //手指滑动视图键盘就会消失
    UIScrollViewKeyboardDismissModeInteractive, //手指滑动视图后可以与键盘交互,上下滑动键盘会跟随手指上下移动
};

//上拉下拉刷新视图,可以自定义,下面有例子:
@property (nonatomic, strong, nullable) UIRefreshControl *refreshControl NS_AVAILABLE_IOS(10_0) __TVOS_PROHIBITED;

/*
- (void)viewDidLoad
{
    UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, 500, 500)];
    scrollView.userInteractionEnabled = TRUE;
    scrollView.scrollEnabled = TRUE;
    scrollView.backgroundColor = [UIColor whiteColor];
    scrollView.contentSize = CGSizeMake(500, 1000);
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(Refresh:) forControlEvents:UIControlEventValueChanged];
    [scrollView addSubview:refreshControl];
    [self.view addSubview:scrollView];
}

- (void)Refresh:(UIRefreshControl *)refreshControl
{
    refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Refreshing data..."];
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [NSThread sleepForTimeInterval:3];
        dispatch_async(dispatch_get_main_queue(), ^{
            NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
            [formatter setDateFormat:@"MMM d, h:mm a"];
            NSString *lastUpdate = [NSString stringWithFormat:@"Last updated on %@", [formatter stringFromDate:[NSDate date]]];
            refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:lastUpdate];
            [refreshControl endRefreshing];
            NSLog(@"refresh end");
        });
    });
}
*/

@end

//协议部分
@protocol UIScrollViewDelegate<NSObject>
@optional
// 滑动时多次调用,offset值改变即滑动过程中,便会调用该代理函数
- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
- 
// 缩放时多次调用,zoomScale值改变即缩放过程中,便会调用该函数
- (void)scrollViewDidZoom:(UIScrollView *)scrollView NS_AVAILABLE_IOS(3_2);

// 开始滑动时调用,只调用一次,手指不松开只算一次
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView;

// 已经结束滚动时调用,只调用一次,当手指离开达成时执行
- (void)scrollViewWillEndDragging:(UIScrollView *)scrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset NS_AVAILABLE_IOS(5_0);

// 结束滑动时调用,只调用一次,手指离开时执行
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate;

// 开始减速时调用,只调用一次,当内容视图开始减速状态执行
- (void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView;

// 结束减速时调用,只调用一次,当内容视图结束减速状态执行
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView;

// 滚动动画结束时调用,没有动画则不调用
- (void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView;

// 返回将要缩放的UIView对象,调用多次
- (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;

// 当用户点击状态栏内容视图是否滚动到顶部
- (BOOL)scrollViewShouldScrollToTop:(UIScrollView *)scrollView;

// 滚动到顶部时调用
- (void)scrollViewDidScrollToTop:(UIScrollView *)scrollView;

@end
NS_ASSUME_NONNULL_END

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

推荐阅读更多精彩内容