终于开始自己这个“聚水成洋”的路程了。

经过近一年的iOS学习和开发,遇到很多困难,一开始的陌生和畏惧,中途的困惑和纠结,解决问题后的豁然开朗和总结提升,自己就在这样一个不断的循环中逐渐成长起来了。

很难说一个人接下来的路会是怎样,就如自己跌跌撞撞就开始了iOS开发一样,但是,只要坚持和不断总结提升,现在看起来陌生困难的事,也会被我们的倔强磨平坦。

为了不让自己迷失,所以我选择不断回头和总结,时刻认清自己的过去和现在的位置,继续走在梦想的道路上。

好了,我开始总结第一个知识点了。

何为分类。

OC语言真的是一门优雅的编程语言,如同自然语言一样,让编程者着迷。那我也希望自己的总结是自然的,而不是代码的堆砌,那就太偷懒了。

分类这个概念很有意思,就像是类的分身,但同时指向类的本体,也就是说一旦在影响范围内,任何变化都会影响本体类。影响范围是个很重要的点,就算是存在分身,但是我们不使用,那肯定也是不会影响本体的。这里的使用,就可以理解为“#import”。

分类名与本体类名的关系是:在本体类名后面加上“+扩展名”。例如我接下来举例的UIImageView+ForTextViewScrollIndicator分类。

新建好分类以后,会发现.h文件和.m文件的类名为UIImageView(ForTextViewScrollIndicator),括号里面的就是扩展名了。

其实,当我们任意新建一个类后,.m文件里可以看到一个“[新建类名]()”,注意,这就是Xcode为我们自动创建的一个匿名分类,作用在于将影响范围仅仅限于当前类,同时隐藏匿名分类里面声明的变量和方法。

分类的好处:可以任意扩展本体类,这样就可以在基础类之上扩展功能,也避免了复杂的层层继承关系,减少了由于继承带来的冗余层次关系。

分类的坏处:大量的分类,可能会导致本体类功能模糊,难以分辨是哪个分类造成的影响。需要注意这一点。

下面就用我自己写的一个分类来描述:UIImageView+ForTextViewScrollIndicator

需求:在一个固定size的TextView控件里,当内容超过能显示的容量,就一直显示垂直滚动条。

TextView控件的原理是,当内容不能完全显示,滚动条会一闪而过,如何才能让其始终显示呢?那就要搞清楚滚动条是什么。其实滚动条本质上就是UITextView中的一个UIImageView,所看到的是一个显示的UIImageView,一闪而过,实际上就是hide了。怎么hide的?执行了UIImageView的-(void)setAlpha:(CGFloat)alpha方法。明白了吧,就是alpha从1变为了0。

那很明显了,就是要重写这个TextView的滚动条UIImageView,而且就是setAlpha方法。

首先,标记UITextView一个tag值,在分类的实现里面添加如下代码:

-(void)setAlpha:(CGFloat)alpha
{
if(self.superview.tag == noDisableVerticalScrollTag){
if(alpha == ){
if(self.frame.size.width < && self.frame.size.height > self.frame.size.width){
UITextView *textView = (UITextView*)self.superview;
if(textView.frame.size.height < textView.contentSize.height){
[super setAlpha:];
return;
}
}
}
} if (self.superview.tag == noDisableHorizontalScrollTag) {
if (alpha == ) {
if(self.frame.size.height< && self.frame.size.width > self.frame.size.height){
UITextView *textView = (UITextView*)self.superview;
if (textView.frame.size.width < textView.contentSize.width) {
[super setAlpha:];
return;
}
}
}
} [super setAlpha:alpha];
}

两个标记值分别代表显示垂直滚动条还是水平滚动条。

当TextView的滚动条alpha变为0时,就比较UIImageView自身的高和宽;如果符合即将显示的滚动条特征,就进一步比较UITextView的高度/宽度和其contentSize属性的高度/宽度,如果滚动条比内容短,则调用本类的setAlpha,将其置为1,返回。

看到没,分类还是可以采用子类的写法,只是在层次关系上,是对本类的补充扩展,算是平级关系。同样可以对本类方法进行重载和重写。

分类就是这样的一种类,也是一种特性,使用起来,并没有父类子类之分,就好像本类本身多了新的方法。

这就是对分类的总结了,也记录了一个分类例子,以后会坚持记录总结自己的学习心得。

何为分类,UIImageView举例的更多相关文章

  1. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  2. wordpress显示多个分类的文章

    显示多个分类下的文章可以这样提取: <?php query_posts(array('posts_per_page'=>10,'orderby'=>'rand','category_ ...

  3. Python自然语言处理笔记【一】文本分类之监督式分类

    一.分类问题 分类是为了给那些已经给定的输入选择正确的标签. 在基本的分类任务中,每个输入都被认为与其他的输入是隔离的.每个类别的标签集是预先定义好的(只有把类别划分好了,才能给输入划分类别). 分类 ...

  4. 【IOS学习】之四、协议,委托,分类粗解

    何为协议,何为委托,何为分类(类别)? 委托  即 代理 delegate:  他是 (接口的实现类)类似c中的回调.         把某个对象要做的事情委托给别的对象去做. 那么别的对象就是这个对 ...

  5. redis_NoSql数据库四大分类

    前面简单介绍了什么是NoSql,以及NoSql的应用场景,今天简单来学习一下NoSql的分类 一.KV键值对 典型的介绍:新浪(BerkeleyDB+redis).美团(redis+tair).阿里, ...

  6. TCP/IP学习笔记9--以太网之基本概念1: 分类,连接方式

    时间是变化的财富.时钟模仿它,却只有变化而无财富. -- 泰戈尔 以太网(Ethernet)一词源于Ether(以太), 是介质的意思.在爱因斯坦哥们提出量子力学之前,人们普遍认为宇宙空间充满以太,并 ...

  7. 【转】nosql的分类

    1 键值数据库 相关产品:Redis.Riak.SimpleDB.Chordless.Scalaris.Memcached 形式:Key 指向 Value 的键值对,通常用hash table来实现 ...

  8. NoSQL数据库的四大分类的分析

    分类 Examples举例 典型应用场景 数据模型 优点 缺点 键值(key-value) Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB 内容缓 ...

  9. iOS面试题及答案

    设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情. 1). MVC模式:Model View Control,把模型 视图 控制器 ...

随机推荐

  1. HTML5使用和实战分析HTML5 WebSocket API

    通过引入一个简单的界面(请参见下面的列表),开发替代技术,由于长轮询和"永远框架,从而进一步减少延迟. 后台代码 [Constructor(in DOMString url, optiona ...

  2. ftk学习记录(脚本文章)

    [声明:版权全部,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 上一篇说到了对话框.今天就看看结果. watermark/2/text/aHR0cDovL2Js ...

  3. POJ 3013 Big Christmas Tree(最短Dijkstra+优先级队列优化,SPFA)

    POJ 3013 Big Christmas Tree(最短路Dijkstra+优先队列优化,SPFA) ACM 题目地址:POJ 3013 题意:  圣诞树是由n个节点和e个边构成的,点编号1-n. ...

  4. Redhat Linux下的python版本号升级

    运行#Python与#python -V,看到版本是2.4.3,非常老了,并且之前写的都是跑在python3.X上面的,3.X和2.X有非常多不同, 有兴趣的朋友能够參考下这篇文章:  http:// ...

  5. Swift # 项目框架

    利用Swift--简单的项目界面流程. TabBar+Navigation底部导航控制,界面的切换. GitHub源码分享,地址: URL:https://github.com/SpongeBob-G ...

  6. asp.net mvc3 数据验证(三)—自定义数据注解

    原文:asp.net mvc3 数据验证(三)-自定义数据注解         前两节讲的都是asp.net mvc3预先设定的数据注解,但是系统自由的数据注解肯定不适合所有的场合,所以有时候我们需要 ...

  7. Ubuntu 14.04 关机键无效解决方法

         这几天開始研究ubuntu 14.04软件,安装Cairo-Dock后发现右上角的关机.重新启动.注销菜单点击都没了反应仅仅能通过命令实现,后来经过研究,发现仅仅要设置了 Cairo-Doc ...

  8. Struts2的工作原理及工作流程

    众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能 快速搭建好一个Struts2框架,但我们是否能把Struts2框架的工作原理用语言表达清楚,你表达的原理不需 ...

  9. C语言库函数大全及应用实例十一

    原文:C语言库函数大全及应用实例十一                                         [编程资料]C语言库函数大全及应用实例十一 函数名: setbkcolor 功 能 ...

  10. select刷新后,保持选定状态,Cookies存储select选定状态信息

    //cookies存储select选定值,防止刷新后没了 window.onload = function () { var cooki = document.cookie; if (cooki != ...