- 浏览: 26401 次
- 性别:
- 来自: 北京
最新评论
-
micallz:
绝知此事要躬行。
Git忽略文件(转载好文) -
lalakang:
提示找不到新项目的文件啊
ios如何在当前工程中添加编辑新建的FramesWork (两个ios工程联调同样适用 ) -
lalakang:
表示搞不对啊!!!
ios如何在当前工程中添加编辑新建的FramesWork (两个ios工程联调同样适用 )
转自:http://leakswww.devdiv.com/forum.php?mod=viewthread&tid=132028
一直以来都想写点什么,做点有意义的事,从今天开始我将会把自己在这一年的学习和应用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(0, 0, 100, 100)];
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(200, 400, 100, 30)];
labell.text = @"123";
[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
来解释一下,还记得代理函数吗,这里我们用了一个类似代理的任意类型_delegate,button产生的事件就是交与它处理
看看事件初始化函数吧,我们取了和官方button添加事件一样的函数名,那么怎样去实现一样的方法呢?
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents{
_delegate = target;
controlEvent = controlEvents;
methodAction = action;
}
在这个方法里,我们将传递的所有信息都给了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(150, 300, 60, 40)];
button.tag =11;
[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开发中的学习心得和体会写出来,我将更深入的让大家理解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(0, 0, 100, 100)];
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(200, 400, 100, 30)];
labell.text = @"123";
[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
来解释一下,还记得代理函数吗,这里我们用了一个类似代理的任意类型_delegate,button产生的事件就是交与它处理
看看事件初始化函数吧,我们取了和官方button添加事件一样的函数名,那么怎样去实现一样的方法呢?
- (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents{
_delegate = target;
controlEvent = controlEvents;
methodAction = action;
}
在这个方法里,我们将传递的所有信息都给了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(150, 300, 60, 40)];
button.tag =11;
[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的函数,这里就不实现了
发表评论
-
xcode4.3下制作framework
2013-04-09 09:25 1992转自:xcode4.3下制作framework——(xc ... -
对比iOS中的四种数据存储
2013-04-07 16:13 1045摘自:infoq http://www.inf ... -
iOS网络组件对比:AFNetworking VS ASIHTTPRequest
2013-03-07 10:10 1535在开发iOS应用过程中, ... -
ios如何在当前工程中添加编辑新建的FramesWork (两个ios工程联调同样适用 )
2012-12-12 14:57 3173唐彬琪 可能很多大牛都见过FaceBook的three2 ... -
Xcode4快速Doxygen文档注释 — 简明图文教程
2012-12-03 17:28 1191转自:http://blog.chukong-inc.com/ ... -
如何让IOS应用从容地崩溃
2012-12-03 16:55 1116转自:http://blog.chukong-inc.c ... -
Git忽略文件(转载好文)
2012-11-21 11:29 1273摘自:http://cwind.iteye.com/bl ... -
iOS开发细节记录汇总
2012-11-13 14:56 10861. 模拟器网速调整: 限制时输入下面两行,根据需要修 ... -
iOS签名总结
2012-11-13 11:34 1963摘自:http://www.devdiv.com/iOS签名总 ... -
iPhone开发资源汇总
2012-11-13 14:50 2158很多ios效果,以及控件集合 http://code4app. ... -
模拟器与真机下ffmpeg的编译方法(总结版)
2012-11-13 14:51 1436模拟器与真机下ffmpeg的编译方法(总结版) 编译f ... -
开源的电子书阅读器项目
2012-11-07 14:57 1876iphone平台上开源的电子书阅读器项目: https ... -
iOS高效开发必备的10款Objective-C类库
2012-11-07 14:28 750这里列出的库等功能使开发更容易。如果你是一个iOS开发人员,在 ... -
iOS6.0框架及功能更新小结
2012-11-07 14:58 794iOS6.0框架及功能更新小结 1. Maps 替换 ... -
const、static的理解
2012-11-07 14:58 1282对于C/C++语言来讲, const就是只读的意思,只在声明中 ...
相关推荐
百度地图SDK为iOS开发者提供了强大的地图接口,支持自定义地图样式、实时路况显示、离线地图等功能。开发者可以通过创建地图视图,设置地图类型,添加标注、覆盖物等操作,实现与用户交互。同时,百度地图的导航服务...
在iOS应用开发中,饼状图是一种...在实际开发中,可以将此组件封装成一个自定义控件,方便在多个界面中复用。同时,为了提高代码的可维护性和可扩展性,建议遵循良好的编程实践,如使用协议、分类和委托等设计模式。
"可爱清新简单的加载HUD控件.zip"中的内容显然是一个开源项目,专为iOS平台设计的,旨在提供一种可爱、简洁的加载显示效果。 项目名称为"SCCatWaitingHUD",从命名来看,这个控件可能采用了猫咪的元素来设计,使得...
让我们深入探讨这个自定义控件的特性和应用场景。 1. **自适应高度**: SHTextView 的一大亮点是它能够根据输入的文字内容动态调整自身的高度。在默认情况下,UITextView的高度是固定的,但SHTextView通过监听文本...
这种提示通常用于临时性的通知、指引或者是对某个操作的反馈,它能够在不打断用户流程的情况下,有效地传达信息。 首先,我们来了解一下什么是"气泡提示"。气泡提示,也称为气泡视图或者浮动提示,是一种轻量级的...
4. 单选题控件:在iOS中,通常使用Segmented Control或者Radio Button来实现单选题。Segmented Control是一种常见的选择控件,可展示多个选项,用户只能选择其中一个。若要模拟传统的单选按钮效果,可以自定义UI或...
iOS SDK中并没有直接提供轮播视图的控件,但开发者可以使用第三方库或自定义视图来实现。 这个压缩包中的"封装的轮播视图"文件可能包含了一个自定义的UIView子类,实现了轮播视图的功能。通常,一个自定义轮播视图...
### cocos 2d 游戏编程指南(兼容iOS 5 ARC) #### 一、书籍概述 本书是一本针对cocos2d游戏开发的全面指南,适用于iOS 5...通过跟随本书的指引,你将能够掌握cocos2d的核心概念,并能够独立开发出高质量的游戏作品。
总之,这个"swift-一套完全自定义的上拉下拉刷新框架"简化了iOS应用中常见刷新功能的实现,让开发者能够专注于业务逻辑,同时提供个性化的用户体验。通过理解和使用这个框架,你可以更好地掌握Swift中与UI交互和事件...
- **指示明确:**提供明确的指引和提示,帮助用户找到所需的功能。 5. **使用方法明显、易用:** - **直观性:**功能的使用方法应当直观明了。 - **示例:**如“+”按钮表示添加新项目,“垃圾桶”图标表示删除...
6. 工具栏和菜单控件:用于创建自定义工具栏和下拉菜单,使应用程序更易于使用和定制。 7. 动画和特效控件:能够添加动态效果,如滑动、淡入淡出、旋转等,提升用户体验。 安装 RC6 控件通常涉及以下步骤: 1. ...
7. **交互式地图**:iOS 应用中的地图应支持缩放、平移等交互操作,用户可以通过手势或控件来查看路线的详细情况。 8. **自定义图层和符号**:为了突出显示路径,RoutingSample 可能会创建自定义图层,使用特殊符号...
在iOS应用开发中,UI设计和用户体验是至关重要的部分,其中UITextField作为一个常见的用户输入控件,它的样式定制能够显著提升应用的美观度和易用性。这篇教程将详细讲解如何利用Storyboard来修改UITextField的...
这个软件可能是为了帮助新生熟悉校园环境,提供路线指引,以及可能包含其他实用信息,如校园设施位置等。以下是围绕这个主题的详细知识点: 1. **iOS开发基础**: - **Swift编程语言**:作为苹果官方推荐的开发...
2. 一致性:保持与iOS系统界面的一致性,采用苹果推荐的控件和设计元素,使用户在不同应用间切换时有熟悉感。 3. 反馈:提供即时反馈,让用户知道他们的操作已被系统接收并正在处理,如加载指示器、按钮按下状态等。...
安装完成后,根据应用中的指引进行设备参数设置,包括服务器地址、端口号以及设备别名等。 4. **其他手机客户端**:不同操作系统的手机客户端安装及使用方法,请参照随附光盘中的“手机监控设置指导”。 通过以上...
- **自定义视图**:学习如何创建自定义视图以满足特定需求。 - **响应用户输入**:处理触摸事件和其他类型的用户输入,实现更丰富的用户体验。 ##### 3. 数据管理 - **文件系统访问**:了解如何读写文件以及管理...
1. 打包生成APK需要将程序上传到AppCan服务器,按照官方文档的指引进行操作。 2. 需要在百度开放平台申请APIKey,这是为了使用百度地图服务。APIKey应配置到应用中,且必须与打包证书匹配,否则可能导致地图功能无法...
它支持触摸、鼠标和键盘输入,并且可以运行在Windows、Mac OS、Linux、Android以及iOS等平台上。 ##### 依赖项管理 在安装Kivy之前,需要确保系统已经安装了一些基础的依赖项,例如Python和pip。这些依赖项是Kivy...
这份规范基于对用户的尊重,帮助开发者创建出既能减少用户干扰,又能清晰指引用户操作的小程序。 ### 一、友好礼貌 1. **重点突出**: - 设计时应确保每个页面都有明确的重点,让用户快速理解页面内容。避免添加...