iOS开发系列–无限循环的图片浏览器

512 查看

概述

UIKit框架中有大量的控件供开发者使用,在iOS开发中不仅可以直接使用这些控件还可以在这些控件的基础上进行扩展打造自己的控件。在这个系列中如果每个控件都介绍一遍确实没有必要,所谓授人以鱼不如授人以渔,这里会尽可能让大家明白其中的原理,找一些典型的控件进行说明,这样一来大家就可以触类旁通。今天我们主要来看一下UIScrollView的内容:

  1. UIView
  2. UIScrollView
  3. 实战–图片浏览器

UIView

在熟悉UIScrollView之前很有必要说一下UIView的内容。在上一篇文章也简单的对UIView进行了介绍,但是由于那篇文章的主要内容是给大家一个iOS开发的总体印象,因此并没有系统的介绍。另外由于UIScrollView的父类是UIView,所有在讨论UIScrollView之前也很有必要把UIView的知识给补充上,这样大家在使用UIScrollView的某些方法时也不至于无从下手。

既然UIView是所有控件的父类,那么对于一些常用的方法我们很有必要弄清楚,其实在Xcode中要了解一个类有哪些属性和方法特别简单,只要按住apple键点击类名就可以定位到这个类中查看相关定义(在日后的开发中我们会经常这么来做,毕竟要记住iOS开发中所有的API是不现实的,有些API我们可以通过这种方法来查找),例如我们可以查看这个类的内容:

UIViewSourceCode

当然UIView的定义文件(.h文件)也是相当长的,我们如果全部截图也没有意义。这里列出常用的属性和方法。

 

属性 说明
@property(nonatomic) CGRect            frame; 控件的位置和大小,所有的控件必须指定这个属性,否则即使有控件也无法显示
@property(nonatomic) CGRect            bounds; 当前控件位置和大小,但是和frame不同的是它的位置是确定的(0,0)
@property(nonatomic) CGPoint           center; 控件的中心位置,一般用户进行控件定位
@property(nonatomic) CGAffineTransform transform; 控件矩阵变化,包括平移、缩放、旋转,默认为CGAffineTransformIdentity
@property(nonatomic) UIViewAutoresizing autoresizingMask; 控件旋转时大小自动伸缩,默认为UIViewAutoresizingNone
@property(nonatomic,readonly) UIView       *superview; 当前控件的父控件
@property(nonatomic,readonly,copy) NSArray *subviews; 当前控件的所有一级子控件,注意其子控件的子控件并不包括在内
@property(nonatomic,getter=isHidden) BOOL              hidden; 是否隐藏,默认为NO
@property(nonatomic)                 UIViewContentMode contentMode; 内容模式,主要用于指定控件内容(注意不是子控件)如何填充,一般UIImageView经常使用,默认为UIViewContentModeScaleToFill
@property(nonatomic)                                 NSInteger tag; 控件的标示,可以存储一些和当前控件有关的信息(但是注意只能是整形),默认为0
方法   说明
– (void)addSubview:(UIView *)view; 添加子控件
– (void)removeFromSuperview; 从父控件中移除当前控件
– (void)insertSubview:(UIView *)view atIndex:(NSInteger)index; 在指定位置插入子控件
+ (void)beginAnimations:(NSString *)animationID context:(void *)context; 开始一段动画
+ (void)commitAnimations; 结束一段动画,注意在开始和结束之间如果控件的某些属性发生变化iOS将以动画方式进行改变
+ (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations NS_AVAILABLE_IOS(4_0); 以block的形式执行一段动画,注意这个方法有几种相关的重载
– (void)addGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(3_2); 添加手势操作
– (void)removeGestureRecognizer:(UIGestureRecognizer*)gestureRecognizer NS_AVAILABLE_IOS(3_2); 移除手势操作

注意上面所有的位置属性都是相对于其父控件而言(不是相对于屏幕而言),多数属性比较简单这里不再详细解释,我们重点解释一下autoresizingMask、transform属性。

autoresizingMask

autoresizingMask这个属性一般我们进行屏幕旋转的时候经常用到,它的值是一个枚举类型:

通过注释大家应该大概了解每个枚举值的意义,但是我们知道枚举经常进行按位或操作(“|”),例如如果autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleLeftMargin那么iOS如何处理呢?此时会自动调整左边的距离和控件自身宽度,右侧距离不变,同时保证左侧距离和控件宽度同等比例的调整(延长或缩短)。例如在iPhone 5中,如果一个按钮假设自身宽度为200,左右侧距离均为60(左侧和宽度比例3:10),当从竖屏旋转到横屏的时候(此时宽度由320变为568,注意如果有状态栏则宽度变为568-20=548),由于右侧边距不变为60,根据比例左侧边距应该是(568-60)*(3/13)=117,宽度为:(568-60)*(10/13)=391。

请看下面的代码(下面例子通过纯代码方式创建iOS应用,并且自定义一个KCMainViewController):

AppDelegate.m