`
shlei
  • 浏览: 287802 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

自定义控件专题总结

    博客分类:
  • iOS
阅读更多

iPhone中自定义控件实现步骤
objective-c中是所有对象间的交互是如何实现的? (面试题)
答:记住,在Objective-C中所有对象间的交互都是通过指针实现的。
objective-c中是如何实现线程同步的?    (面试题)

线程同步和线程异步有什么区别?
打个比方,如果你在等一个人,
同步的时候,你会一直等到她来了之后才做其他事情,这个过程除了等待你啥都不会做,
异步的时候,你一边在等,可能一边玩游戏或者是看报纸什么的,一直到她到来,你的等待状态才会结束
在实现上,同步的过程会阻塞进程的所有其他操作,将同步转换为异步的最常见方法则是
将会阻塞进程的等待操作放入到一个新的进程中,同时为该等待操作添加一个监视器,在检测到等待操作完成的时候结束等待的进程。


1、在系统控件上进行功能扩充的自定义控件
2、是完全重写控件,包括自定义控件的触发事件,例子如:自定义Button

具体的实现
例如:自定义Button ,可以采用两种实现方案。
1、有响应事件,直接继承UIButton的自定义控件。
2、从UIVIew继承,然后实现点击事件和其他一些属性。无响应事件,继承自UIView的自定义控件。一个自定义类,从UIView继承

自定义initwithframe(frame,images,title,)
三个uiimage,highlight,normal和disable,
一个uilabel,显示文本.
在touch里面实现点击事件,

iPhone控件自定义控件开发:重绘还是组合
iPhone开发当中处于需求经常需要一些自定义控件。当然,处于成本和质量的考虑,请优先选择系统控件。当真正需要开发自定义控件的时候,通常又会有两种选择:重绘或者组合。重绘就是重写控件的绘制函数,在该函数中绘制期望的效果。而组合就是通过不同控件的搭配形成满足需求的控件。当然,根据自定义控件需求的不一样,有的适合用重绘,有的则是适合用组合,有时则是两种实现都适用。比如星级控件是项目中比较经常用到的但是系统没有提供的一种控件。对于这个一个控件我们又是要如何选择呢?

重绘实现:

@interface StarRating:UIView{    
    int numberStars;    
    int rating;
}
@property int numberStars;
@property int rating;
- (id)initWithNumberOfStars:(int)numStars;
- (id)initWithNumberOfStars:(int)numStars initialRating:(int)initialRating;
@end
@implementation StarRating
- (void)drawRect:(CGRect)rect {    
    UIImage *onImage = [UIImage imageNamed:@"on.png"];    
    UIImage *offImage = [UIImage imageNamed:@"off.png"];    
    for (int i=1; i<=[self numberStars]; i++)    {        
        UIImage *img = (i <= [self rating]) ? onImage : offImage;        
        CGPoint imagePoint;        
        imagePoint.x = BTN_WIDTH * (i-1);        
        imagePoint.y = 0.0f;        
        [img drawAtPoint:imagePoint];    
    }
}
@end


其中描绘部分是根据星级rating进行图片选择,星级以下的用on.png,星级以上的off.png。
组合实现:

@interface StarRating: UIControl {
    NSMutableArray            *starArray;
    NSInteger                     numberStars;
    NSInteger                     rating;
}
-(id)initWithFrame:(CGRect)frame andStars:(NSInteger)inNumStars;
@end
@implementation StarRating
-(id)initWithFrame:(CGRect)frame andStars:(int)inNumStars {   
    if (self = [super initWithFrame:frame])    
    {        
        approxMode = InterpolationMode_Half;        
        starNum = inNumStars;       
        [self prepareStars:starNum frame:frame];    
    }   
    return self;
}
-(void)setRating:(int)aRating{   
    rating= aRating;   
    [self fillStars];
}
- (void) prepareStars: (int)aStarNum frame: (CGRect)frame {
    starArray = [[NSMutableArray alloc] initWithCapacity:aStarNum];
    float width = frame.size.width/aStarNum;
    float height = frame.size.height;
    for(int i=0; i < aStarNum; i++) {
        UIImageView * star = [[UIImageView alloc] initWithFrame:CGRectMake(0+(i*width), 0, width, height)];
        [starArray addObject:star];
        [self addSubview:star];
        [star release];
    }
}
- (void)fillStars{    
    UIImage *onImage = [UIImage imageNamed:@"on.png"];    
    UIImage *offImage = [UIImage imageNamed:@"off.png"];    
    for (int i=1; i<=[self numberStars]; i++)    {           
       UIImage *img = (i <= [self rating]) ? onImage : offImage;   
       UIImageView *star = (UIImageView *)[self subViewAtIndex:i]; 
    [star setImage:img];
    }
}


其中是预先创建五个UIImageView的子控件,然后根据星级rating进行子控件的图片属性设定。

对比:
1 重绘方案只有自身一个控件,而组合实现则是包含五个子控件。资源和效率上重绘的方案会比较有优势。
2 重绘需要处理描绘,而组合则是由子控件负责描绘。因此从描绘处理上,组合方案比较简单
3 需求变更时,重绘方案可能需要修改描绘代码,而组合方案在设计合理的情况下是可以轻松替换子控件的类型。

iPhone中自绘实现步骤
1. 继承@interface MyView : UIView {
2. 实现- (void)drawRect:(CGRect)rect
3. 调用addSubView把新生成的view加入进来显示


addSubView[window addSubview:viewController.view]; 

4.示例代码
- (void)drawRect:(CGRect)rect { 
    // create the bitmap context 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef context = CGBitmapContextCreate(nil,100,100,8,400, colorSpace,kCGImageAlphaPremultipliedLast); 
    CFRelease(colorSpace); 
    //    create an arrow image 
    // set the fill color 
    CGColorRef fillColor = [[UIColor blackColor] CGColor]; 
    CGContextSetFillColor(context, CGColorGetComponents(fillColor)); 
    
    CGContextBeginPath(context); 
    CGContextMoveToPoint(context, 8.0f, 13.0f); 
    CGContextAddLineToPoint(context, 24.0f, 4.0f); 
    CGContextAddLineToPoint(context, 24.0f, 22.0f); 
    CGContextClosePath(context); 
    CGContextFillPath(context); 
    CGContextSelectFont ( context, "Arial", 10.f, kCGEncodingMacRoman ); 
    CGContextSetRGBFillColor ( context, 0.0f, 0.0f, 0.f, 1.f ); 
    CGContextSetShouldAntialias ( context, 0 );    
    CGContextShowText(context, "hh", 2); 
    
    // convert the context into a CGImageRef 
    CGImageRef image = CGBitmapContextCreateImage(context); 
    CGContextRelease(context); 
    
    UIImage* image2 = [UIImage imageWithCGImage:image]; 
    [image2 drawInRect:CGRectMake(0, 0, 120, 160)]; 
    
    NSString* myStr = @"中文"; 
    UIFont* font = [UIFont systemFontOfSize:12.0]; 
    [myStr drawInRect: CGRectMake(160, 240, 100, 130) withFont:font lineBreakMode:UILineBreakModeWordWrap alignment:UITextAlignmentCenter]; 


自定义控件 iphone/ipad
1,最常见的就是button,也是最简单的,苹果已经封装好了,只需要设置它的type为custom,然后设置其background就可以了;
2,segemented control,可以在xib里面对应的segement中设置其image就可以,不过有点需要注意的是假设你所有图片的宽度可能为70,那么你segemented control的宽度必须稍微短点,66即可。我以前在实践的时候,按照其本身宽度来设置,中间相连部分就会很难看;
3,navigation bar自定义也是十分常见,我所用的方法是定义一个imageview,然后insertSubview到第0层。不过用这种方法有点不好的是会把系统navigation bar本身的标题,按钮盖住。所以我们有的时候需要重新自定义标题,按钮,然后addsubview到bar上面,具体可以参考我下面给的demo;
4,search bar自定义,最开始的时候以为是不能定义,后来在qq音乐里看到很漂亮的search bar,开始研究。类似与导航栏,这次我们需要insertSubview到第1层,imageview的宽度最好设为search bar默认的高度44。接下来我们还可以自定义它上面的按钮,我们打印出它的子视图,找到按钮的那一层,取出按钮,然后重新在定义。
5,还有一个常见的需要自定义的,tableViewCell。自定义cell的方法其实很多,我就主要讲我常用的方法,先添加一个xib文件,里面只有一个tableviewcell,这个xib文件对应的主类应该是你需要自定义的那个类,在cell里面自定义图片和label,设置对应的tag为1和2。在那个主类里面定义uitableviewcell,并关联到刚才的xib文件。
6,tabbarcontroller也是可以自定义的,我所讲的是自己实践过成功过的方法,重写一个tabbarcontroller类文件,主要是隐藏tababr。接下来是在app文件里面定义一个viewcontroller,把刚才tabbarcontroller的类文件insert到第0层就可以了。具体可以参考我以前的demo。
今天就先讲一个滑动scrollview以及分页效果,在xib里面画好scrollview后,我们在.m文件初始化图片数据。
稍微解释下,两个循环是将图片添加到scrollview上面,其中ImageViewForScrollView是我自定义的imageview,用来处理图片的点击事件。里面比较关键的是如何设置每张图片的位置,不要忘记设置scrollview的contentSize,必须和实际内容的宽度一致,还要大于scrollview的宽度,不然是滑不动的。图片下面部分添加一个分页控制器,那么如何去控制分页呢

在绝大部分IOS应用的开发过程中,都不会使用IB, 使用代码自定义界面控件尤其重要。  本文就介绍下如何用代码自定义BUTTON控件。

UIButton *pBtn=[UIButton buttonWithType:UIButtonTypeRoundedRect];   //使用这个类方法来初始化button对象
[pBtn setTitle:@"MyButton" forState:UIControlStateNormal];  
[pBtn setFrame:CGRectMake(10, 20, 80, 30)];  
[pView addSubview:pBtn];   
//添加按键响应:
[pBtn addTarget:self action:@selector(buttonTest:)forControlEvents:UIControlEventTouchUpInside];

- (void)buttonTest:(id)sender
{
NSLog(@"button test");
}

自定义按钮2
UIButton *Btn;
CGRect frame;       
Btn = [[UIButton buttonWithType:UIButtonTypeCustom] retain]; //按钮的类型      
[Btn setImage:[UIImage imageNamed:@“aaa.png”] forState:UIControlStateNormal];//设置按钮图片  
Btn.tag = 10;  
frame.size.width = 59;  //设置按钮的宽度  
frame.size.height = 59;   //设置按钮的高度   
frame.origin.x =150;   //设置按钮的位置    
frame.origin.y =260;    
[Btn setFrame:frame];     
[Btn setBackgroundColor:[UIColor clearColor]];     
[Btn addTarget:self action:@selector(btnPressed:)forControlEvents:UIControlEventTouchUpInside];  //按钮的单击事件   
[self.view addSubview:Btn];      
[Btn release];

-(void)btnPressed:(id)sender
 {
     //在这里实现按钮的单击事件
}

用代码生成了TextField控件和Button控件,如何添加触发事件?
UITextField *textField=[[UITextField alloc] init];//添加事件
[textField addTarget:selfaction:@selector(valueChanged:)forControlEvents:UIControlEventValueChanged];//当textField内容改变时会触发
-(void)valueChanged:(id)sender {     
   //....处理文本改变时 statement
} 

在代码中将创建的button控件,后置(send to back)
[self.view sendSubviewToBack:button]; 

button控件用代码设置Custom属性。
UIImage *buttonUpImage = [UIImageimageNamed:@"button_up.png"];
UIImage *buttonDownImage =[UIImage imageNamed:@"button_down.png"];
//创建按钮,并设置类型。
UIButton *button = [UIButtonbuttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0,0.0, buttonUpImage.size.width, buttonUpImage.size.height);
[buttonsetBackgroundImage:buttonUpImageforState:UIControlStateNormal];
[buttonsetBackgroundImage:buttonDownImageforState:UIControlStateHighlighted];
[button setTitle:@"Tap"forState:UIControlStateNormal];
[button addTarget:selfaction:@selector(buttonTapped:)forControlEvents:UIControlEventTouchUpInside]; //用代码实现控件的触发事件
[button addTarget:self action:@selector(buttonTapped:)forcontrolEvents:UIControlEventTouchUpInside]

buttonTapped这个是你对button的UIControlEventTouchUpInside事件自定义响应函数。

From http://www.cocoachina.com/bbs/read.php?tid=49128&page=1
分享到:
评论

相关推荐

    view-tree.rar_Tree view_tree控件

    1. **控件消息处理**:要自定义控件的绘制,你需要捕获并处理特定的消息,比如`WM_PAINT`,这是窗口需要重绘时发送的消息。此外,可能还需要处理`WM_ERASEBKGND`消息,以防止默认的背景擦除。 2. **GDI图形操作**:...

    Delphi专题 - 控件应用.pdf

    ### Delphi专题 - 控件应用知识点详述 #### 一、Delphi中MEMO组件的光标定位技术 Delphi作为一款高级可视化编程工具,以其强大的功能和丰富的控件库著称,尤其在界面设计与交互逻辑方面表现卓越。其中,`Memo`组件...

    SuperMap_iClient_6R(2012)_for_Realspace(Flex)专题1

    为了满足不同用户的需求,SuperMap iClient 6R (2012) for Realspace (Flex)允许开发者通过ActionScript API自定义控件和扩展功能,创建个性化的地图应用,增强了产品的灵活性和适应性。 1.1.12 集成其他Web服务 该...

    VC之美化界面篇本文专题讨论VC中的界面美化,适用于具有中等VC水平的读者。读者最好具有以下VC基础:

    - `NM_CUSTOMDRAW`:自定义绘制消息,允许开发者自定义控件的绘制行为。 - **使用MFC类的虚函数机制**:通过重载MFC类的虚函数来自定义控件的行为。 - 例如重载`CButton::DrawItem`方法来自定义按钮的绘制行为。 ...

    JS控件--带时间

    【标题】"JS控件--带时间"是一个关于JavaScript编程的专题,主要关注的是如何在Web应用中创建和使用带有时间功能的用户界面控件。这类控件通常用于日程安排、时间选择器或者时间输入等场景,允许用户方便地选择日期...

    Android_UI开发专题.doc

    从资源管理到图形处理,再到自定义控件的创建,每一步都是构建高质量Android应用的关键。希望通过对这四个核心包的学习,读者能够更好地理解和掌握Android UI开发的技术细节,从而提高自己的开发水平。

    安卓控件运用

    "安卓控件运用"是一个针对初学者的专题,旨在深入理解并熟练运用各种安卓控件进行UI设计。在这个主题下,我们将探讨一些核心的安卓控件及其用法,同时也会涉及到基础的安卓开发概念。 首先,我们从基础控件开始。...

    Android编程自定义圆角半透明Dialog的方法

    更多关于Android相关内容感兴趣的读者可查看本站专题:《Android开发入门与进阶教程》、《Android调试技巧与常见问题解决方法汇总》、《Android多媒体操作技巧汇总(音频,视频,录音等)》、《Android基本组件用法总结...

    Flex样式专题翻译

    ### Flex样式专题翻译知识点 #### 一、样式基础与继承机制 **1.1 样式的定义** 在Flex中,样式是一种定义控件外观的方法,它允许开发者改变Flex组件的视觉表现,例如字体大小或背景颜色等。这些样式可以通过`style...

    专题资料(2021-2022年)matlab大作业.doc

    - **Tag**: 用户自定义的控件标识。 - **TooltipString**: 提示信息显示。 这些控件属性和方法可以帮助开发者更好地设计和管理GUI界面,使得应用程序更加用户友好。 综上所述,MATLAB不仅是一款强大的数学计算...

    完整版超级列表框背景.e.rar

    《超级列表框背景.e》是针对编程领域中控件应用的一个专题,主要涉及的是在软件开发过程中,如何自定义和优化列表框(ListBox)的背景显示效果。在Windows应用程序设计中,列表框是一个常用的数据展示控件,它可以显示...

    专题资料(2021-2022年)VisualBasic程序设计形成性考核册作业答案四.docx

    根据提供的文档内容,我们可以总结出一系列关于Visual Basic程序设计中的知识点,主要集中在网络编程、错误处理及调试技术等方面。下面将详细阐述各个知识点。 ### 一、选择题知识点 1. **Winsock 控件的使用**: ...

    Android编程实现自定义title功能示例

    在Android应用开发中,自定义title是提升应用界面个性化和用户体验的重要手段。...- 《Android控件用法总结》 希望本文对你的Android程序设计有所帮助,让你能够更好地理解和实践自定义title的功能。

    《Visual Basic 2008应用程序开发实例精讲》全书所有实例程序源代码

    2.1.4 自定义结构体26 2.1.5 数组27 2.1.6 运算符与表达式29 2.1.7 结构化控制语句32 2.2 面向对象编程40 2.2.1 “面向对象编程”中的概念40 2.2.2 “对象”和“类”的使用42 2.2.3 创建自定义类45 2.3 控件常用属性...

    NestListView防网易评论

    在Android开发中,`NestListView`是一种常见的用于实现类似网易新闻评论效果的自定义控件。这个控件通常结合了ListView的滚动功能和嵌套布局的特性,以展示层次分明、多级评论的数据结构。在这个专题中,我们将深入...

    ArcGIS_Server_RIA开发模式_for_silverlight

    开发者还需深入了解Silverlight的基础知识,包括Microsoft Silverlight概述、理解XAML、资源字典、自定义控件外观、数据绑定以及Silverlight网络和通信等。 总结来说,ArcGIS Server RIA开发模式结合了ArcGIS ...

    arcgisserver开发实验2

    总结来说,该文档内容详细地介绍了ArcGIS Server高级应用开发的各个方面,包括地图导出、动态图层管理、自定义工具创建、专题地图开发和符号化等。实验的目的是为了进一步提升开发者在ArcGIS Server平台上的开发能力...

    Libgdx专题系列 第一篇 第五节

    总结起来,"Libgdx专题系列 第一篇 第五节"主要涉及Libgdx中的文本处理技术,包括`BitmapFont`、`FreeTypeFontGenerator`、`Label`和`LabelStyle`的使用,这些都是构建游戏界面和交互的关键组件。通过学习和实践,...

    模块ACCESS到高级表格.rar

    高级技巧包括使用子窗体、分组和排序报表、自定义控件以及交互式报表设计。 五、宏与VBA 宏是Access中实现自动化操作的简单方式,而VBA则是宏的进阶版本,提供更强大的编程能力。通过宏和VBA,用户可以创建自定义...

    专题资料(2021-2022年)K3CloudV10BOS技术开发培训套打设计和报表开发.ppt

    3. **如何开始**:在NotePrint IDE中,用户可以通过新建模板,设计和设置属性来创建自定义套打模板。拖放控件,设置其属性并绑定数据源,以实现直观且快速的设计流程。 **报表设计与开发** 1. **概述**:报表设计...

Global site tag (gtag.js) - Google Analytics