转载自:http://bbs.9ria.com/thread-256747-1-1.html

一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用IOS开发中的学习心得和体会写出来,我将更深入的让大家理解IOS开发的方方面面,不过仍不能保证涉及所有的范围,希望我的理解可以给一些初学者一些帮助。

白天上班没有时间,而且公司上不了网 , 哎 伤不起~ 
对于IOS的UI开发,我不想讨论什么什么控件该怎样使用,平时有些人会问我,怎么用,我只能说我也不会,我只是去试验,去找方法,如果你连控件都不能熟悉使用那我只能说你不够下功夫,或者说你还是没有领会IOS开发的精髓,如果你懂了,真正理解了,那么我相信,没有你不会的控件,我要说的第一部分就是IOS的UI开发,不过我会换一个方式让大家更深的去理解去应用它。

好了,首先我想先说UI控件的三要素,请记住:绘制、数据、控制,有没有听过?也许没有,这只是我的个人总结而已,为什么是这3个,首先,展现在我们视线里的是可见的,那就是绘制,每一个控件都有自己的样子,就跟人的相貌一样,比如TableView是一张数据表,又比如datePicker是一个时间选择器,他们的样子都是不一样的;

然后是数据,控件也需要自己的数据,比如label,需要显示文字的数据,比如imageView需要显示图片的数据,如果没有数据这些控件的使用将会变得没有意义;

最后一个就是控制了,最典型的就是button了,这是用户与界面交互的关键,还有其他的控件,比如scrollview,可以滑动加载数据,这是控制;

好了,3要素都记住了吗?绘制、数据、控制。

为什么要说这些,我们的最终目的是什么?就是当我们真正理解了,那么我们就可以自己来定义自己的控件了,Iphone的体验好,其一的原因是因为美观。当然现在你只是理解了有这3个要素而已,现在就开始定义我们的控件有点早,不如拿官方的控件来研究一下,我们来仿照官方的控件,自己来实现它提供的控件,是不是很激动?

好,接下来我们一起来做做苹果自己做的事,是不是觉得自己很牛掰了,哈哈

自定义UIImageView 
好,请记住我,我自己的控件不用UI开头,全部以R开头,那么第一个控件就是RImageView

所有的视图都是继承自UIView,所以我们的RImageView也是继承自UIView 。记得3要素吗,在次提起一下,绘制,数据,控制,对于ImageView,我们需要绘制,需要提供图片资源,对于控制就不需要了,所以在我们的头文件里我们这样定义

@interface RImageView : UIView 

@property(retain,nonatomic)UIImage *image;
@end

有了数据我们就来绘制吧

在我们的.m文件中,找到绘制函数

- (void)drawRect:(CGRect)rect
{
[image drawInRect:rect];
}

ok,完成,一个简单的ImageView已经做好了,现在试试看我们自己写的控件是什么样子

RImageView *imageView = [[RImageView alloc] initWithFrame:CGRectMake(, , , )];
imageView.image = [UIImage imageNamed:@"test.png"];
[self.window addSubview:imageView];

imageView的另一个功能是可以添加图片数组实现动画,我们只要定义一个数组存放图片数组,当执行startAnimation函数时,执行定时器功能,从数组中循环遍历图片进行绘制,stopAnimation时关闭定时器,恢复到默认的imag即可,在此不再深入,感兴趣的同学可以自己去试着写写看。

是不是很简单, 千万别说坑爹啊,这只是我们小小的开始,虽然简单了点,但已经能说明问题了,觉得技术含量不够,那我们来写一个经典的吧

一个最能说明绘制和数据问题的控件就是label了,想想我们在绘制它的时候需要绘制什么呢?我们需要绘制显示的字体大小,颜色,背景色

所以我们的RLabel的头文件应该是这样的

@interface RLabel : UIView 

@property(retain,nonatomic)NSString *text;
@property(retain,nonatomic)UIFont *font;
@property(retain,nonatomic)UIColor *color; @end

在初始化函数里,我们设置默认的绘制参数

self.font = [UIFont boldSystemFontOfSize:(int)frame.size.height];
color = [UIColor blackColor];
[self setBackgroundColor:[UIColor whiteColor]];

下面是绘制的函数实现

- (void)drawRect:(CGRect)rect
{ [color setFill]; [text drawInRect:rect withFont:font]; }

使用一下看看

RLabel *labell = [[RLabel alloc] initWithFrame:CGRectMake(, , , )];
labell.text = @"";
[self.window addSubview:labell];
[labell release];

很好,再试试看我们再改一下它的text,labell.text = @"456";没有变,还是原来的显示,没变那是对的,变了才奇怪呢。还记得我说过的3要素吗?这里我们更改了数据却没有重新绘制,只要在更改text值的时候,执行一下setNeedsDisplay函数就可以了,那要怎样实现?

为了实现刷新的功能我们不得不再回顾一下property和synthesize了,他们的功能等价于setter和getter函数,我们在每一次的setter函数里进行刷新,于是我们去除@property(retain,nonatomic)NSString *text,取而代之的是setter和getter函数声明

-(void)setText:(NSString *)str; 

-(NSString*)getText; 

@synthesize text就改成了setter和getter的实现
-(void)setText:(NSString *)str{
[text release];
text = str;
[text retain];
[self setNeedsDisplay];
} -(NSString*)getText{
return text;
}

注意setter函数的release和retain,这正是retain属性的原型,好了,我们再来试试,这样我们的自定义label已完成了它最基本的功能,label还有其他的属性,大家可以自己添加完善自己的label

自定义UIButton 
一个最能说明控制的控件就是经典的button了,来写我们的RButton吧,先事先想想Button有哪些属性? 
为了简单起见,我们绘制roundrectButton就可以了,那么就有点击的效果,点击完的效果,点击的事件

定义一下我们的头文件

@interface RButton : UIView{
id _delegate;
UIControlEvents controlEvent;
SEL methodAction;
} - (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;
@end

在这个方法里,我们将传递的所有信息都给了button,接下来就是完成事件点击了 ,为了更好的体现点击的效果,我们需要绘制,很简单,设置一下背景色就可以了 。在初始化函数里 [self setBackgroundColor:[UIColor grayColor]]; 
然后就是touch事件了,根据选择的touch类型,这里只介绍两种类型:UIControlEventTouchDown和UIControlEventTouchUpInside 
第一个手势是在begin的时候就会处理

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
if (controlEvent == UIControlEventTouchDown) {
[_delegate performSelector:methodAction withObject:self];
}
[self setBackgroundColor:[UIColor blueColor]];
}

第二个手势在end时候才会处理

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
if (controlEvent == UIControlEventTouchUpInside) {
[_delegate performSelector:methodAction withObject:self];
}
[self setBackgroundColor:[UIColor grayColor]];
}

当我们为button添加事件的时候我们就已经获取了应该实现哪个手势,这样我们就定义了自己的button,使用和官方的一模一样了,我们来使用一下

RButton *button = [[RButton alloc] initWithFrame:CGRectMake(, , , )];
button.tag =;
[button addTarget:self action:@selector(doit:) forControlEvents:UIControlEventTouchUpInside];
[self.window addSubview:button]; -(void)doit:(id)sender{
NSLog(@"tag == %d",[sender tag]);
NSLog(@"oh its good!");
}

你可以自己选择是否需要传参数

如果大家有兴趣的话可以自己添加比如 
-(void)setImage:(UIImage*)image forState:(UIControlState)state 
或者设置title的函数,这里就不实现了

ios控件自定义指引的更多相关文章

  1. iOS控件之UIResponder类

    iOS控件之UIResponder类 在iOS中UIResponder类是专门用来响应用户的操作处理各种事件的,我们知道UIApplication.UIView.UIViewController这几个 ...

  2. 设计一个 iOS 控件

    转载自:http://blog.csdn.net/zhangao0086/article/details/45622875 代码的等级:可编译.可运行.可测试.可读.可维护.可复用 前言 一个控件从外 ...

  3. iOS控件——UIView的viewWithTag:(int)findTag方法描述

    UIView拥有一个viewWithTag:(int)findTag方法,调用方式为[MyView viewWithTag:整形数字]该方法返回tag == findTag的控件.ios控件中允许多个 ...

  4. ios学习笔记图片+图片解释(c语言 oc语言 ios控件 ios小项目 ios小功能 swift都有而且笔记完整喔)

    下面是目录其中ios文件夹包括了大部分ios控件的介绍和演示,swift的时完整版,可以学习完swift(这个看的是swift刚出来一周的视频截图,可能有点赶,但是完整),c语言和oc语言的也可以完整 ...

  5. 【Android开发日记】之入门篇(十四)——Button控件+自定义Button控件

        好久不见,又是一个新的学期开始了,为什么我感觉好惆怅啊!这一周也发生了不少事情,节假日放了三天的假(好久没有这么悠闲过了),实习公司那边被组长半强制性的要求去解决一个后台登陆的问题,结果就是把 ...

  6. QtQuick自定义主题以及控件样式指引

    自定义控件样式 请在Qt帮助索引中输入Customizing a Control进行查看 不过实际用下来感觉除非你想自己实现一套效果复杂的UI或是创造一个全新控件,比如:给UI添加模糊.虚化等Shad ...

  7. 如何设计一个 iOS 控件?(iOS 控件完全解析) (转)

    前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...

  8. 如何设计一个 iOS 控件?(iOS 控件完全解析)

    前言 一个控件从外在特征来说,主要是封装这几点: 交互方式 显示样式 数据使用 对外在特征的封装,能让我们在多种环境下达到 PM 对产品的要求,并且提到代码复用率,使维护工作保持在一个相对较小的范围内 ...

  9. UIButton内部子控件自定义布局-“UIEdgeInsets”

    UIButton UIButton做frame动画时,不响应点击 在一个View内部加入几个按钮,然后改变这个view的frame来做动画,但是按钮不响应点击事件. 问题代码 __block CGRe ...

随机推荐

  1. BZOJ4516 [Sdoi2016]生成魔咒 【后缀自动机】

    题目 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1,2, ...

  2. linux编程学习

    linux编程学习 工具篇 “公欲善其事,必先利其器”.编程是一门实践性很强的工作,在你以后的学习或工作中,你将常常会与以下工具打交道, 下面列出学习 C 语言编程常常用到的软件和工具. (一)操作系 ...

  3. 在react项目当中使用redux

    如果需要在你的react项目当中使用状态管理模式的话,需要引入redux和react-redux两个插件,redux提供基本的功能,react-redux提供将redux注入react的方法. imp ...

  4. ckeditor与ckfinder的使用方法 .NET (转载)

    原文发布时间为:2009-11-25 -- 来源于本人的百度文章 [由搬家工具导入] ckeditor与ckfinder的使用方法 .NET (转载) ckeditor 3.0.1学习笔记  一.ck ...

  5. 转 vim常用命令总结

    vim常用命令总结 vim 选择文本,删除,复制,粘贴   文本的选择,对于编辑器来说,是很基本的东西,也经常被用到,总结如下: v    从光标当前位置开始,光标所经过的地方会被选中,再按一下v结束 ...

  6. 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---30

    以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:

  7. 00.mp4v2工具的用法

    1.交叉编译mp4v2库# ./configure --prefix=/usr/local/mp4v2-2.0.0 --host=arm-hisiv300-linux  CC=arm-hisiv300 ...

  8. CocoaPods Setting up CocoaPods master repo无反应时的处理

    Setting up CocoaPods master repo,半天没有任何反应.原因无他,因为那堵墙阻挡了cocoapods.org...gitcafe和oschina都是国内的服务器,可以用它们 ...

  9. 牛客网 Wannafly挑战赛8 B.LBJX的三角形

    B-LBJX的三角形 链接:https://www.nowcoder.com/acm/contest/57/B来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒空间限制:C/C++ 32768K, ...

  10. java8 之CompletableFuture -- 如何构建异步应用

    什么是Future 接口 很多场景下,我们想去获取线程运行的结果,而通常使用execute方法去提交任务是无法获得结果的,这时候我们常常会改用submit方法去提交,以便获得线程运行的结果. 而sub ...