UITableView
 
UITableView 在Ios中大量使用,我们对UITableview中的有关知识进行整理
 
 
UITAbleView是表视图控制器
 
 1 UITableView初始化
 
 2UITableview实现代理
 
 3UITableView必须实现的方法(UITableviewdatasource)
   3.1一个组里有多少cell
   3.2 UITableviewcell的内容
 
 4
 
 UIcollectionView
 
 UIcollectionView是集合视图
 
 
 
1 UIcollectionFlowLayout的初始化
 
 
 2 UIcollectionView 的初始化
 
 
 3 UIcollectionView实现代理
 
 
 4 两个必须实现的方法
 
 
 
//关于UITableViewCell 和UICollectionViewCell的介绍
 
 
 
UITableview全面解析
在iOS开发中UITableView可以说是使用最广泛的控件,我们平时使用的软件中到处都可以看到它的影子,类似于微信、QQ、新浪微博等软件基本上随处都是UITableView。当然它的广泛使用自然离不开它强大的功能,今天这篇文章将针对UITableView重点展开讨论。今天的主要内容包括:
UITableView有两种风格:UITableViewStylePlain和UITableViewStyleGrouped。这两者操作起来其实并没有本质区别,只是后者按分组样式显示前者按照普通样式显示而已。大家先看一下两者的应用
1>分组样式
 
 
 
 
2>不分组样式
大家可以看到在UITableView中数据只有行的概念,并没有列的概念,因为在手机操作系统中显示多列是不利于操作的。UITableView中每行数据都是一个UITableViewCell,在这个控件中为了显示更多的信息,iOS已经在其内部设置好了多个子控件以供开发者使用。如果我们查看UITableViewCell的声明文件可以发现在内部有一个UIView控件(contentView,作为其他元素的父控件)、两个UILable控件(textLabel、detailTextLabel)、一个UIImage控件(imageView),分别用于容器、显示内容、详情和图片。使用效果类似于微信、QQ信息列表:
当然,这些子控件并不一定要全部使用,具体操作时可以通过UITableViewCellStyle进行设置,具体每个枚举表示的意思已经在代码中进行了注释:
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
    UITableViewCellStyleDefault, // 左侧显示textLabel(不显示detailTextLabel),imageView可选(显示在最左边)
    UITableViewCellStyleValue1, // 左侧显示textLabel,右侧显示detailTextLabel(默认蓝色),imageView(显示在最左边)
    UITableViewCellStyleValue2, // 左侧依次显示textLable(默认蓝色)和detailTextLabel,imageView可选(显示在最左边)
    UITableViewCellStyleSubtitle // 左上方显示textLabel,左下方显示detailTextLabel(默认灰色),imageView可选(显示在最左边)
}; 
数据源
 
由于ios是遵循MVC模式设计的,很多操作都是通过代理和外界沟通的,但对于数据源控件除了代理还有一个数据源属性,通过它和外界进行数据交互,对于UITableView设置完dateSource后需要实现UITableViewDataSource协议,在这个协议中定义了多种数据操作方法,下面通过创建一个简单的联系人管理进行演示
运行可以看到如下效果
 
大家在使用iPhone通信录是会发现右侧可以按字母检索,使用起来很方便,其实这个功能使用UITableView实现很简单,只要是实现数据源协议的一个方法,构建一个分组标题的数组即可实现,数组元素的内容和组标题内容未必完全一致,UITableView是按照数组元素的索引和每组数据索引顺序来定位的不是按内容查找
效果如下
 
需要注意的是上面几个重点方法的执行顺序,请看下图
 
值得指出的是生成单元格的方法并不是一次全部调用,而是只会产生当前显示在界面上的单元格,当用户滚动操作时,再显示其他单元格
 
 注意:随着我们的应用越来越复杂,可能经常需要调试程序,在ios中默认情况下不能定位到错误代码行,我们可以通过如下设置让程序定位到出错代码行:Show the Breakpoint navigator - AddException breakpoint
 
代理
上面我们已经看到通讯录得简单实现,但是我们发现单元格高度,分组标题高度以及尾部说明的高度都需要调整,此时就需要使用代理方法。UITalbleView代理方法有很多,例如监听单元格显示周期,监听单元格选择编辑操作,设置是否高亮显示单元格,设置行高等
1设置高度
 
 
2监听点击
在iOS 中点击某个联系人就可以呼叫这个联系人,这时就需要监听点击操作,这里就不演示呼叫联系人操作了,我们演示一下修改人员信息的操作
 
在上面的代码中我们通过修改模型来改变UI显示,这种方式是经典的MVC应用,在后面的代码中会经常。当然UI的刷新使用了UITableView的reloadData方法,该方法会重新调用数据源方法,包括计算分组,计算每个分组的行数,生成单元格等刷新整个UITableView。当然这种方式在实际开发中是不可取的,我们不能因为修改了一个人的信息就刷新这个UITableView,此时我们需要采用局部刷新,局部刷新使用起来很简单,只需要调用UITableView的另一个方法:
 
 
性能优化
前面已经说过UITableView中的单元格cell是在显示到用户可是区域后创建的,那么如果用户往下滚动就会继续创建显示在屏幕上的单元格,如果用户向下滚动返回到查看过的内容是同样会重新创建之前已经创建过的单元格。如此一来即使UITableView的内容不是太多。如果用户反复的上下滚动,内存也会瞬间飙升,更何况很多时候UITalbleView的内容是很多的(例如微博展示列表,基本向下滚动是没有底限的)
 
前面一节中我们曾经提到过如何优化UIScrollView,当时就是利用有限的UIImageView动态切换其内容来尽可能减少资源占用。同样的,在UITableView中也可以采用类似的方式,只是这时我们不是在滚动到指定位置后更改滚动的位置而是要将当前没有显示的Cell重新显示在将要显示的Cell的位置然后更新其内容。原因就是UITableView中的cell结构布局可能是不同的,通过重新定位是不可取的,而是需要重用已经不在界面显示的已创建过的Cell。
 
当然,听起来这么做比较复杂,其实实现起来很简单,因为UITableView已经为我们实现了这中机制。在UITableView内部有一个缓存池,初始化时使用initWithStyle:(UITableViewCellStyle) reuseIdentifier:(NSString*)方法指定一个可重用标识,就可以将这个cell放到缓存池。然后在使用时使用指定的标识去缓存池中取得对应的cell然后修改cell内容即可
 
 
 
 
 
 UIScrollView
 UIScrollView 是滑动视图
 
 UIScrollView的初始化(如果是从xib或者故事板拖拽的不用初始化)
 
 
//属性
  contentSize                   //  UIScrollView内容大小的设置 (这个是非常重要的)
 
 pagingEnabled    //翻页属性
 
 
 
[_scrollView addSubview:imageView];//把内容视图直接添加即可
 

常用几个UITableView,UICollectionView  UIScrollView关键点的更多相关文章

  1. UITableView或UIScrollVIew上的UIButton的高亮效果

    UITableView或UIScrollVIew上的UIButton的高亮效果 原文地址:http://www.jianshu.com/p/b4331f06bd34 最近做项目的时候发现,UIScro ...

  2. UITableView与UIScrollView的一些问题(持续更新)

    UITableView的一些常用操作 --------------------------------------------------------------------------------- ...

  3. swift系统学习控件篇:UITableView+UICollectionView

    工作之余,学习下swift大法.把自己的学习过程分享一下.当中的布局很乱,就表在意这些细节了.直接上代码: UITableView: // // ViewController.swift // UIt ...

  4. UITableView 或 UIScrollView 点击状态栏列表回到顶部

    整理来自互联网- 这是tableView继承的scrollView的一个属性 scrollsToTop. 官方说明是这样的: // When the user taps the status bar, ...

  5. UItableView UIcollectionView下拉刷新会跳动?看了此篇就能解决这个Bug了

    顺序如下:   1.数组添加:   for (id model in modellist.list) {     IDSCommentWeplayList *commentListModel = [I ...

  6. iOS Swift 开发语言之初接触,纯代码创建UIView,UITableView,UICollectionView

    1. 初始化Label设置AttributeString override func viewDidLoad() { let label = UILabel(frame:CGRect(x:,y:,wi ...

  7. iOS 滑动性能优化

    iOS 滑动性能优化 目录 一. 减少图层的Blend操作 1. UIView的背景色避免使用clearColor 2. 控件贴图避免使用带alpha的图片 3. UIImageView 使用时避免半 ...

  8. Awesome Swift

    Awesome Swift https://github.com/matteocrippa/awesome-swift A collaborative list of awesome Swift re ...

  9. Swift 的 pod 第三方库

    #HTTPpod 'Alamofire' #Elegant HTTP Networking in Swiftpod 'SwiftHTTP' #Thin wrapper around NSURLSess ...

随机推荐

  1. Javascript的性能瓶颈

    Javascript是单线程的,它的性能瓶颈在于频繁的DOM操作, 因为每次操作都会使浏览器重新绘制一次. 其实纯JS的执行的速度是很快的,可以把元素都攒到一块,一次性放到页面中. 或者,定义一个延时 ...

  2. linux 系统下java开发环境的配置

    在安装之前,确保你的linux系统下有 jdk,jboss等相关软件 一.配置JDK环境变量 步骤: 解压缩JDK文件: unzip jdk1.6.0_31.zip 目录下显示文件夹jdk1.6.0_ ...

  3. [C++程序设计]引用

    对一个数据可以使用“引用”(reference),这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名.假如有一个变量a,想给它起一个别名b,可以这样写:int a; ...

  4. 用VS2013+VELT-0.1.4进行海思平台 Linux内核 的开发

    快乐虾 http://blog.csdn.net/lights_joy/(QQ群:Visual EmbedLinux Tools 375515651) 欢迎转载,但请保留作者信息 本文仅适用于vs20 ...

  5. 给ie浏览器添加推荐浏览器提示

    <script type="text/javascript"> var isIE = !!window.ActiveXObject; var isIE6 = isIE ...

  6. Lake Counting (POJ No.2386)

    有一个大小为N*M的园子,雨后积起了水,八连通的积水被认为是链接在一起的求出园子里一共有多少水洼? *** *W* *** /** *进行深度优先搜索,从第一个W开始,将八个方向可以到达的 W修改为 ...

  7. OpenWrt修改

    openwrt如何编译修改界面的顶部.底部信息.LOGO图片 2011-06-02 16:20:03  浏览次  以Atheros71xx为例,修改路径为:trunk/build_dir/target ...

  8. svn之——linux下清除svn的用户名和密码

    问题:之前用的svn账号权限不够,需要使用别的账号,所以提出需求——怎么使用新的svn账号进行操作 方法一: linux下删除~/.subversion/auth即可清除之前的用户名和密码:rm -r ...

  9. Python的字符串与数字

    Python3.0通过“input”实现读取控制台的输入与用户实现交互.值得注意的是input接受的所有数据都是字符串,即使输入的是数字,依然会被当作字符串来处理.这就会出现一些问题,所以需要进行类型 ...

  10. poj 3352 双连通分量

    至少加几条边成为双连通分量 #include <iostream> #include <cstdio> #include <cstring> using names ...