UIScrollView的重要属性总结,以及UIScrollViewDelegate协议的使用

早就想开通博客 写一些每天工作当中的总结与学习,无奈强迫症的我,非要拖到新年伊始,给自己个记录点... 好回到正题.最近经常有身边的朋友问我一些关于UIScrollView控件的问题,现总结如下,供走在iOS开发道路上的每一位朋友参考.如果出现creash,请各位朋友指出,我必虚心接受并改正.



将UIScrollView的总结分为以下几点:

  • UIScrollView的继承与初始化
  • 对UIScrollView的理解
  • UIScrollView的重要属性
  • UIScrollView的偏移量问题
  • UIScrollViewDelegate协议
  • 关于UIScrollVIew的应用




UIScrollView的继承与初始化

NS_CLASS_AVAILABLE_IOS(2_0) @interface UIScrollView : UIView <NSCoding>
UIScrollView继承自UIView, 没有自己的初始化方法, 所以调用UIView的初始化方法 initWithFrame:




对UIScrollView的理解

UIScrollView对于刚刚结束iOS的朋友还是比较抽象的.我们可以理解为通过放映机的镜头显示其后面胶片的内容. 设置frame属性即设置镜头的坐标和宽高.





UIScrollView的重要属性:

@property ( nonatomic )         CGPoint                       contentOffset; > 胶片的偏移量, 胶片相对于镜头左上顶点的偏移大小. 默认为0, 即胶片的左上顶点和镜头的左上顶点重合. 向左移动偏移量为正, 向右移动偏移量为负, 向上为正, 向下为负.
@property ( nonatomic )         CGSize                       contentSize; > 胶片的尺寸, 默认为0, 胶片尺寸宽或高为0, 就是和镜头的宽或高相等.
@property ( nonatomic , assign ) id < UIScrollViewDelegate >      delegate; > 代理人, 设置为遵守了 UIScrollViewDelegate 协议的代理人, 该代理人即可执行监听到的 < UIScrollViewDelegate >协议中定义的方法.
@property ( nonatomic )         BOOL                         bounces; > 如果为YES, 滑动时胶片边缘向内超出了镜头的边缘还会弹回去, 如果为NO, 则不会弹回去. 默认为YES.
@property ( nonatomic )         BOOL                         alwaysBounceVertical; > 如果此属性和bounces同时为YES, 即使胶片小于镜头, 也允许垂直拖拽.
@property ( nonatomic )         BOOL                         alwaysBounceHorizontal;  > 如果此属性和bounces同时为YES, 即使胶片小于镜头, 也允许水平拖拽.
@property ( nonatomic , getter =isPagingEnabled) BOOL           pagingEnabled; > 分页滑动, 如果为YES, 会在每个子视图处停下. 默认为YES.
@property ( nonatomic , getter =isScrollEnabled) BOOL           scrollEnabled; > 允许滑动, 如果为YES, 允许滑动, 如果为NO, 不允许滑动.
@property ( nonatomic ) CGFloat minimumZoomScale; > 最小缩放比例,  指胶片可以缩小为原来的多少倍. 默认为1, 即无法缩小.
@property ( nonatomic ) CGFloat maximumZoomScale; > 最大缩放比例 指胶片可以放大为原来的多少倍. 默认为1, 即无法放大, 必须要大于 minimumZoomScale才能缩放.
@property ( nonatomic ) CGFloat zoomScale NS_AVAILABLE_IOS ( 3 _0); > 缩放比例, 指胶片默认为原来的多少倍. 默认为1.






UIScrollView修改偏移量的方法

- ( void )setContentOffset:( CGPoint )contentOffset animated:( BOOL )animated;
使用次方法可以使改变偏移量时有动画效果, 或者可以直接修改contentSize属性, 但没有动画效果.






UIScrollViewDelegate协议

可以在遵循了UIScrollViewDelegate协议的类中重写以下方法:
- ( void )scrollViewDidScroll:( UIScrollView *)scrollView; > 正在滚动
- ( 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; > 已经结束减速

点击ScrollView并拖拽, 松手, 画面滑到下一页, 停止 的过程中, 执行了: 将要开始拖拽, 正在滚动, 将要结束拖拽, 已经结束拖拽, 将要开始减速, 已经结束减速
 

当UIScrollView监听到相应事件时, 会让遵循协议的代理人执行scrollViewDidScroll:等方法, 但监听的工作不是代理人做的, 而是UIScrollView做的. 方法中的参数scrollView为当前监听这些方法所代表的事件的ScrollView.


UIScrollViewDelegate协议中还有缩放的方法:
- ( UIView *)viewForZoomingInScrollView:( UIScrollView *)scrollView;


如果需要缩放, 需要遵守协议, 并重写该方法:
- ( UIView *)viewForZoomingInScrollView:( UIScrollView *)scrollView{
    NSArray *array = scrollView. subviews > 获得当前ScrollView中的所有子视图
    return [array firstObject ]; > 返回需要放大的内容
}
缩放的时候本质是改变 contentSize






关于ScrollView的应用

说到ScrollView的应用,一个入门的就是简单的相册
要将小ScrollView的宽高设置为与大ScrollView相等

如果图片尺寸不一样, 且需要将每张设定为特定的尺寸, 则需要将每个装有图片的ImageView单独设置尺寸, 并且须根据图片自己的宽高比以不影响图片显示时的宽高比. 在UIImageView中, 图片是根据UIImageView的尺寸拉伸的. 
如果UIImageView的尺寸小于小的ScrollView的contentSize, 也没有关系, 因为在后面可以设置maximumZoomScale属性, 并实现UIScrollViewDelegate协议中viewForZoomingInScrollView:的方法从而可以使之缩放, 而缩放的实质是改变UIScrollView的contentSize属性.

让任何尺寸图片适配ScrollView的方法:

1. 先确定外面大ScrollView的frame
2. 取得图片放到UIImage类型的aImage对象并放到ImageView类型的imageView对象中
3. 设置ImageView的bounds, 分三种情况:
  • 当原图片的 高/宽 > ScrollView 的 高/宽 时, 设图片的高度等于ScrollView的高度, 宽度按比例缩放:
    if ((aImage.size.height / aImage.size.width) > (self.myScroll.frame.size.height / self.myScroll.frame.size.width)) {
        imageView.bounds = CGRectMake(0, 0, self.myScroll.frame.size.height / aImage.size.height * aImage.size.width self.myScroll.frame.size.height);
    }

  • 当原图片的 高/宽 < ScrollView 的 高/宽 时, 设图片的宽度等于ScrollView的宽度, 高度按比例缩放:
    else if ((aImage.size.height / aImage.size.width) < (self.myScroll.frame.size.height / self.myScroll.frame.size.width)){
        imageView.bounds = CGRectMake(0,0, self.myScroll.frame.size.width, self.myScroll.frame.size.width / aImage.size.width * aImage.size.height);
    }

  • 当原图片的 高/宽 == ScrollView的 高/宽 时, 设图片的宽度等于ScrollView的宽度,图片的高度等于ScrollView的高度:
    else if ((aImage.size.height / aImage.size.width) == (self.myScroll.frame.size.height / self.myScroll.frame.size.width)){
        imageView.bounds = CGRectMake(0,0, self.myScroll.frame.size.width, self.myScroll.frame.size.height);
    }
4. 设定imageView的中心点位置:
imageView. center = CGPointMake ( self . myScroll . frame . size . width / 2 , self . myScroll . frame . size . height / 2 );
5. 生成小的UIScrollView对象, 使其frame = 大UIScrollView对象








  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的核心功能: 对象关系映射(ORM): SQLAlchemy 允许开发使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值