IOS 笔记大全 (UI控件到网络协议)

   1 MVC模式:(model+view+controller):是一种帮你把代码功能和显示划分出来的设计模式;  
   2 model:较为底层的数据引擎,负责管理实体中所继承的数据;  
   3 view:和用户交互界面;  
   4 controller:连接二者的桥梁;  
   5 cocoa frameworks 有两个框架:  
   6 foundation   
   7 foundation  是cocoa中最基本的一些类;再mac应用程序中负责对象管理,内存管理,容器等相关数据;  
   8 uikit:  
   9 uikit:为程序提供可视化的底层构架,包括窗口,视图,控件类和管理这些对象的控制器。这一层中的其它框架允许你访问用户联系人和图片信息,以及设备上的加速器和其它硬件特征;  
  10 code4app.com  
  11 UI(User Interface)编程  
  12 9.3第八周,周一  
  13 创建ios项目  
  14 1.打开iOS中的application;  
  15 2.UIViewController:视图控件,通过点击,触摸来控制程序  
  16 3.UIView :视图;  
  17 4.在项目中创建一个文件。在 iOS的cocoa touch创建一个  
  18   ulviewcontrollersubclass类然后在AppDelegate.m中找到application函数,在 self.window.backgroundColor = [UIColor whiteColor];后写如下代码  
  19         RootViewCotroller *rvc=[[RootViewCotroller alloc]initWithNibName:@"RootViewCotroller" bundle:nil];  
  20     self.window.rootViewController=rvc;  
  21     [rvc release];  
  22   代码含义:创建根控件,并把新创建的根控件赋值给窗口的根控件;注意释放;  
  23 5.label控件的创建和属性:  
  24      可以用视图界面创建;然后修改属性;  
  25 6.代码实现label   
  26   1.IBOutlet  :是个宏。控件和根界面控件内容建立联系  
  27     
  28    2.atomic:原子操作;线成保护;就是在几个线程中调用同一段内容时导致所用内容混乱,进行枷锁机制   
  29 nonatomic:不加锁机制;能提高效率;  
  30      把控件打包,并和界面添加的控件建立联系:  
  31   
  32    3.在RootViewCotroller.m文件中在viewDidLoad(加载函数)函数中设置lable的属性;  
  33    4.iPhone 横向320 竖向480 横条占20; 所以一般是320*460  
  34       创建给label并在屏幕上定位  
  35     CGRect rect={0,100,100,40};  
  36          //创建定位结构体;  
  37            坐标原点是左上角;四个参数分别是距左框的距离;距上框的距离;label控件的宽度,高度;  
  38     UILabel *label=[[UILabel alloc] initWithFrame:rect];  
  39     UILabel *label=[[UILabel alloc]   
  40     可一直接生成UIrect;  
  41 initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)]  
  42   
  43    5.UIView  * 指所有可视控件;  
  44    6.设置背景色  
  45     [label1 setBackgroundColor:[UIColor blueColor]];  
  46    7.设置label的字体;  
  47        [label2 setFont:[UIFont systemFontOfSize:20]];  
  48     label1.font=[UIFont italicSystemFontOfSize:30];   
  49    
  50   8.设置字体的颜色  
  51       label2.textColor=[UIColor redColor];  
  52   9.设置字体的对齐方式;  
  53      label1.textAlignment=UITextAlignmentLeft;   
  54   10.自动调整字体  
  55        label1.adjustsFontSizeToFitWidth=YES;  
  56        当文字数量多时可以自动调整字体大小  
  57        如果不设置就会变成省略;  
  58   
  59        字体省略方式:  
  60        label2.lineBreakMode=UILineBreakModeHeadTruncation;  
  61     这个是截去头,还有尾截,和中间截去;  
  62        label2.lineBreakMode=UILineBreakModeClip;  
  63     表示在已有控件写多少是多少,不写省略符  
  64   
  65          label1.lineBreakMode=UILineBreakModeCharacterWrap;  
  66      字符换行,指只要需要换行就换行不考虑单词的整体性;  
  67     label1.lineBreakMode=UILineBreakModeWordWrap;  
  68         以一个整个单词换行,不允许把整个单词分开写到不同的行;保持单词完整性;  
  69   
  70       设置自动调整的最小限制  
  71     label1.minimumFontSize=10;  
  72   11.设置行数:  
  73        label1.numberOfLines=3;  
  74     注:如果行高不够的话它不能显示完整;  
  75    字体省略方式  
  76  12.设置高亮颜色  
  77      label1.highlightedTextColor=[UIColor whiteColor];  
  78       设置高亮的状态时的颜色;  
  79     label1.highlighted=YES;  
  80      把label设置为高亮状态;  
  81  13.设置阴影色  
  82   label1.shadowColor=[UIColor blackColor];  
  83   设置阴影颜色;  
  84     label1.shadowOffset=CGSizeMake(-2,-2 );//只有长和宽 没有   起始位置  
  85    设置阴影位置;是相对字体的位置;  
  86  14.IOPhone的图标默认大小时57*57  87   
  88   
  89 9.4周二  
  90 1. IBAction 时void型的,为了连接某个触发;  
  91 2.button创建  
  92   button1=[UIButton buttonWithType:UIButtonTypeRoundedRect]  
  93   注:这样创建的button不是alloc出来的不用释放;  
  94            后面参数时button 的外观;  
  95 3.button设置位置:  
  96   button1.frame=CGRectMake(120, 280, 80, 40);  
  97 4.button 设置title  
  98   [button1 setTitle:@"click here" forState:UIControlStateNormal];  
  99   注:由于button继承view control所以它可以设置状态;  
 100           状态的作用?  
 101        答:可以在不同状态下展示不同的button 特点;  
 102    1.高亮状态下设置  
 103      [button1 setTitle:@"click ready" forState:UIControlStateHighlighted];  
 104    2.禁用状态设置  
 105     [button1 setTitle:@"forbid using" forState:UIControlStateDisabled];  
 106       button1.enabled=NO;  
 107     button设置成不可用,但是还可以更改button 的属性  
 108 5.  设置button的title的属性;     
 109      button1.titleLabel.font=[UIFont systemFontOfSize:20];  
 110   注:button是复合了label所以可以调用title label,设置它的 文本属性就是设置button的文本属性;  
 111 6设置       颜色  
 112   [button1 setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal];  
 113 7.给button添加事件  
 114      [button1 addTarget:self action:@selector(onclick) forControlEvents:UIControlEventTouchUpInside];  
 115    addTarget:指触发的对象; action:触发的事件; forControlEvets:是表示如何点击按钮触发;  
 116 8.局部声明button,如何使用button使其执行动作;  
 117   在事件函数头传递button对象;谁调用它就传递谁的地址;  
 118   -(void)onclick:(UIButton *)seder  
 119     [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];     
 120     注意:传递调用函数带参数有冒号;  
 121 9.添加图片  
 122     UIImage *image=[UIImage imageNamed:@"03.gif"];  
 123     [button setBackgroundImage:image forState:UIControlStateNormal];  
 124     [button setBackgroundImage:image1 forState:UIControlStateHighlighted];  
 125 10.得到图片大小  
 126     CGSize size=image.size;  
 127     NSLog(@"%f %f",size.width,size.height);  
 128   
 129 11.让button一直处于选择状态;  
 130      button.selected=YES;  
 131    button会一直处于一个状态而不改变? 到底什么意思  
 132 12.  判断button状态执行操作;  
 133 if(button.state==UIControlStateNormal){  
 134       
 135     }  
 136 13.移出事件  
 137        [sender removeTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragOutside];  
 138 14.点击滑动的妙用;可以在作程序时加入实现触屏效果;  
 139      [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragInside];  
 140     [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragOutside];  
 141   
 142 9.6周四  
 143 UIView (视图)  
 144 1.什么是uiview  
 145   在应用程序中看的见摸的着的是视图。相当于java中容器;  
 146   viewController相当于底板;  
 147 2.创建视图  
 148   UIView *view=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 420)];  
 149 3.将视图添加到父视图  
 150   [self.view addSubview:view];  
 151    注意:子视图是父视图的子类,后添加的视图在最上曾;  
 152 4.在视图view中添加label(label 是view的子类)  
 153  [view addSubview:label];  
 154  注:由于ui中的控件都是视图,所以可以在任意视图加载其他视图;  
 155  把一些视图装到另一个视图是为了保证视图的整体性;  
 156  注:在button上添加label点击label就是点击button label相当于透明;而在上添button就是点谁谁响应;  
 157 5.  
 158   CGRectframe :坐标  
 159   CGRectbounds:边界  
 160      button.bounds=CGRectMake(0, 0, 50, 50);  
 161   CGPointcenter:中点  
 162      该是图的中点在父视图的相对坐标;  
 163    button.center=CGPointMake(160, 230);  
 164    指视图的中心位置在父视图的相对位置  
 165   得到视图的终点坐标:  
 166      button.center.x;  
 167     button.center.y;  
 168 6.视图层次  
 169    视图子类是个数组;  
 170    视图先添加的在下,后添加在上;  
 171    交换视图位置:  
 172   [button1 exchangeSubviewAtIndex:0 withSubviewAtIndex:1];  
 173    1.遍历视图  
 174  for (UILabel * l in button1.subviews) {  
 175         l.text=[NSString stringWithFormat:@"%d",i++];  
 176     }  
 177    2.插入视图  
 178    [button1 insertSubview:label3 atIndex:1];  
 179      将视图label3插入到视图button1的第二位;  
 180     [button1 insertSubview:label2 aboveSubview:label1];  
 181      将视图label2插到label1上;  
 182          [button1 insertSubview:label1 belowSubview:label3];  
 183       
 184    3.将视图从父类视图中移出;  
 185    [label2 removeFromSuperview];  
 186    4.[button1 delete:label2];  
 187    5.将视图放到最上层 ;  
 188     [button1 bringSubviewToFront:label1];  
 189     注:写代码时把子视图写到一块,父视图写到一块  
 190    6.把视图放到最上下层  
 191         [button1 sendSubviewToBack:label1];  
 192    7.判断某个视图是某个视图的子视图 返回类型是bool类型;  
 193      [label1 isDescendantOfView:button1];  
 194 7.tag 视图的标志; 可以标志视图。是set 和get函数,设置和取得可以用“.”操作  
 195     button1.tag=1;  
 196 8.label1.superview 表示label1的父视图;  
 197 9. 隐藏视图 :label1.hidden=YES; 默认为no。  
 198      应用:可以让视图重叠换灯片放映,或动画;如果父视图隐藏,子视图也随之消失  
 199 10.视图可能会超出父视图的范围;这时可以更改父视图边界属性裁减出边界  的子视图  
 200    button1.clipsToBounds=YES;  
 201   
 202   UIImageView  
 203   
 204 1.初始化:  
 205      UIImageView *imageview=[[UIImageView alloc] initWithImage:[UIImage     imageNamed:@"2.jpg"]];  
 206   
 207     imageview.frame=CGRectMake(20, 20, 140, 220);  
 208     imageview.contentMode=UIViewContentModeScaleAspectFit;  
 209  让添加的图片按比例填充;  
 210 3.imageview和label都不能触发事件 但是可以给他们添加事件  
 211 //点击事件   搞清楚是单击还是双击  来处理事件       
 212 //声明点击手势   初始化点击手势识别器  
 213     当单击判断失败 在触发单击;先判断,不知道是单击还是双击                       
 214   
 215     UITapGestureRecognizer *tgr=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onclick)];//来添加事件  
 216         tgr.numberOfTapsRequired=1;//区分单击还是双击  
 217                 tgr.numberOfTapsRequired=2 218     [tag addTarget:self action :@selecter(press:)];//事件  
 219     //创建敲击事件的接收器;  
 220     [imageview addGestureRecognizer:tgr];//这个视图来响应,把手势加到视图上面  
 221 4.   
 222     imageview.UserInteractionEnabled=YES;  
 223    //是否能和用户交互;  
 224 5.三中图片填充方式  
 225      imageview.contentMode=UIViewContentModeScaleAspectFit;  
 226       
 227     imageview.contentMode=UIViewContentModeScaleAspectFill;  
 228    //按比例添满会超出边界。所以如果超出可以裁减  
 229     imageview.clipsToBounds=YES;  
 230     imageview.contentMode=UIViewContentModeScaleToFill;  
 231     //添满  
 232 6.创建视图还可以在appDelegate.m中的application中声明实现  
 233 7.  子视图按某中形式随父视图扩大或缩小;不同的扩大缩小方式特点可以或      
 234   labelsub.autoresizingMask=UIViewAutoresizingFlexibleWidth;  
 235   labelsub.autoresizingMask=UIViewAutoresizingFlexibleWidth |     UIViewAutoresizingFlexibleHeight;  
 236       控制视图按比例的开关;  
 237    labelsub.autoresizesSubviews=NO;  
 238   
 239 MVC:设计思想: model:内存数据 view :可视控件;controller:控制代码;  
 240 单例:从头到尾使用的类  
 241 RootController *rvc=[[RootController alloc]initWithNibName:@"RootController" bundle:nil];//有xib文件时创建连接文件,以后最好没有xib文件,xib文件降低速度  
 242 以后初始化要不创建xib文件初始化方法是:  
 243 RootController *rvc=[[RootController alloc]init];  
 244 kvo/kvc:?  
 245 notification:?  
 246 窗口:  
 247 iphono内存占用量不超过20Mb  
 248 全屏做法    1.记下此时的控件fram  
 249                     2.修改控件的大小,使其全屏  
 250                     3.把改图像拉到顶层;  
 251                     4.修改tag  
 252 字体新设置:  
 253 label.font=[UIFont fontWithName:@"宋体" size:30];  
 254   
 255 timer   
 256 1.创建定时器,一但创建就开始运行;  
 257  NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changLabel) userInfo:nil repeats:YES];  
 258 2,定时器停止;一旦停止就释放,相当于release;  
 259  [timer invalidate];  
 260 3,打开定时器  
 261      [timer fire]  
 262 4.动画效果  
 263     
 264   
 265 '  
 266 UITextField:对话框  同样是个view  
 267    
 268 1.创建  
 269 UITextField *field=[[UITextField alloc] initWithFrame:CGRectMake(40, 20, 250, 60)];  
 270   
 271   2.设置边框  
 272     UITextField *field=[[UITextField alloc] initWithFrame:CGRectMake(40, 20, 250, 60)];  
 273 3.在文本框后面设置清除键  
 274 field.clearButtonMode=UITextFieldViewModeAlways;  
 275 4.设置初始文本  
 276  field.placeholder=@"username";  
 277 5。设置文本变为隐藏;  
 278  field.secureTextEntry=YES;  
 279 6.设置textfield的自定义函数  
 280     首先在.h文件中提交协议    
 281   这样就可以自定义textfield 函数;注:自定义函数如果是返回bool类型的函数说明这个函数是一个监听函数;自定义都是进行某些动作时自动调用;  
 282 7.-(void)textFieldDidBeginEditing:(UITextField *)textField  
 283   当文本框进入编辑模式时自动调用  
 284 8.退出编辑模式时调用函数;  
 285   -(void)textFieldDidEndEditing:(UITextField *)textField  
 286 {  
 287     ( (UILabel *)[self.view.subviews objectAtIndex:0]).text=textField.text;  
 288   
 289 }  
 290 9.点击键盘上return后调用的函数  
 291 -(BOOL)textFieldShouldReturn:(UITextField *)textField  
 292 10.关闭键盘函数;  
 293   
 294    [textField resignFirstResponder];   
 295     return NO;  
 296   
 297 11.限定输入字符的长度函数  
 298 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string  
 299 {  //textfield表示谁调用该函数,  
 300        
 301     if (string.length>0) //string 表示当前输入的字符;  
 302         return textField.text.length<10;  //而textField.text的值是还没有加入刚输入的string  
 303     return YES;  
 304   
 305    }  
 306   
 307   
 308 9.10 第九周  
 309 多控制器操作:  
 310  一.多控制器间的切换;  
 311     思想:1.在每个视图控制器界面添加按钮点击触发事件创建新的视图控制器;然后把当前控制器交给新建的控制器;  
 312                  2.在新建的视图控制器中等使用完该控制器后,把控制器释放;由于创建是在前一个控制器中释放的所以这里释放不是简单的release;  
 313     方法:一  1.在父控制器中创建新控制器,并把但前的控制界面交给新控制器  
 314                ViewController* vc2=[[ViewController2 alloc] init];  
 315                    vc2.view.frame=CGRectMake(0,0,320,460);  
 316             [self.view addSubview:vc2.view];  
 317             [self addChildViewController:vc2];  
 318                   注:由于这样vc2 是在原控制器上加载所以它会默认流出原视图导航栏,要想让新控制器全部占满屏幕就要更改视图的大小;  
 319                 2.  然后用完vc2在最后把vc2从原控制器中移出  
 320             [self.view removeFromSuperview];    
 321             [self removeFromParentViewController];  
 322                       注:由于创建vc2时原有的控制器可vc2关联,原有的view和vc2的view关联;所以在清理时得把这两项分别清理;  
 323                       注:这中添加清理的方法使用高版本;为了程序的适用性通常用第二种方法;  
 324             二: 1.在父控制器中创建新控制器;并把当前的控制器设置为vc2,并添加动画效果  
 325                        ViewController* vc2=[[ViewController2 alloc] init];  
 326                         [self presentModalViewController:vc2 animated:YES];  
 327            //添加新的controller而且带动画效果;animated:是否要动画效果  
 328                     2 在用完vc2时移出该控制器;  
 329                        [self dismissModalViewControllerAnimated:YES];  
 330            //释放当前的controller  
 331 动画效果:只要把新的位置改变放到这些代码之间;  
 332 [UIView beginAnimations:nil context:nil];//动画设置开始;  
 333     [UIView setAnimationDuration:0.2];//设置动画时间;  
 334     text.frame=CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)//对象的新状态;  
 335     [ UIView commitAnimations];//开始动画;  
 336 9。11周二  
 337 注:系统对象不开辟空间不能打印retaincount自己声明的类的对象不开辟空间可以打印retaincount  
 338 导航条UINavigationBar  
 339 1.导航条按钮初始化三种方法:  
 340       1.普通初始化  
 341       UIBarButtonItem *rigthButton=[[[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain target:self action:@selector(click:)] autorelease];  
 342     第一个参数是按钮标题;第二个参数是按钮的样式;第三个参数是触发事件调用那个类中的方法第四个参数是触发的事件  
 343    2.用图片初始化  
 344      UIBarButtonItem *rightButtton= [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"5.png"] style:UIBarButtonItemStylePlain target:self action:@selector(click:)];  
 345     注:这样初始化的按钮有按钮框,图片存在按钮框里要想只显示图片要自定义按钮然后用按钮初始化;如第三种方法;  
 346    3.自定义控件初始化  
 347   
 348 //自定义的透明按钮  上面一般是要加上图片 让后点击图片  
 349           UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];  
 350     [button setImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];  
 351      创建button 按钮,样式设置为普通,也就是没有样式;  
 352     button.frame=CGRectMake(0, 0, 30, 30);  
 353     注:必须设置button 的frame否则不显示  
 354    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];  
 355     给button添加事件  
 356     UIBarButtonItem *rightButton=[[UIBarButtonItem alloc] initWithCustomView:button];  
 357     初始化导航条button  
 358    4.运用系统功能按钮初始化uibarbutton  
 359     UIBarButtonItem *rightButton=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(click:)];  
 360   
 361 2.添加副标题//导航栏添加副标题  
 362    self.navigationItem.prompt=@"subtile"; 导航条高度是44;  
 363 3.把导航条按钮设置成数组;可多加按钮,按钮一多会把别的控件挤偏;但是不能覆盖;如果加的太多只能显示先加入的;  
 364        self.navigationItem.rightBarButtonItems=[NSArray arrayWithObjects:<#(id), ...#>, nil nil]  
 365      
 366   注:UIBarButtonItem 有些属性和unbutton不一样,UIBarButtonItem不能设置  
 367 //设置导航栏的颜色  
 368 4.设置导航条色调  
 369   // tintColor:色调  控制器的导航条 的    色调  
 370    self.navigationController.navigationBar.tintColor=[UIColor purpleColor];  
 371 5.颜色色透明度  
 372     1.黑色透明度  
 373 self.navigationController.navigationBar.barStyle=UIBarStyleBlackTranslucent;  
 374    2.其他颜色透明度  
 375    self.navigationController.navigationBar.translucent=YES;  
 376     self.navigationController.navigationBar.alpha=0.8  
 377   
 378 slider.frame=self.navigationController.navigationBar.bounds;//从边界开始设定大小  
 379 重点  
 380 6.更改导航条背景  
 381    //更改背景图片ios5.0以后的方法  
 382     //判断。如过是5.0以上的版本用以下方法;  
 383     if (__IPHONE_OS_VERSION_MIN_REQUIRED>=__IPHONE_5_0) {  
 384   
 385     [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault];  
 386     }  
 387    如果是5.0以下的可以创建类别  
 388    //通过类别创建图像  
 389      @implementation UINavigationBar(Custom)  
 390       -(void)drawRect:(CGRect)rect{  
 391       UIImage *image=[UIImage imageNamed:@""];  
 392       [image drawInRect:rect];  
 393      }  
 394 7.隐藏导航条   
 395   [self.navigationController setNavigationBarHidden:YES animated:YES];  
 396 8.直接跳转到某页  
 397     1.创建数组把控制页面全部加载进来;  
 398    NSMutableArray *array=[NSMutableArray arrayWithArray:self.navigationController.viewControllers];  
 399   2.设置跳转到哪页  
 400           [self.navigationController popToViewController:[array objectAtIndex:0] animated:YES];  
 401     能够设置的常项  
 402         创建一个可变空数组;  
 403      NSMutableArray *array1=[[NSMutableArray alloc]initWithCapacity:0];  
 404    用数组设置navigationController的ViewControllers  
 405    //[self.navigationController setViewControllers:array];  
 406     self.navigationController.viewControllers=array;  
 407 9.在子导航条中去除自带得返回上一级得button  
 408 self.navigationItem.hidesBackButton=YES;  
 409 ToolBar工具条  
 410 1.创建工具条:为单个viewcontroller添加toolbar  
 411      UIToolbar *toobar=[[UIToolbar alloc] initWithFrame:CGRectMake(0,372,320, 44)];  
 412       注:一定要注意创建导航条后当前的viewcontroller的坐标原点已经改变是加上导航条后的的高度;导航条的高度是44;  
 413    toolbar.tintColor=[UIColor purpleColor];  
 414    toolbar的颜色设置;和导航条设置一样;  
 415     toobar.hidden=NO;  
 416       注:toolbar的hidden属性默认是yes,所以加toolbar要把hidden设置为no;   
 417 2.  在导航条中有toolbar属性;所以要想每页都加toolbar 就可以在这里把导航条的toolbar的hidden属性设置为no;  
 418    ];  
 419     UINavigationController *nv=[[UINavigationController alloc]initWithRootViewController:vc];  
 420     nv.toolbarHidden=NO;  
 421     nv.toolbar.tintColor=[UIColor purpleColor];  
 422     [nv setNavigationBarHidden:YES animated:YES];  
 423 3.把按钮写成一个数组然后添加到toolbar  
 424    [array addObject:button];  
 425    //设置viewcontroller的toolbar以数组初始化;  
 426     //toobar的button不能调整大小;  
 427    // self.toolbarItems.  
 428     [self setToolbarItems:array animated:YES];  
 429   
 430 4.验证两个coloer属性;  
 431   tinkcoloer:  
 432   
 433 9.12 周三  
 434 //六个控件  
 435  UISlider 滑条控件//滑动条控件  
 436  滑条初始化:  
 437     UISlider *sl=[[UISlider alloc]initWithFrame:CGRectMake(30, 60, 280, 30)];  
 438     1.滑条的高度不用设置因为系统默认 ;但是可以设置背景图改变滑条的高度;具体看滑条的图片设置  
 439   
 440        创建label用来显示滑动的数值  
 441     UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 40)];  
 442      view控件的tag属性可以作为区分视图的标志想查找它时可以在另一个函数中写  
 443      UILabel *label=(UILabel *)[self.view viewWithTag:100];  
 444     label.tag=100;  
 445    
 446   设置滑条的最大值和最小值;  
 447     sl.minimumValue=0.0;  
 448     sl.maximumValue=20.0;  
 449   
 450   给滑条添加事件,由于滑条的值是可变的所以监听它时用值改变事件监听,以后一般遇到值可以不断改变的view控件要用值改变事件监听;  
 451     [sl addTarget:self action:@selector(valuechang:) forControlEvents:UIControlEventValueChanged];  
 452    // 设置默认滑条位置;  
 453     sl.value=10.0;  
 454     设置大小端图像;  
 455    sl.maximumValueImage=[UIImage imageNamed:@"5.png"];  
 456    设置滑条轨迹的颜色  
 457     sl.minimumTrackTintColor=[UIColor purpleColor];  
 458     sl.maximumTrackTintColor=[UIColor redColor];  
 459     sl.thumbTintColor=[UIColor greenColor];  
 460   
 461     //点击按钮分高亮状态和非高亮状态;所以要注意设置那个状态;  
 462     [sl setThumbImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];  
 463   
 464     //设置滑条的最大最小图像;注:1滑点滑动部分变大图像会被拉伸,如果图像到达原大小在压缩不会变化;2.如果滑条设置背景图片就会改变滑条的宽度,而且只能是改变minimumValueImag此时的图片高度就是滑条的高度;原因:因为滑条的大端是开始的占空间大小;显示的滑动进度是在原有基础上添加的所以大端改变整个滑条才会改变  
 465     [sl setMinimumTrackImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];  
 466     [sl setMaximumTrackImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];  
 467       
 468 简单的滑条触发事件测试:滑条值的改变显示在label控件上;     
 469 -(void)valuechang:(UISlider *)sender  
 470 {  
 471     UILabel *label=(UILabel *)[self.view viewWithTag:100];  
 472     label.text=[NSString stringWithFormat:@"%.0f",sender.value];  
 473 }  
 474   
 475 UISwitch:开关控件//创建开关控件  
 476  初始化switch对象  
 477 UISwitch * _swith=[[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];  
 478    给with添加事件注意 事件控制是UIControlEventValueChanged  
 479     [_swith addTarget:self action:@selector(sw:) forControlEvents:UIControlEventValueChanged];  
 480      设置with的打开时背景色  
 481     _swith.onTintColor=[UIColor blackColor];  
 482  注:不用设置switch的宽高。因为时系统默认;设置没有作用;  
 483 给switch添加switch事件:状态改变一次触发一次  
 484 -(void)sw:(UISwitch *)swith  
 485 {  
 486     if (switch.on==YES)   
 487         NSLog(@"yes");  
 488         else  
 489             NSLog(@"no");  
 490       
 491 }  
 492   
 493   
 494  UIActivityIndicatorView:加载缓控件  
 495    
 496 //加载缓冲页面;初始化  
 497     UIActivityIndicatorView *aiv=[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];  
 498      
 499    设置当停止时隐藏  
 500     aiv.hidesWhenStopped=NO;  
 501     设置旋转图标的样式。一共有三种  
 502     aiv.activityIndicatorViewStyle=UIActivityIndicatorViewStyleWhiteLarge;  
 503     设置缓冲图标的颜色   注:要先设置样式在设置颜色,因为样式是带颜色,能覆盖以前的颜色;  
 504     aiv.color=[UIColor blueColor];  
 505     缓冲图标开始,停止动画;  
 506     [aiv startAnimating];  
 507     [aiv stopAnimating];  
 508   
 509   
 510  UIProgressView:进度条  
 511   初始化进度条  
 512     UIProgressView *pgv=[[UIProgressView alloc] initWithFrame:CGRectMake(50, 100, 220, 0)];  
 513    设置进度条的tag属性;  
 514     pgv.tag=100;  
 515     pgv.progressViewStyle=UIProgressViewStyleBar;  
 516     //颜色设置  
 517     pgv.progressTintColor=[UIColor purpleColor];  
 518     pgv.trackTintColor=[UIColor blackColor];  
 519     //进度条图片设置  
 520     pgv.progressImage=[UIImage imageNamed:@""];  
 521     pgv.trackImage=[UIImage imageNamed:@""];  
 522    //用时间控制器模拟时间进度条;  
 523     [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(refresh:) userInfo:nil repeats:YES];  
 524    //用函数对进度条做试验  
 525 -(void)refresh:(NSTimer *)timer  
 526 {  
 527     UIProgressView *pv=(UIProgressView *)[self.view viewWithTag:100];  
 528     [pv setProgress:pv.progress+0.1 animated:YES];  
 529     if (pv.progress==1) {  
 530         NSLog(@"%d",[timer retainCount]);  
 531         [timer invalidate];  
 532        // [timer release];  
 533        //注意在ui中运用封装好的函数生成的控件不要给他们release它有他自动释放或需要调用释放函数;所以不必管它  
 534         NSLog(@"%d",[timer retainCount]);  
 535     }  
 536   
 537  UITextView 文本编辑器  
 538  文本编辑器和文本框一样有代理函数在.h文件开头需引入;  
 539  @interface ViewController : UIViewController  
 540  它的代理函数和文本框的基本相同,不同的有两个  
 541 -(void)textViewDidChange:(UITextView *)textView:(UITextView *)textView  
 542 -(void)textViewDidChangeSelection:(UITextView *)textView  
 543 注:在调用代理函数时一定要textview的代理设置为调用函数所在的类;  
 544 文本框的一些属性设置:  
 545      1.初始化文本框  
 546    UITextView *textView=[[UITextView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];  
 547    2.文本框的颜色,对齐方式,字体设置  
 548     textView.textColor=[UIColor grayColor];  
 549     textView.textAlignment=UITextAlignmentLeft;  
 550     textView.font=[UIFont systemFontOfSize:30];  
 551     3。自动纠错关闭;  
 552     textView.autocorrectionType=NO;  
 553    4.大写模式;除此之外还可以设置字母不大写;句首字母大写。单词开头字母大写;  textView.autocapitalizationType=UITextAutocapitalizationTypeAllCharacters;  
 554    5.键盘模式:   
 555    textView.keyboardType=UIKeyboardTypePhonePad;//打电话模式  
 556     textView.returnKeyType=UIReturnKeyGo;返回模式变为go  
 557      //根据输入框需要输入的内容不同要设置键盘的样式  
 558   
 559   
 560  UIStepper 计步器//创建一个计步器  
 561   1.初始化  
 562 //ValueChanged  点击是要用这种模式  
 563     UIStepper *stepper=[[UIStepper alloc]initWithFrame:CGRectMake(100, 200, 100, 40)];  
 564  2.给stepper添加触发事件,还是注意 forControlEvents:UIControlEventValueChanged的设置  
 565     [stepper addTarget:self action:@selector(stepper:) forControlEvents:UIControlEventValueChanged];  
 566  3.设置stepper的最大最小值  
 567     stepper.minimumValue=0;  
 568     stepper.maximumValue=50;  
 569  4.  
 570     //常按可以自动加默认是yes    长按就一直进行  
 571   stepper.autorepeat=YES;//autorepeat是否连续的执行这一操作或者响应  
 572     //最小和最大间循环;  
 573    stepper.wraps=YES;  
 574     //设置每次增长值  
 575     stepper.stepValue=2;  
 576     //设置按键时是否显示每次加的值;如果设为no常按键会加到走好几个步长的值  
 577    stepper.continuous=NO;//continue单位时间内是否响应  
 578 UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(50, 50, 100, 50)];  
 579     label.font=[UIFont systemFontOfSize:30];  
 580     [self.view addSubview:label];  
 581     label.tag=100;  
 582   
 583 -(void)stepper:(UIStepper *)stepper  
 584 {  
 585     UILabel *label=(UILabel *)[self.view viewWithTag:100];  
 586     label.text=[NSString stringWithFormat:@"%f",stepper.value];  
 587   
 588 }  
 589   
 590  UISegmentedControl 分段控制器;//创建分段控制器  
 591    1.分段控制器初始化  
 592  UISegmentedControl *sc=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"a",@"b",@"c",[UIImage imageNamed:@"5.png"], nil nil]];  
 593  2 分段控制器设置frame  
 594     sc.frame=CGRectMake(100, 100, 150, 40);  
 595  3. 为分段控制器添加监听事件;  
 596     [sc addTarget:self action:@selector(sc:) forControlEvents:UIControlEventTouchUpInside];  
 597     //注这个触发事件监听是ValueChanged,为了监听按钮  
 598 4。控制类型控制类型一共有四种;  
 599     sc.segmentedControlStyle=UISegmentedControlStyleBordered;  
 600  5。按钮自动弹起开启;默认是no;  
 601     sc.momentary=YES;  
 602  6。添加新按钮;可以是文字,或图像;  
 603     [sc insertSegmentWithTitle:@"e" atIndex:3 animated:YES];  
 604    [sc insertSegmentWithImage:<#(UIImage *)#> atIndex:<#(NSUInteger)#> animated:<#(BOOL)#>]  
 605 7.在段控制器中区分点击那个按钮的个属性  
 606 //一共有多少个按钮;  
 607     int i=sc.numberOfSegments;  
 608 //当前点击的按钮位置;  
 609     int j=sc.selectedSegmentIndex;  
 610     //移出当前点击的段;  
 611     [sc removeSegmentAtIndex:j animated:YES];  
 612     //移出所有的段;  
 613    [sc removeAllSegments];  
 614   
 615 UIGesture 手势事件  
 616 1.移动手势  
 617      1.创建移动手势的对象:  
 618  UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];  
 619   2.把此对象添加到操作的对象中;  
 620     [imagview addGestureRecognizer:pan];  
 621   3.实现移动对象的方法  
 622 -(void)pan:(UIPanGestureRecognizer *)pan  
 623 {  
 624     CGPoint point=[pan translationInView:self.view];  
 625    //这个函数是得到触点在屏幕上与开始触摸点的位移值  
 626     imagview.center=CGPointMake(imagview.center.x+point.x, imagview.center.y+point.y);  
 627   //让图像的中心位置变化;中心变化图像位置就移动了 ,但是注意位移时如果不清空translation就会多移动一倍;所以每次要让pan的位置零;  
 628     [pan setTranslation:CGPointMake(0, 0) inView:self.view];  
 629       
 630 }  
 631 2.扩大缩小手势  
 632   1.创建扩大缩小手势的对象 在创建时就带了要触发的事件  手势器   
 633 UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)];  
 634  2.记录下开始图像的大小,在扩大缩小函数时使用;原因是扩大尺寸是在图像的现有大小上乘,而图像的尺寸是变化的所以会使图像扩大缩小的太过火;所以纪录原图像大小一直在这个基础上扩大 size=CGSizeMake(imagview.bounds.size.width,imagview.bounds.size.height );  
 635 3.图像添加扩大缩小手势;  
 636     [imagview addGestureRecognizer:pinch];  
 637 4.图像扩大缩小手势触发的事件;  
 638 -(void)pinch:(UIPinchGestureRecognizer *)pinch  
 639 {  
 640     改变图像的大小;pinch.scale是触摸点的相对于原有位置的位移量的倍数。  
 641     imagview.bounds=CGRectMake(0, 0,size.width*pinch.scale, size.height*pinch.scale);  
 642     为了防止每次扩大缩小都要从原图开始,所以操作结束释放触点一次就要把当前的尺寸记下,下次变化在这个基础上改变;  
 643                                           
 644     if (pinch.state==UIGestureRecognizerStateEnded) {  
 645         size=CGSizeMake(imagview.bounds.size.width, imagview.bounds.size.height);  
 646     }  
 647   
 648                                             gesture.scale=1.0f;//这个很重要  
 649    
 650 3.旋转手势  
 651 //电话在手机里面优先级是最高的  
 652   
 653   1.旋转角度对象的初始化  
 654     UIRotationGestureRecognizer *rotation=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)];  
 655   2.给旋转图像添加旋转对象  
 656     [imagview addGestureRecognizer:rotation];  
 657   3.旋转时触发的函数  
 658 -(void)rotation:(UIRotationGestureRecognizer *)rotation  
 659 {    
 660       让图像旋转某个角度,这个交度使相对原图旋转的角度。所以必须有个判断语句,如果释放一次触点就要把当前位置记下,否则图像还会回到原来状态;  
 661     imagview.transform=CGAffineTransformMakeRotation(f+rotation.rotation);  
 662     if (rotation.state==UIGestureRecognizerStateEnded) {  
 663         f=f+rotation.rotation;  
 664     }  
 665 }  
 666 4.tap的一些属性  
 667   可以给image添加tap事件  
 668   tap.numberOfTapsRequired=2;//点击几次触发事件,点击次数必须是连续点击  
 669    tap.numberOfTouchesRequired=2;//设置触摸点数 只有两个触点存在时点击才能触发事件  
 670 5.触摸时自动调用的触摸函数一共有四个  
 671      触点事件调用时UITouch对象产生后自动调用的属性;由于单击的话只有一共对象;所以不论有几个touch对象都时指当前鼠标触点?那为什么还要创建触点对象呢?而anyobject之外还能做什么  
 672     1. 触摸开始触发的事件  
 673 //开始触屏的时候touchesBegan  
 674 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
 675 {  
 676     NSLog(@"began");  
 677    建立触摸对象 触摸对象是任意触点;但是事实是当前鼠标点击的点;但是怎么得到另一个点的坐标?  
 678     UITouch *touch=[touches anyObject];//anyObject  任何触摸的东西都储存在里面  
 679     if(touch.tapCount==1)  
 680     {  
 681     NSLog(@"这是一个单击事件");  
 682     }  
 683     else if(touch.tapCount==2)  
 684     {  
 685     NSLog(@"这是一个双击事件");  
 686 }  
 687       
 688     CGPoint point=[touch locationInView:self.view];  
 689     NSLog(@"%f %f",point.x,point.y);  
 690    // 可以调用touch开始点和touch结束点做加减得到移动大小, 但是这样做很麻烦,ui有封装好的方法       UIPanGestureRecognizer  
 691    // touch只调用第一触电大小,怎么得到第二个点?}  
 692   
 693 //手指离开屏幕的时候  
 694    2.触摸事件结束触发事件  
 695     -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
 696    {  
 697     NSLog(@"end");  
 698     }  
 699   3.cancell实在移动时突然被其他进程打断时调用。比如突来电话  
 700       -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event  
 701     {  
 702     NSLog(@"cancel");  
 703     }  
 704   4.触点移动时触发的事件;  
 705 //手指移动发生的事件  
 706    -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event  
 707    {  
 708         UITouch *touch=[touches anyObject];  
 709     CGPoint point=[touch locationInView:self.view];  
 710     UIImageView * imageView=(UIImage *)[self.view viewWithTag:101];  
 711     CGRect   
 712   
 713     NSLog(@"move");  
 714    }  
 715   
 716  [performSelector:@selector(single Tag)withObject:nil afterDelay:delaytime]//实现函数的调用,延时调用,相当于多线程  
 717   
 718 9.13周四  
 719 1.各个控制器间的关系:  
 720 window  的rootviewcontroller可以是uinavigationcontroller ,uitabbarcontroller ,uiviewcontroller  
 721 uinavigationconroller 上可以添加uiviewcontroller  
 722 uitabbarcontroller上可以添加uiviewcontrolller 也可以添加uinavigationcontroller  
 723 到此基本上控制器的关系弄清了;  
 724  1.UITabBarController :标签控制器,分栏控制器  
 725      当uitabbarcontroller含的uitabbaritem很多时,编译器会自动隐藏以省略号表示,点击省略号就可以查看不显示的item  
 726     1.初始化:  
 727    UITabBarController *tc=[[UITabBarController alloc]init];  
 728   2.创建视图控制器然后创建 UITabBarItem并把它赋给视图控制器的 tabBarItem  
 729    ViewController *vc=[[[ViewController alloc]init]autorelease];  
 730     UITabBarItem *item=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:0];  
 731     注:可以自定义item 也可以用系统中定义好的;  
 732     vc.tabBarItem=item;  
 733    3.创建导航条;用于放人UITabBarController 由此可知uitabbarcontronller和uinavigationcontroller的包含关系;  
 734      UINavigationController *nc=[[UINavigationController alloc]initWithRootViewController:vc];  
 735    4.添加导航控件和视图控件;  
 736    tc.viewControllers= [NSArray arrayWithObjects:nc,vc1,vc2, nil nil];  
 737    5.让根控制器为标签控制器  
 738     self.window.rootViewController=tc;  
 739 2.解决不显示第二个以后的标签问题  
 740       1.原因:如果把每个控制器的标签生成写在viewdidload里面由于为了节省内存开始只会加载一个控制器。所以只能显示第一个标签;  
 741    ViewController1 *vc1=[[[ViewController1 alloc]init]autorelease];  
 742     //注如不使用vc1显示是没有其图,因为还不加载它的程序  
 743     vc1.view.backgroundColor=[UIColor blueColor];  
 744      2.解决方法:1.init函数中生成控制器标签生成代码;在创建控制器时就会执行;  
 745                             2. 在appdelegate中生成控制器的标签  
 746                             3.在appdelegate 中调用控制器的函数  
 747 3.本地存储: NSUserDefaults:一旦运行数据就会被存储下来,每次运行程序以前的纪录下来的数据仍然有;  
 748   //只能保存NSString  NSNumber NSData,NSDictionary; NSArray;这五种类型;(其他的是需要强转的  类似于 图片的)  
 749   //保存到本地,一旦保存,再运行还有数据,所以可以达到数据在不通页面间的传递  
 750     NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];  
 751    //为本地存储添加数据;类似于字典的用法   
 752     [userDefault setObject:@"adba" forKey:@"key"];  
 753   //同步操作,保存到本地;  
 754      [userDefault synchronize];   同步了才可以保存到本地的  
 755    //获取以前存储的数据;  
 756     NSString * str=[userDefault objectForKey:@"key"];//根据关键字取出对应的用户默认数据  
 757     NSLog(@"%@",str);  
 758   
 759 //实现UITabBarControllerDelegate代理的方法  
 760 - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController  
 761 {  
 762     NSLog(@"You selected: %d",tabBarController.selectedIndex);  
 763       
 764     //只是一个单例  
 765     NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];//用来存储数据的数据库 创建一个指针来存储和取出数据  
 766     [ud setInteger:tabBarController.selectedIndex forKey:@"LAST_PAGE"];  
 767     [ud synchronize];//将新添加的数据存盘  
 768 }  
 769 //下面4个方法  不是属于类的方法 是系统本来已经提供的方法    只跟视图控制器的出现和消失有关系的  
 770   
 771   
 772 //视图将要出现的时候  
 773   
 774 - (void)viewWillAppear:(BOOL)animated;    // Called when the view is about to made visible. Default does nothing  
 775   
 776 //视图已经出现的时候  
 777 - (void)viewDidAppear:(BOOL)animated;     // Called when the view has been fully transitioned onto the screen. Default does nothing  
 778 //视图将要消失的时候  
 779 - (void)viewWillDisappear:(BOOL)animated; // Called when the view is dismissed, covered or otherwise hidden. Default does nothing  
 780 //视图已经消失的时候  
 781 - (void)viewDidDisappear:(BOOL)animated;  // Called after the view was dismissed, covered or otherwise hidden. Default does nothing  
 782   
 783   
 784 4.数据字典:NSDictionary:用于存储数据可以和数组联合起来用;  
 785 1.字典的初始化方法  
 786     1.直接用数值初始化:  
 787    NSDictionary *dic1=[[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"",@"", nil nil] forKeys:[NSArray arrayWithObjects:@"",@"", nil nil]] ;  
 788   2.用数组初始化  
 789     NSArray *array=[[NSArray alloc]initWithObjects:@"23",@"100",@"zhang" ,nil];  
 790     NSArray *array2=[[NSArray alloc] initWithObjects:@"年龄",@"体重",@"姓名", nil nil];  
 791     NSDictionary *dic1=[[NSDictionary alloc]initWithObjects:array forKeys:array2];  
 792   3.用其他字典初始化  
 793       NSDictionary *dic=[[NSDictionary alloc]initWithDictionary:dic1];  
 794   4.用网络URL初始化  
 795     NSDictionary *dic5=[NSDictionary alloc]initWithContentsOfURL:<#(NSURL *)#>  
 796 2.通过key来找到对应的值;  
 797     NSLog(@"%@",[dic objectForKey:@"key"]);  
 798     
 799 3.创建动态字典 用法和普通字典一样;  
 800     NSMutableDictionary *dic3=[NSMutableDictionary dictionaryWithCapacity:0];  
 801 4.为动态字典添加内容;  
 802     [dic2 setObject:@"180" forKey:@"身高"];  
 803      [dic2 setObject:@"56" forKey:@"weight"];  
 804      [dic2 setObject:@"13" forKey:@"age"];  
 805   
 806 NSNumber 数值对象  
 807 1.初始化数值对象 用一个基础数据类型初始化,如整形,浮点,字符都可以;  
 808   NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];  
 809 2.把数值对象添加到数组中;  
 810     [array addObject:num];  
 811 3.把nsstring类型转换成值;和把数值类型转换成整形  
 812      int i=1;  
 813         NSString *str=[NSString stringWithFormat:@"%d",i];  
 814         int a=[str intValue];//其他数值形式的也可以类似转换   如float b=[str floatValue];  
 815   
 816 UITabBarController的代理函数;  
 817 uitabbarcontroller 中当item很多时会有省略;还可以调整uitabbaritem的排放顺序调整在主页显示的页面;这时会需要tabbarcontroller 的代理类  
 818 1.当某个viewcontroller被选择时触发的事件;  
 819    应用:每当页面显示时有些提示信息……..  
 820 -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController  
 821 {  
 822     NSLog(@"didSelectViewController");  
 823    // NSLog(@"%d",tabBarController.tabBarItem.tag);  
 824     NSLog(@"%d",viewController.tabBarItem.tag);  
 825 }  
 826 2.在某个viewcontroller选择时触发的事件  
 827 -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController  
 828 {  
 829           
 830     NSLog(@"shouldSelectViewController:");  
 831     NSLog(@"%d",viewController.tabBarItem.tag);  
 832     return YES;  
 833 }  
 834 3 将要结束用户自定义item时;既点击导航栏中的done时调用用法:可以提示用户确实要这样更改吗。  
 835 -(void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed  
 836 {  
 837     NSLog(@"willEndCustomizingViewControllers");  
 838     //NSLog(@"%d",viewControllers)  
 839     NSLog(@"%d",changed);  
 840 }  
 841 4.将开始进行用户自定义item时调用;既点击了导航栏中的edit时调用此函数;  
 842 -(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers  
 843 {  
 844     }  
 845 5.结束用户自定义item后调用既单击了done ;用法可以纪录此时的新的item用于永久性更改,下次运行此程序保持这个状态;  
 846 -(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed  
 847 {  
 848     NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];  
 849     for (UIViewController *vc in viewControllers) {  
 850         NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];  
 851         [array addObject:num];  
 852        // NSLog(@"%d",vc.tabBarItem.tag);  
 853           
 854         //把nsstring转换成数据类型  
 855 //        int i=1;  
 856 //        NSString *str=[NSString stringWithFormat:@"%d",i];  
 857 //        int a=[str intValue];  
 858     }  
 859     NSUserDefaults *userdefault=[NSUserDefaults standardUserDefaults];  
 860     [userdefault setObject:array forKey:@"num"];  
 861   
 862     NSLog(@"didEndCustomizingViewController");  
 863 }  
 864 如何保存用户更改的uitabbaritem位置?  
 865  1.在用户用编辑item顺序后执行done,这时在调用的didEndCustomizingViewControllers 函数传递的参数viewControllers 纪录了此时新的排列顺序;这时要用本地存储记下这个顺序;注意因为每个viewcontroller在初始化时设置了自己的tag值,所以只记下tag值就可以找到对应的viewcontroller  
 866 -(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed  
 867 {  
 868     初始化可变数组用于存储tag值  
 869     NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];  
 870     遍历新设置的控制器顺序;并把tag值按顺序存储到可变数组中  
 871     for (UIViewController *vc in viewControllers) {  
 872         NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];  
 873         [array addObject:num];  
 874 }   定义本地存储对象;  
 875     NSUserDefaults *userdefault=[NSUserDefaults standardUserDefaults];  
 876     把可辨数组存入到本地存储中  
 877     [userdefault setObject:array forKey:@"num"];  
 878     NSLog(@"didEndCustomizingViewController");  
 879 }  
 880 2. 在加载函数中可以先判断本地存储是否有数据;如果没有就是用户还未设置过,那item顺序要按加载顺序排列;如果非空的话就把本地存储的数据的赋值给viewcontrollers;  
 881     NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];  
 882     for (int i=0; i<6; i++) {  
 883         UIViewController *vc=[[UIViewController alloc]init];  
 884        [array addObject:vc];  
 885   
 886         UITabBarItem *item=[[UITabBarItem alloc]initWithTitle:[NSString stringWithFormat:@"vc%d",i+1] image:[UIImage imageNamed:@"1.png"] tag:i];  
 887         vc.tabBarItem=item;  
 888         [item release];  
 889         [vc release];  
 890            }   
 891     UITabBarController *tabbar=[[UITabBarController alloc]init];  
 892    tabbar.viewControllers=array;  
 893 注:没有alloc的对象一定不要release;如button一般创建不用alloc;注意注注意  
 894   
 895 9.14 周五  
 896 实现键盘弹起时页面也跟着弹起键盘的高度  
 897 1.基本思想:  
 898      1. 创建两个通知用于监听键盘弹起和落下  
 899               //面试重点:通知;通知中心是管理通知的;  
 900      [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];  
 901     //监听者一般是哪个控件创建谁监听器就谁监听  
 902          //name是监听的信号;  
 903    //selecto监听到信号后触发的事件;   
 904     //object 指监听某个对象,一般是全局监听所以是nil  
 905     [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];  
 906     2.在监听键盘弹起的事件中记下键盘高度,然后把view提高键盘高度  
 907           
 908     -(void)keyboardWillShow:(NSNotification *)noti  
 909 {    键盘弹起时触发的事件;  
 910     //获得键盘的高度, 将传递过来的消息信息纪录达字典;从字典中找到关键字为键盘框架的数据让然后把它转换成cgrect类型读取它的高度  
 911     NSDictionary *dic=[noti userInfo];  
 912     CGRect rect=[[dic objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];   
 913     float h=rect.size.height;  
 914     NSLog(@"%f",h);  
 915     //设置动画 使键盘高度提高;  
 916     [UIView beginAnimations:nil context:nil];  
 917     [UIView setAnimationDuration:0.25];  
 918     self.view.frame=CGRectMake(0, 20-h, 320, 460);  
 919     //注意是20减去键盘的高度;因为view是加载在window上的它的frame是相对于window的。这就要注意了,a控件添加到b控件上a的frame就是相对于b的frame  
 920     [UIView commitAnimations];  
 921 922   3.收起键盘   键盘弹出和收起是随文本编辑开始和退出自动弹出和收起,所以要想让文本框退出编辑模式必须有个事件触发,而在touchesbegan的系统函数中只要鼠标点击就能触发,所以一般在这个里面让textfield退出编辑模式;  
 923 [ resignFirstResponder]; 就是textfield退出编辑模式的函数;  
 924 -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event  
 925 {  
 926     UITextField * textfield=(UITextField *)[self.view viewWithTag:100];  
 927     [textfield resignFirstResponder];  
 928 }  
 929   
 930  4.不使用键盘时让view以动画跳下来;  
 931    -(void)keyboardWillHide:(NSNotification *)noti  
 932 933     [UIView beginAnimations:nil context:nil];  
 934     [UIView setAnimationDuration:0.20];  
 935     self.view.frame=CGRectMake(0, 20, 320, 460);  
 936     [UIView commitAnimations];   
 937 }  
 938   
 939 弹出消息框    
 940 注:弹出消息框所用代理为UIAlertViewDelegate   这是提示框,  这个不用添加到窗口的!!!  
 941   1.创建消息框对象  
 942 UIAlertView *alertview=[[UIAlertView alloc]initWithTitle:@"error" message:@"帐号错误" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil nil];  
 943  让消息框展示出来   
 944     [alertview show];//这是系统自动调用的函数  
 945     [alertview release];  
 946  2.在消息框对象的代理函数中执行操作 消息框有四个代理函数,点击函数最常用   
 947 -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex  
 948 {  
 949       通过传递过来的button序号知道那个button进行了操作执行相应的命令  
 950      //按钮从左边计数;  
 951     if (buttonIndex==0) {  
 952         self.view.backgroundColor=[UIColor yellowColor];  
 953     }  
 954     else  
 955         self.view.backgroundColor=[UIColor brownColor];  
 956 }  
 957   
 958 从相册和相机获取图片  
 959 思想: 1.创建获取图片按钮和接收图像的的视图控件  
 960                 imageview =[[UIImageView alloc]initWithFrame:CGRectMake(100, 80, 100, 100)];  
 961     [self.view addSubview:imageview];  
 962     UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
 963     button.frame=CGRectMake(100, 190, 120, 20);  
 964     [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];  
 965    [self.view addSubview:button];  
 966   
 967 //提示框  
 968      2.在button触发的事件中生成UIActionSheet对象去选择从哪里获取图片  
 969        -(void)buttonClick  
 970 {  
 971     UIActionSheet *as=[[UIActionSheet alloc]initWithTitle:@"选择图片来源" delegate:self  cancelButtonTitle:@"取消" destructiveButtonTitle:@"相机" otherButtonTitles:@"相册", nil nil];  
 972   //可以生成多个按钮  
 973     [as showInView:self.view];  
 974    展示这个动作页面;  
 975     [as release];  
 976 }  
 977       3.通过调用UIActionSheet的代理函数获取图片;所以头文件必须声明他的代理一般用到是点击函数,通过传递按钮的排列序号知道那个按钮被点击触发相应的事件  
 978        -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex  
 979 {  
 980     if (buttonIndex==2) {   
 981         return;  
 982     }  
 983 // 取消按钮序号是2,所以如果指针是2,表明触发了取消,注意对应的序号要和创建时一致;  
 984     UIImagePickerController *pc=[[UIImagePickerController alloc]init];  
 985       
 986    //创建图片获取控制器;根据点击按钮不同从不同的资源获取图片;  
 987     // 防止触发虚拟机不能完成的事件发生崩溃,提前做一下判断,如果不是虚拟机就执行操作;  
 988      if(buttonIndex==0 && TARGET_IPHONE_SIMULATOR)  
 989      {  
 990          [pc release];  
 991          return;  
 992      }  
 993     if(buttonIndex==0){  
 994        pc.sourceType=UIImagePickerControllerSourceTypeCamera;  
 995     }  
 996     else if(buttonIndex==1)  
 997     {  
 998         //pc.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;  
 999           
1000         pc.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;  
1001     //区分这两个属性的不同第一个  
1002     }  
1003   
1004     pc.delegate=self;  
1005     //这个对象设置代理需要遵从两个协议UIImagePickerControllerDelegate, 和导航控制协议 因为图片控制器也是个导航控制器UINavigationControllerDelegate  
1006 //把控制器交给图像资源获取控制器  
1007      [self presentModalViewController:pc animated:YES];  
1008     [pc release];  
1009 }  
1010 在系统中的图片获取器中点击按钮可以触发的事件  
1011 //点击图片调用的函数  
1012 -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo  
1013 {  
1014     imageview.image=image;  
1015     [picker dismissModalViewControllerAnimated:YES];  
1016 }  
1017 //点击取消触发的事件  
1018 -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker  
1019 {  
1020     [picker dismissModalViewControllerAnimated:YES];  
1021   
1022 }  
1023   
1024 9.17 第十周 周一  
1025   
1026 UIScrollView 滚动视图  
1027 注:苹果的内存复用机制:视图很大超过了屏幕显示的范围,在显示的只是屏幕上的内容,为了减少内存使用把不现实的那用从内存中去除;  
1028 1.滚动视图的初始化  
1029    UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
1030    frame:是滚屏在视图上占用的大小;  
1031 2.给滚动视图添加控件时,如果控件有事件响应的话,系统设置了一个定时器,如果在限定事件内拖动的话,该控件就失去了响应机会,拖动视图也会跟着拖动;  
1032 UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
1033     button.frame=CGRectMake(100, 100, 100, 50);  
1034     //注意按钮的响应时间,如果按钮在没响应前滑动,此时就相当于视图滑动  
1035      
1036 3.设置滚屏的大小,这个属性很重要   显示的是内容的大小   体现了滚动视图的经典  
1037     sv.contentSize= CGSizeMake(320, 460*2);  
1038    滚屏的真实大小;  
1039 4.初始位置设置    //偏移量   是一个点  有x值与  y值  
1040     sv.contentOffset=CGPointMake(90, 90);  // contentOffset.x 与 contentOffset。y  
1041 //注:x,y是屏幕的框架原点相对于滚屏的原点的位置;当滚屏超出手机框架时这两个值比为正数;  
1042 5.竖直和水平滚动条是否显示;默认时显示滚动条//这条很重要    
1043     sv.showsVerticalScrollIndicator=NO;//是否显示竖直方向的滚动条  
1044     sv.showsHorizontalScrollIndicator=NO;//是否显示水平方向的滚动条,默认是显示的 ,不显示设置成NO  
1045 6.反弹效果的设置;设为yes后可以反弹;设为no就不能反弹;  
1046     sv.bounces=YES;  
1047     //总是反弹,即使大小和边框一样也可以有反弹效果;  
1048     sv.alwaysBounceHorizontal=YES;  
1049     sv.alwaysBounceVertical=YES;  
1050 7.设置为不可滚动;即使大于框架  
1051    sv.scrollEnabled=NO;  
1052   
1053 //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面  
1054         [sv addSubview:imageView];  
1055 //再把滚动视图添加到  总试图上面  
1056     [self.view addSubview:sv ];  
1057   
1058 //设置显示内容尺寸  
1059     sv.contentSize=CGSizeMake(260*4, 400);  
1060     //设置按照页码滚动  
1061     sv.pagingEnabled=YES;//这样设置是保证 一页一页的显示出来 不可能只显示一半,用户不喜欢看到这个效果;  
1062     //设置边缘弹动效果//主要是给用户感觉的  
1063     sv.bounces=YES;//可以弹动的      也可以sv.bounces=NO;此时到边缘就不能滚动,不会出现一些不该出现的空白  
1064     //改变滚动条偏移量  当前显示内容的偏移量;  
1065     sv.contentOffset=CGPointMake(100, 0);  
1066   
1067 使用:代理的三部曲,每一个协议方法都是这么来做的  
1068 遵守协议(什么控制器遵守什么协议  写在尖括号里面)  
1069 委托代理(A.delegate=self)  
1070 实现方法(完成的方法);  
1071   
1072 8.滚动条的代理函数     
1073    1.当屏幕滚动时调用的函数  
1074     -(void)scrollViewDidScroll:(UIScrollView *)scrollView  
1075 {  
1076     NSLog(@"%f %f",scrollView.contentOffset.x,scrollView.contentOffset.y);  
1077 }  
1078       2. 将要开始拖动时调用  
1079 -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView  
1080   
1081     3.滚动结束后调用  手指抬起开始减速的瞬间 开始回调  //用这个方法来实现拖动的时候 页的对应    
1082 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView  
1083 {  
1084     NSLog(@"endDrag");  
1085 }  
1086    4.滚屏结束时调用    
1087 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView   
1088   
1089   
1090    5.滚屏将开始减速时调用  
1091 -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView  
1092   
1093   
1094 用一个类来封装一下,封装就是派生出一个类,写自己的类,  
1095   
1096 9.用滚动视图来显示图片的缩放;注:滚屏只能执行单一功呢,要么让他做缩放功呢,要么让他实现滚屏;  
1097   1.创建滚动视图  
1098     super viewDidLoad];  
1099     UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
1100   2.设置最大最小缩放  
1101     //缩放和滑动止只能选一  
1102     sv.maximumZoomScale=5.0;  
1103     sv.minimumZoomScale=0.5;  
1104   3. 创建视图控件,然后添加到滚屏中。  
1105   imageview=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"5.png"]]];  
1106     imageview.frame=CGRectMake(100, 100, 50, 50);  
1107     [sv addSubview:imageview];  
1108     [imageview release];  
1109   4.用到滚屏的函数要给它设置代理  
1110     sv.delegate=self;  
1111   
1112 处理用户响应事件,需要重载那三个触摸的方法,开始,触摸到,末尾,  
1113   
1114   5.在滚屏的放大缩小函数中写实现功能  
1115  -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView  
1116 {  
1117       
1118         static int i=0;  
1119       
1120     if (scrollView!=myScrollView) {  
1121         return [scrollView.subviews objectAtIndex:i];  
1122         i++;  
1123          
1124           
1125     }  
1126     else  
1127         return NULL;  
1128 }  
1129   
1130   
1131 封装一个类达到的效果 简化代码,很有好处  
1132   
1133   
1134 10.运用滚动屏实现广告条展示;  
1135     设计思想:滚动广告起始和最后广告条实现不间断的无限循环;所以要多家一个视图,最后一个视图和第一个一样,这样可以保证不间断;  
1136    UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];  
1137     sv.contentSize=CGSizeMake(320, 200*9);  
1138     sv.scrollEnabled=NO;  
1139   //视图的可滚动属性设为no不可滚动;  
1140     sv.tag=100;  
1141     [self.view addSubview:sv];  
1142     sv.showsVerticalScrollIndicator=NO;  
1143     for (int i=0; i<9; i++) {  
1144         UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, i*200, 320, 200)];  
1145         imageview.image=[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i]];  
1146         [sv addSubview:imageview];  
1147         [imageview release];  
1148     }  
1149 //创建计时器来控制图片定时更替  
1150     NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];  
1151 }  
1152 -(void)timer:(NSTimer *)timer  
1153 {  
1154     UIScrollView *sv=(UIScrollView *)[self.view viewWithTag:100];  
1155      //当滚屏滚到最后一幅图时,让滚屏从头开始  
1156     if(sv.contentOffset.y==200*8)//偏移量contentOffset,画布向左偏移是正的,向右偏移是负的,这是原则;  
1157     {  
1158         sv.contentOffset=CGPointMake(0, 0);  
1159     }  
1160     [sv setContentOffset:CGPointMake(0, sv.contentOffset.y+200) animated:YES];  
1161   
1162 }  
1163 UIPageControl 分页显示  页面控制器  
1164 1.初始化对象  
1165  UIPageControl *pc=[[UIPageControl alloc]initWithFrame:CGRectMake(0, 440, 80, 20)];  
1166 2.设置页数  
1167     pc.numberOfPages=4;//设置小点的个数  
1168     pc.tag=100;  
1169 3.为分页点添加事件  
1170     [pc addTarget:self action:@selector(pc:) forControlEvents:UIControlEventTouchUpInside];  
1171 4.在滑动页面时,为每页定位      开发者无法判断用户判断到哪一页,所以只有委托UIScrollView的方法  
1172 使用这个函数之前要实现UIScrollViewDelegate代理  
1173 -(void)scrollViewDidScroll:(UIScrollView *)scrollView  
1174 {  
1175     UIPageControl *pc=(UIPageControl *)[self.view viewWithTag:100];  
1176     pc.currentPage=scrollView.contentOffset.x/320;//改变原点的颜色  
1177 }  
1178 5.注意要想给滚屏分页,除了创建分页对象还要让滚屏设置分页属性  
1179   sv.pagingEnabled=YES;  
1180   
1181 //遵从UIScrollViewDelegate协议,实现UIScrollViewDelegate里面的方法  
1182 -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView  
1183 {//当页面开始减速的瞬间回调函数  
1184     int pageNumber=scrollView.contentOffset.x/320;//contentoffset 内容的偏移量  
1185       
1186     myPageontrol.currentPage=pageNumber;  
1187 }  
1188   
1189   
1190   
1191   
1192 9.18周二  
1193   
1194 必须实现的  
1195 @required  
1196   
1197 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;  
1198   
1199 // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:  
1200 // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)  
1201   
1202 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;  
1203   
1204 UITableView 表视图  
1205 1.初始化表格控件  
1206     UITableView * tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStyleGrouped];  
1207     tableview.tag=100;  
1208 2.给表格控件添加代理。注意它有两个代理//必须是两个代理  
1209     tableview.delegate=self;  
1210     tableview.dataSource=self;  
1211 3.表格控件的代理函数  
1212 //delegate 行数和单元格函数必须实现。否则程序无法运行;  
1213   
1214 1.行数  
1215 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1216 {  
1217         return dataarray.count;//有的时候每一行都是一样的  
1218 }  
1219   
1220 1,复用机制;要重点了解;  
1221 2,只有一列,两列的话就是有两个tableView;  
1222 3,有数据源对象,代理对象,tableView本身的对象;  
1223   
1224 2.cell单元格//多少个格子要完成;每个格子里面是什么东西;  一定要完成这两个协议,否则UITableView会崩溃  
1225 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1226 {  
1227    为每个单元个加一个标志,便于取得//每个格子的标题  
1228     NSString *strID=@"ID";//代表的是某种类型的cell;字不是写的一样,但都是一种  
1229        从表格对象中得到移出屏幕得对象;  
1230     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:strID];//用队列的方式去找cell  
1231     if (cell==nil) {  
1232     //空值的情况,重现创建一个  
1233         //顶多分配20个,然后不会再去分配了。然后反复的使用,0到10 是可以被替换的,不是一下子分配一万个,内存考虑  
1234         cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:strID]autorelease];  
1235       //     UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 20)];  
1236        // label.text=[NSString stringWithFormat:@"%d",indexPath.row];  
1237 //        [cell addSubview:label];  
1238 //        label.tag=100;  
1239           
1240     }  
1241 //    indexPath.row; 行数         
1242 ////    indexPath.section 段数     section代表的是组数,分组的时候就出来了  
1243 //    UILabel *label=(UILabel *)[self.view viewWithTag:100];  
1244 //    label.text=[dataarray objectAtIndex: indexPath.row];  
1245    //添加图片  
1246     cell.imageView.image=[UIImage imageNamed:@"5.png"];  
1247     //添加细节名称表明可以展开cell  
1248     cell.detailTextLabel.text=@"open";  
1249     //表示有更多内容的展示风格//表格栏的尖尖  一半的中括号  
1250     cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;  
1251     //选择时变色设置  
1252     cell.selectionStyle=UITableViewCellSelectionStyleNone;  
1253 //  设置cell文本  从数组中取出来   可以把文字统一放到数组里面去  
1254     cell.textLabel.text = [dataarray objectAtIndex:indexPath.row];//主标题  
1255      //添加细节名称表明可以展开cell      副标题  
1256     cell.detailTextLabel.text=@"open";  
1257   
1258   
1259     return cell;  
1260 }  
1261   
1262 删除或添加cell   先删除数据,再添加数据源 ,分为两步,  因为它有两个代理 ,其中一个就是数据源代理  
1263   
1264   
1265  3. 段数  
1266 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
1267 {  
1268     return 3;  
1269 }  
1270 4.行高  
1271 -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath  
1272 {  
1273   //  可以设置每个行行高  
1274 //    if (indexPath.row==1) {  
1275 //        return 20;  
1276 //    }  
1277     return 50;  
1278 }  
1279 5.段头标题  
1280 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section  
1281 {  
1282   return @"abc";  
1283   
1284 }  
1285 6.段尾标题  
1286 -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section  
1287 {  
1288    return @"tial";  
1289   
1290 }  
1291 7.删除和添加  
1292 设置每个单元格的可编辑属性默认是yes所以当让它处于编辑模式时这个函数可以不写  
1293 //设置元素的可编辑性  
1294 -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath  
1295 {  
1296     return YES;  
1297 }  
1298 //更改单元格的编辑属性;可以设置为删除和插入  
1299 - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{  
1300     return UITableViewCellEditingStyleInsert;//插入模式;  
1301 }  
1302   
1303 //可以滑动弹出删除键删除,也可以设置编辑按钮,点击编辑按钮删除  
1304 -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath  
1305 {  
1306      删除时既要从屏幕上删除,又要从数组中删除,  
1307     [dataarray removeObjectAtIndex:indexPath.row];  
1308     [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];  
1309    }  
1310 注意:如果表格分很多段,就必须分段操作;  
1311 1.分几段,就创建几个数组,以防删除不同段内容相互影响,导致崩溃;  
1312 2.在给每段单元格添加标题时也要分段添加;返回行数时也要按段来返回数组的行数;  
1313 3.在删除单元格时要根据段不同删除不同的数组元素;  
1314 //删除按钮改名为  
1315 -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath  
1316 {  
1317    return @"2334";  
1318 }  
1319 7.为选择cell添加操作;下面操作为点击就会跳到新页面;作为选择cell操作的时候来用的  
1320 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
1321 {  
1322     UIViewController *vc=[[UIViewController alloc]init];  
1323     vc.title=[NSString stringWithFormat:@"%d",indexPath.row];  
1324     [self.navigationController pushViewController:vc animated:YES];//push之后再去加载;  
1325 }  
1326 8.//didSelectRowAtIndexPath作为cell选择操作的时候用  
1327 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  
1328 {  
1329     UISearchBar * search = (UISearchBar *)[self.view viewWithTag:102];  
1330     //是否是第一响应事件  
1331     if ([search isFirstResponder]) {  
1332     //若果是的画 就响应  
1333         [search resignFirstResponder];  
1334     }  
1335 }  
1336   
1337 9.为表格添加索引,点击就会跳到对应位置,分段的话每个标记代表一段  
1338 -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView  
1339 {  
1340    return [NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];  
1341 }  
1342 10.移动某个cell  
1343 -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath  
1344 {  
1345     return YES;  
1346 }  
1347 -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath  
1348 {  
1349     //注意从前往后和从后往前移动不同  
1350     NSString *str=[dataarray objectAtIndex:sourceIndexPath.row];  
1351    // NSString *str1=[dataarray objectAtIndex:destinationIndexPath.row];  
1352     if(sourceIndexPath.row1353         [ dataarray insertObject:str atIndex:destinationIndexPath.row+1 ] ;  
1354         [dataarray removeObjectAtIndex:sourceIndexPath.row];  
1355          
1356     }  
1357     else  
1358     {  
1359         [dataarray insertObject:str atIndex:destinationIndexPath.row];  
1360         [dataarray removeObjectAtIndex:sourceIndexPath.row+1];  
1361     }  
1362   
1363 }  
1364 注意有导航条时table的高要减掉导航条的高;  
1365 //@required里面的方法是必须要实现的;@optional里面的方法可以实现也可以不实现  
1366   
1367 @interface VC01 : UIViewController   
1368 //UITableView实现不了的,就用代理,让别人帮他实现,实现里面需要的方法  
1369   
1370 9.19 周二  
1371 搜索条一般搜索条  
1372 -(void)viewDidLoad  
1373 {  
1374     [super viewDidLoad];  
1375     dataArray=[[NSArray alloc]initWithObjects:@"dwew",@"dfas",@"aads",@"we", nil nil];  
1376            注:在搜索设置时数组创建一定要用alloc;而且release 要在最后的dealloc中;因为数组用于更新数据,不断的使用如果不用alloc创建可能会被释放导致数组不可用;  
1377      _tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
1378     _tableview.delegate=self;  
1379     _tableview.dataSource=self;  
1380      注:写tableview 的协议;  
1381     [self.view addSubview:_tableview];  
1382 //创建搜索条  
1383     UISearchBar *search=[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 88)];  
1384     search.delegate=self;   
1385     注:注意添加uisearchbar的协议;  
1386   //添加搜索栏  
1387     mSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];  
1388     [mSearchBar setTag:102];  
1389     _mTableView.tableHeaderView = mSearchBar;  
1390   
1391   
1392   
1393   
1394     search.showsScopeBar=YES;  
1395     search.scopeButtonTitles=[NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];  
1396     注:添加范围条;两个函数必须连用;要对其添加事件要在下面函数中添加,这个事件是在点击button时触发  
1397 -(void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope  
1398   
1399     search.showsCancelButton=YES;  
1400     注:添加取消键  
1401     search.showsSearchResultsButton=YES;  
1402     注:设置搜索键 出发事件要和下面的函数连用 一般用于撤销键盘实现搜索功能;  
1403 -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar   
1404   
1405          注:将搜索条添加到tableview中;  
1406     _tableview.tableHeaderView=search;     
1407 }  
1408   // 添加取消按钮,点击取消按钮时触发;  
1409 -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar  
1410 {  
1411     [searchBar resignFirstResponder];  
1412     searchBar.text=@"";  
1413 }  
1414 // 如果设置搜索列表键为真,将添加了搜索列表键到搜索列表的后面,点击时触这个事件;  
1415 -(void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar{  
1416    searchBar.text=@"resultslistbutton";  
1417   
1418 }  
1419 //点击键盘上的搜索键时触发;  
1420 -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar  
1421 {  
1422     [self searchBar:searchBar textDidChange:searchBar.text];  
1423 }  
1424 //当添加了范围界定条时点击上面的按钮触发  
1425 -(void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope  
1426 {  
1427     if (selectedScope==0) {  
1428         searchBar.text=@"a";  
1429     }  
1430     else if(selectedScope==1){  
1431         searchBar.text=@"b";  
1432     }  
1433     else  
1434         searchBar.text=@"c";  
1435     [self searchBar:searchBar textDidChange:searchBar.text];  
1436 //调用自己的函数;对数据进行搜索;从此也得知,非键盘输入的数据要搜索必须通过调用搜索函数出发,或者在键盘状态加入非键盘输入的数据;  
1437 }  
1438 //返回表格的行数;根据是否是搜索状态还非搜索状态反会不同的数据  
1439 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1440 {  
1441     if (isSearch==YES) {  
1442         return searchArray.count;  
1443     }  
1444     else  
1445     return dataArray.count;  
1446 }  
1447 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1448 {  
1449     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];  
1450     if (cell==nil) {  
1451         cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"]autorelease];  
1452     }  
1453       
1454     if (isSearch==YES) {  
1455         NSLog(@"%@",searchArray);  
1456         cell.textLabel.text=[searchArray objectAtIndex:indexPath.row];  
1457     }  
1458     else{  
1459     cell.textLabel.text=[dataArray objectAtIndex:indexPath.row];  
1460     }  
1461     return cell;  
1462 }  
1463   
1464   
1465   
1466   
1467   
1468   
1469 //搜索条中的内容改变时调用;但有个问题就是一旦开始搜索取消后原内容不显示因为这个函数只有搜索条中输入值时才调用;所以搜索取消不显示原有数据;但是如果在结束编辑中调用此函数就不会出现此情况;  
1470 但是此时如果有取消键的话又必须在取消键中添加内容让取消后清空搜索框并加载原又数据;所以下面的三个函数是联系起来的  
1471 -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText  
1472 {  
1473     if (searchBar.text==nil||[searchBar.text isEqualToString:@""]) {  
1474         isSearch=NO;  
1475         [_tableview reloadData];//自动刷新,  自动刷新数据  
1476     }  
1477 NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF contains [cd] %@",searchBar.text];  
1478    self.searchArray=[dataArray filteredArrayUsingPredicate:predicate];  
1479         isSearch=YES;  
1480     [_tableview reloadData];  
1481   
1482 }  
1483 -(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{  
1484   
1485     [self searchBar:searchBar textDidChange:searchBar.text];  
1486 }  
1487 -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar  
1488 {  searchBar.text=@"";  
1489     isSearch=NO;  
1490     [_tableview reloadData];   
1491     [searchBar resignFirstResponder];     
1492 }  
1493 运用搜索控制器来实现搜索功能  
1494 -(void)viewDidLoad  
1495 {     
1496     dataarray=[[NSArray alloc]initWithObjects:@"da",@"dee",@"ded",@"rtt", @"esdf",@"effy",@"qqo",@"ett",@"sdfa",@"dfg",nil];  
1497   注:创建搜索数组,数组必须用alloc初始化而且不能被release;    
1498     tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];  
1499     tableview.delegate=self;  
1500     tableview.dataSource=self;  
1501     tableview.tag=100;  
1502     注:要为tableview添加tag属性便于知道搜索状态应为处于搜索状态时搜索控制器就会覆盖住表格框;所以通过判断此时是的tableview是那个可以知道更新那个数组数据;  
1503     [self.view addSubview:tableview];  
1504     [tableview release];  
1505     UISearchBar *searchbar=[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];  
1506     tableview.tableHeaderView=searchbar;  
1507        注:创建搜索展示控制器 把导航条添加进去;把文本控制设置为本类;  
1508     searchdisplay=[[UISearchDisplayController alloc]initWithSearchBar:searchbar contentsController:self];  
1509     注:设置代理,和搜索资源搜索代理;  
1510     searchdisplay.delegate=self;  
1511     searchdisplay.searchResultsDataSource=self;  
1512     searchdisplay.searchResultsDelegate=self;  
1513    注意:此时搜索控制器不用释放,因为这个搜索器需要不断被调用;  
1514     [searchbar release];  
1515 }  
1516    根据此时那个tableview被使用返回数据;  
1517 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1518 {  
1519     if (tableView.tag==100) {  
1520         return dataarray.count;  
1521     }  
1522     return searcharray.count;  
1523 }  
1524 //设置单元格;  
1525 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1526 {  
1527     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];  
1528     if (cell==nil) {  
1529         cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];  
1530     }  
1531     if (tableView.tag==100) {  
1532         cell.textLabel.text=(NSString *)[dataarray objectAtIndex:indexPath.row];  
1533     }  
1534     else  
1535         cell.textLabel.text=(NSString *)[searcharray objectAtIndex:indexPath.row];  
1536      
1537     return cell;  
1538 }  
1539 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
1540 {  
1541     return 3;  
1542 }  
1543 //更新数据前对数据进行过滤;得到过滤的数据;此函数是个实时监控函数;  
1544 -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{  
1545     NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF contains [cd] %@",searchString];  
1546     self.searcharray=(NSArray *)[dataarray filteredArrayUsingPredicate:predicate];  
1547     NSLog(@"%@",searcharray);  
1548     return YES;  
1549 }  
1550 //返回tableview中和对应段指针相对应的section的title;相当于为每段设置了一个名字  
1551 -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView  
1552 {  
1553     return [NSArray arrayWithObjects:UITableViewIndexSearch,@"a",@"b",@"c",nil];  
1554 //注意这里添加了一个搜索,所以搜索指针对应发生改变;在下面的函数返回时要注意  
1555 }  
1556 //返回和title和index一致的section  
1557 -(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index  
1558 {  
1559     if (index==0) {  
1560         [tableView setContentOffset:CGPointMake(0, 0)];  
1561     }  
1562     return index-1;  
1563 }  
1564 //设置section的头标题;  
1565 -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section  
1566 {  
1567     return [NSString stringWithFormat:@"%d",section];  
1568 }  
1569 注意:有些对象没有被释放要写dealloc函数;  
1570   
1571 设置控件的收起和放下  
1572 (void)viewDidLoad  
1573 {  
1574     [super viewDidLoad];  
1575     array=[[NSArray alloc]initWithObjects:@"小红",@"小梅",@"小李", nil nil];  
1576      
1577     tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];  
1578     tableview.delegate=self;  
1579     tableview.dataSource=self;  
1580 tableview.sectionHeaderHeight=30;  
1581 //设置tableview的section头标题的高;便于以后添加控件和控件大小相适应  
1582     [self.view addSubview:tableview];  
1583     [tableview release];  
1584     p[0]=1;//p是有两个元素的整形数组做为开关;如果设置几段需要几个开关,就让数组元素个数是几  
1585     p[1]=1;  
1586     
1587 }  
1588 //根据数组元素的值确定段是打开还是收起;  
1589 //简称设置行数  
1590 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1591 {  
1592     if (p[section]==0) {  
1593         return 0;  
1594     }  
1595     return array.count;//直接返回  
1596 }  
1597 //设置组数  
1598 -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView  
1599 {  
1600     return 2;  
1601 }  
1602 //创建表格单元格  
1603 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1604 {  
1605     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];  
1606     if (cell==nil) {  
1607         cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"]autorelease];  
1608     }  
1609     cell.textLabel.text=[array objectAtIndex:indexPath.row];  
1610     return cell;  
1611 }  
1612 //为表格的段头添加view让此view加载label和button,并为button添加事件用于控制开关的打开和关闭;既置0和置1;  
1613 -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section  
1614 {  
1615     UIView *view=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];  
1616     view.backgroundColor=[UIColor blueColor];  
1617     UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 80, 30)];  
1618     label.backgroundColor=[UIColor clearColor];  
1619       
1620     if (section==0) {  
1621         label.text=@"我的好友";  
1622     }  
1623    else  
1624        label.text=@"黑名单";  
1625       
1626     [view addSubview:label];  
1627       
1628     UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];  
1629     button.tag=section;  
1630 //注意添加button的tag用于鉴别是哪个button;  
1631     button.frame=CGRectMake(0, 0, 320, 30);  
1632     [button addTarget:self action:@selector(buttonclick:) forControlEvents:UIControlEventTouchUpInside];  
1633     [view addSubview:button];  
1634       
1635     return view;         
1636 }  
1637 //button事件用于控制开关状态;  
1638 -(void)buttonclick:(UIButton *)sender  
1639 {  
1640     if (p[sender.tag]==0) {  
1641         p[sender.tag]=1;  
1642     }  
1643     else  
1644         p[sender.tag]=0;  
1645       
1646     [tableview reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationFade];  
1647    //重新加载section根据button的不同来决定加载那个section 之 所以可以这样适应为button。tag是根据section设置的;此时加载section需要的数据是nsindexset类型搜一要把button的tag转换成此类型;  
1648 }  
1649   
1650 为解决问题:怎么让section头宽度变大?  
1651 解决方法:设置tableview的section的头高 设置代码为:tableview.sectionHeaderHeight=30;  
1652 cell的层次 view在cell上contentview又在view上其他控件又加在了content view上  
1653   
1654 cell的contentView   cell上面的内容视图  
1655   
1656   
1657 9.20周四  
1658 和xib文件连用创建表格  
1659 创建表格框,然后创建xib文件,并把xib文件中的默认视图删除;添加tableviewcell 可以在里面添加其他控件;  
1660 -(void)viewDidLoad  
1661 {    [super viewDidLoad];  
1662         UITableView * tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320,460) style:UITableViewStylePlain];  
1663         tableView.delegate=self;  
1664         tableView.dataSource=self;  
1665         [self.view addSubview:tableView];  
1666         [tableView release];  
1667 }  
1668 //设置行数  
1669 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1670 {  
1671     return 20;  
1672 }/  
1673 //在创建cell的函数中将xib创建的文件添加到tableview中;  
1674 -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1675 {  
1676     UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:indexPath.row%2==0?@"ID":@"ID2"];  
1677     if(cell==nil){  
1678         //cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];  
1679         cell=[[[NSBundle mainBundle] loadNibNamed:indexPath.row%2==0?@"MYcell":@"MYCell2" owner:self options:nil]objectAtIndex:0];  
1680         //和xib中的文件绑定;  
1681     }  
1682 //设置cell颜色要注意是设置contentview的颜色应为它覆盖在cell上;  
1683   //  cell.contentView.backgroundColor=[UIColor redColor];  //cell也是个view 上有contentview 其实label也是加再contentview上  
1684       
1685     return cell;  
1686 }  
1687   
1688 //自定义的cell注意在创建自定义cell类在写继承时是继承UITableViewCell;  
1689    创建cell类后在初始化文件中写上初始化的cell特性,既需要更改什么属性,加在其他控件;  
1690 - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier  
1691 {  
1692     self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];  
1693     if (self) {  
1694         self.myLabel=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 40)];  
1695         myLabel.textAlignment=UITextAlignmentCenter;  
1696         myLabel.backgroundColor=[UIColor greenColor];  
1697         [self addSubview:myLabel];  
1698         [myLabel release];  
1699           
1700     }  
1701       
1702     return self;  
1703 }  
1704 //在控制器中创建cell时创建自定义cell  
1705 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1706 {  
1707   
1708   
1709 //复用池,每次显示满屏dequeueReusableCellWithIdentifier方法  复用机制  
1710     CustomCell *cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"ID"];   
1711     if (cell==nil) {  
1712         cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];  
1713           
17141715 //加载文本从资源文件中获取;  
1716     NSString *str=[NSString stringWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"ui" ofType:@"rtf"] encoding:NSUTF8StringEncoding error:nil ];   // NSString *str=[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"c" ofType:@"rtf"] encoding:NSUTF8StringEncoding error:nil];  
1717     cell.myLabel.text=str;  
1718     return  cell;  
1719 }  
1720   
1721   
1722   
1723 9.24 周一 第十一周(网络  
1724 在使用不同的网络协议传输时都要先加入协议文件;如果用到他们的对应函数时要写协议,设置代理  
1725 1.json 格式网络传输  
1726     在网络中传输请求时用的时是字符串。他们用{}[]链接起来;其中{}表示字典;[]表示数组;解析时只要分清层次需要从哪取数据就用相应的数组或对象取数据;  
1727 1.网络数据解析  
1728    //{ "title":"harry pottery", "price":"999$"}   
1729     NSString *json=@"{\"title\":\"harry pottery\",\"price\":\"99999\"}";  
1730     //双引号里面不能在有双引号,所以加双引号前要加反斜杠;  
1731     NSDictionary *dic=[json JSONValue];  
1732     NSString *str=[dic objectForKey:@"title"];  
1733     NSLog(@"%@",str);  
1734     //[{"a","b","c"}]  
1735     json=@"[\" a\", \"b\",\"c\"]";  
1736     NSArray *array=[json JSONValue];  
1737     for (NSString *s in array) {  
1738         NSLog(@"%@",s);  
1739     }  
1740   
1741 /*    { "books":[ 
1742  { 
1743        "title": "harry1" 
1744  }, 
1745  { 
1746        "title":"harry2" 
1747 1748         ] 
1749       "num":"7" 
1750  } 
1751  */  
1752     /*  
1753      } 
1754      */     
1755     json=@"{\"key1\":[{\"key2\":\"value2\"},\"value3\" ]}";  
1756     NSDictionary *dic1=[json JSONValue];  
1757    array=[dic1 objectForKey:@"key1"];  
1758     dic=[array objectAtIndex:0];  
1759     NSString *st=[dic objectForKey:@"key2"];  
1760     NSLog(@"%@",st );  
1761   
1762 2 .SBJson网络传输数据:要加入第三方协议:SBJson 冰岛入SBJson.h头文件   
1763  NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost/1.gif"]];  
1764     UIImage *image=[UIImage imageWithData:data];  
1765     UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];  
1766     imageview.image=image;  
1767     [self.view addSubview:imageview];  
1768   
1769 3.SDWebImage 网络传输  
1770      //使用SDWebImage 传输数据,而且它是个自带缓存打开过,再打开时还存在;  
1771    在使用图片按钮传输时要引人头文件  
1772 #import "UIImageView+WebCache.h"  
1773 #import "UIButton+WebCache.h"  
1774      NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];  
1775     UIImageView *image =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];  
1776     [image setImageWithURL:url];  
1777     [self.view addSubview:image];  
1778     [image release];  
1779 4.ASIHTTPRequest网络传输???????  
1780 首先要导人四个库文件libz.1.2.5.dylib,CFNetwork.framework,  
1781 SystemConfiguration.framework,MobileCoreServices.framework  
1782 引人头文件 #import "ASIHTTPRequest.h" 同时要添加ASIHTTPRequest.h协议;设置代理  
1783    NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];  
1784 //使ASIHTTPRequest 传输数据;注意这个需要加第三方协议  
1785     ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];  
1786     request.delegate=self;  
1787     [request startSynchronous];  
1788 //开始同步  
1789    [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;  
1790 //网络请求,如果为yes,就一直旋转  
1791 -(void)requestFinished:(ASIHTTPRequest *)request  
1792 {  
1793     UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];  
1794     imageview.image=[UIImage imageWithData:request.responseData];  
1795     [self.view addSubview:imageview];  
1796 }  
1797   
1798 5.异步传输  这种异步传输需要代理    
1799   
1800   /异步传输数据:优点:在传输数据没有完成前,可以对网页上的其他东西进行操作;  
1801     [super viewDidLoad];  
1802     NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];  
1803     //创建请求  
1804     NSURLRequest *request=[NSURLRequest requestWithURL:url];  
1805     //发送请求  
1806     [NSURLConnection connectionWithRequest:request delegate:self];  
1807     data1=[[NSMutableData alloc]init];  
1808    imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];  
1809     [self.view  addSubview:imageview];  
1810          
1811 }  
1812 //异步传输链接的代理函数:  
1813 //链接响应时调用  
1814 -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response  
1815 {  
1816      
1817     NSLog(@"didreceiveresponse");  
1818 }  
1819 //加载完成时调用  
1820 -(void)connectionDidFinishLoading:(NSURLConnection *)connection  
1821 {  
1822       
1823     imageview.image=[UIImage imageWithData:data1];  
1824     NSLog(@"connectiondidFinishload");  
1825       
1826 }  
1827 //反复调用不断接收新数据  
1828 -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data  
1829 {  
1830      [data1 appendData:data];  
1831     NSLog(@"didreceivedata");  
1832 }  
1833 //链接发生错误时响应;  
1834 -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error  
1835 {  
1836     NSLog(@"error");  
1837 }  
1838   
1839   
1840 xml  
1841 首先导人GData 文件, 然后通过在项目头文件中Build Phases中第三个选项中数添加libxml2 文件并将其移动到项目下面, 然后在 BuildSettings中在search paths中在 Header Search Paths 中添加路径/use/include/libxml2 这样就可用xml 读取网络文件了;  
1842 1.将网络编码文件存入字符串;  
1843  NSString *xmlstr=[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];  
1844  2.将字符串转变成GDataXMLDocument 类行的文件;  
1845 获取文件  
1846     GDataXMLDocument *xmldoc=[[GDataXMLDocument alloc]initWithXMLString:xmlstr options:0 error:nil];  
1847 3.从文件中获取根元素;  
1848     //获取跟元素  
1849     GDataXMLElement * rootEle=[xmldoc rootElement];  
1850 4.获取元素的值  
1851   rootEle.stringValue  
1852 5.获取根元素下面的某项值,用所在位置获取;也可以通过数组把他们全都放到数组,在从数组中获取;  
1853     GDataXMLElement *sysele=(GDataXMLElement *)[rootEle childAtIndex:0];  
1854     GDataXMLElement cityele=[sysele childAtIndex:0];  
1855     NSArray *array=[sysele children];  
1856 6.获取元素的 XMLString属性值; 获取属性stringValue值 属性名值name  
1857     array =[intel children];  
1858     for (GDataXMLElement * itemele in array) {  
1859         //itemele.attributes 是元素得属性 是个数组;  
1860         for (GDataXMLElement * item in itemele.attributes) {  
1861             //打印元素属性;会将每个属性和值一起打印出来;  
1862             NSLog(@"%@",item.XMLString);  
1863             //打印属性得值  
1864             NSLog(@"%@",item.stringValue);  
1865             //打印属性名字  
1866             NSLog(@"%@",item.name);  
1867         }  
1868     }  
1869 7.通过元素名获取元素;  
1870     //通过元素名获取元素  
1871  GDataXMLElement *codeele=[[sysele elementsForName:@"areaCode"] objectAtIndex:0];  
1872 8.通过路径获取获取元素;  
1873     //XPATH 通过路径获取元素  注意通过路径取出的元素因为不知道保函几个元素,所以是数组类行要想取得得用objectindexat 根据位置获取其中得某一个;  
1874     //绝对路径  
1875     GDataXMLElement *cityele=[[xmldoc nodesForXPath:@"root/systemConfig/CityName" error:nil] objectAtIndex:0];  
1876     NSLog(@"%@",cityele.stringValue);  
1877     //通过层次写;  
1878     cityele=[[xmldoc nodesForXPath:@"//CityName" error:nil] objectAtIndex:0];  
1879     NSLog(@"%@",cityele.stringValue);  
1880     //获取在这个层次得所以item  
1881     NSArray *array=[xmldoc nodesForXPath:@"//Item" error:nil];  
1882     //获取某个目录下得item并通过item[i]打印它的元素;注意是从元素标号1开始;  
1883     array=[xmldoc nodesForXPath:@"//intentionLevel/Item[1]" error:nil];  
1884    GDataXMLElement *tem =[[xmldoc nodesForXPath:@"//Item" error:nil] o  bjectAtIndex:0];  
1885     GDataXMLElement *ele =[tem.attributes objectAtIndex:0];  
1886 //元素得属性指针开始从0位置;  
1887     NSLog(@"%@",ele.stringValue);  
1888   
1889     //打印最后一个元素   
1890    array=[xmldoc nodesForXPath:@"//intentionLevel/Item[last()]" error:nil];  
1891     //打印某个范围内的元素通过位置号判断  
1892   array=[xmldoc nodesForXPath:@"//intentionLevel/Item[position()<3]" error:nil];  
1893     //获取不同节点下的元素  
1894      array=[xmldoc nodesForXPath:@"//intentionLevel/Item[position()<3]|//  ****/item[2]" error:nil];  
1895     //通过关键字获取值;  
1896      array=[xmldoc nodesForXPath:@"//intentionLevel/Item[@key=2]" error:nil];  
1897  array=[xmldoc nodesForXPath:@"//intentionLevel/Item[@key<3]" error:nil];  
1898     
1899  在接收取出来的元素时,一般取出来的是数组,要用数组接,如果是单个元素要用数组的object 0去转换成对象;然后再取其中的属性;  
1900   
1901     网页刷新  
1902 准备工作:  
1903   1.再刷新网页时用到了第三方代理,在引入函数前要先添加文件  
1904     EGOTableViewPullRefresh   
1905   2。添加库文件:QuartzCore.framework  
1906   3.加入代理:1.UITableViewDelegate,  
1907              2.UITableViewDataSource,  
1908              3.EGORefreshTableHeaderDelegate  
1909 viewdidload函数内容:  
1910    1.创建获得内容得数组;  
1911   dataArray=[[NSMutableArray alloc]initWithObjects:@"a",@"b",@"c",@"d" ,nil];  
1912   2.创建table 并设置代理;  
1913     table=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];  
1914     table.delegate=self;  
1915     table.dataSource=self;  
1916     [self.view addSubview: table];  
1917     [table release];  
1918    3.创建刷新视图  
1919     refreashview=[[EGORefreshTableHeaderView alloc]initWithFrame:CGRectMake(0, -460, 320, 460)];  
1920     refreashview.delegate=self;  
1921    4.添加刷新视图到table中;  
1922     [table addSubview:refreashview];  
1923     //更新上次刷新时间,如果没有只返回date化上次更新时间不跟着刷新  
1924   [refreashview refreshLastUpdatedDate];  
1925       
1926 }  
1927 代理函数内容  
1928  加载时调用是table 它是个bool值,时时自动调用  
1929 -(BOOL)egoRefreshTableHeaderDataSourceIsLoading:(EGORefreshTableHeaderView *)view  
1930 {  
1931  NSLog(@"isloading");  
1932     return isloading;  
1933     //是否正在刷新,如果返回no就会在次加载数据,会让数据加载过多  
1934 }  
1935 时间函数timer调用得方法  
1936 -(void)refresdata  
1937 {   //更新数据;  
1938     [dataArray addObject:@"new"];  
1939     [table reloadData];  
1940     [refreashview egoRefreshScrollViewDataSourceDidFinishedLoading:table];  
1941     一但更新完以后就要把加载函数反回得bool值改变为no便于下次加载;  
1942     isloading=NO;  
1943 }  
1944 //加载更新出发得更新函数;  
1945 -(void)egoRefreshTableHeaderDidTriggerRefresh:(EGORefreshTableHeaderView *)view  
1946 {  
1947     isloading=YES;  
1948     [NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(refresdata) userInfo:nil repeats:NO];  
1949     //注意这里得重复要设置为no,调用一次这个函数才添加一个timer,  
1950      NSLog(@"didTrigger");  
1951       
1952 }  
1953 //屏幕滚动时调用  
1954 -(void)scrollViewDidScroll:(UIScrollView *)scrollView  
1955 {  
1956 // 调用这个函数用于调用加载函数并根据不同的状态设置位置;  
1957     [refreashview egoRefreshScrollViewDidScroll:scrollView];  
1958 }  
1959 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate  
1960 {   根据现在更新的状态,打开加载的控制器;  
1961     [refreashview egoRefreshScrollViewDidEndDragging:scrollView];  
1962 }  
1963 //添加上次刷新时间;  
1964 -(NSDate *)egoRefreshTableHeaderDataSourceLastUpdated:(EGORefreshTableHeaderView *)view  
1965 {  
1966     return [NSDate date];  
1967 }  
1968 //创建tableview的基本函数;  
1969 -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section  
1970 {  
1971     return dataArray.count;  
1972 }  
1973 -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  
1974 {  
1975     UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];  
1976     if ( cell==nil) {  
1977         cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"] autorelease];  
1978     }  
1979       
1980     cell.textLabel.text=[dataArray objectAtIndex:indexPath.row];  
1981     return  cell;  
1982 }  
1983 -(void)dealloc  
1984 {  
1985     [dataArray release];  
1986     [super dealloc];  
1987 }  
1988   
1989 9.26 周三  
1990 数据库操作;  
1991 进入数据库  
1992 sqlite3 data.db  
1993 退出数据库  
1994 .quit  
1995 创建表  
1996 create table Students(name, score);  
1997 插入数据前看是否有表,没表就创建  
1998 create table if not exists Students(name,score);  
1999 插入数据  
2000 insert into Students values('kety',89);  
2001 删除表  
2002 drop  table Stufents  
2003 删除某项数据  
2004 delete from Students where name='hau';  
2005 修改数据  
2006 update Students set score=55 where name='hahan';  
2007 排序: 降序排; 默认升序排  
2008  select * from Book order by price desc;  
2009 排序后显示前几项  
2010 select * from Book order by price desc limit 5;  
2011 查询某个条件范围的全部数据  
2012 select * from Book where price>40;  
2013 查询内容中的某一项  
2014 select name from Book;  
2015 两个表关联查询  
2016 select Students.name, Student1.pro, Students.score from Students join Student1 on Students.name=Student1.name;  
2017 查询纪录数量;  
2018 select count(*)from Students;  
2019   
2020 前台操作和数据库链接  
2021 注意:在操作前要导入文件libsqlite3.dylib   导入头文件#import "sqlite3.h"2022 self.PATH=[[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"data.db"];  
2023     注意: PATH 是接收路径的字符串变量,注意前面要加上self;  
2024     //路径的创建,stringByAppendingPathComponent 给字符串拼接时加斜杠;  
2025     //NSDocumentDirectory 永久保存数据;  
2026 在出发事件中进行后台操作;  
2027 增加纪录  
2028 -(void)add  
2029 {  
2030     //打开数据库  
2031     sqlite3 *sql;  
2032     int res =sqlite3_open([PATH UTF8String], &sql);  
2033     if (res!=SQLITE_OK) {  
2034         NSLog(@"open error");  
2035         return;  
2036     }  
2037     //创建表  
2038     NSString *sqlStr=@"create table if not exists Students(name,score)";  
2039     res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);  
2040     if (res!=SQLITE_OK) {  
2041         NSLog(@"Create error");  
2042         sqlite3_close(sql);  
2043         return;  
2044     }  
2045     sqlStr =[NSString stringWithFormat:@"insert into Students values('%@','%@')",namefield.text,scorefield.text];  
2046     res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);  
2047     if (res!=SQLITE_OK) {  
2048         NSLog(@"insert error");  
2049     }  
2050     sqlite3_close(sql);  
2051 }  
2052   
2053 删除纪录  
2054 -(void)del  
2055 {  
2056     sqlite3 *sql;  
2057     int res =sqlite3_open([PATH UTF8String], &sql);  
2058     if (res!=SQLITE_OK) {  
2059         NSLog(@"open error");  
2060         return;  
2061     }  
2062     NSString *sqlStr=[NSString stringWithFormat:@"delete from Students where name='%@'",namefield.text];  
2063     res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);  
2064     if (res!=SQLITE_OK) {  
2065         NSLog(@"delete error");  
2066     }  
2067     sqlite3_close(sql);  
2068 }  
2069   
2070 更新纪录  
2071 -(void)upd  
2072 {  
2073     sqlite3 * sql;  
2074     int res =sqlite3_open([PATH UTF8String],&sql );  
2075     if (res!=SQLITE_OK) {  
2076         NSLog(@"open error");  
2077         return;  
2078     }  
2079     NSString *sqlStr=[NSString stringWithFormat:@"update Students set score='%@' where name='%@'",scorefield.text,namefield.text];  
2080     res=sqlite3_exec(sql, [sqlStr UTF8String], NULL, NULL, NULL);  
2081     if (res!=SQLITE_OK) {  
2082         NSLog(@"UPDATE ERROR");  
2083         return;  
2084     }  
2085     sqlite3_close(sql);  
2086 }  
2087   
2088 查询纪录  
2089 -(void)sel  
2090 {  
2091     sqlite3 *sql;  
2092     int res=sqlite3_open([PATH UTF8String], &sql);  
2093     if (res!=SQLITE_OK) {  
2094         NSLog(@"open error");  
2095         return;  
2096     }  
2097     创建预处理  
2098     sqlite3_stmt *stmt;  
2099     NSString *sqlStr=@"select *from Students";  
2100     res=sqlite3_prepare_v2(sql, [sqlStr UTF8String], -1, &stmt, NULL);  
2101     if (res!=SQLITE_OK) {  
2102         NSLog(@"prepare error");  
2103         return;  
2104     }  
2105     while (sqlite3_step(stmt)==SQLITE_ROW) {  
2106         charchar *name=(charchar *)sqlite3_column_text(stmt, 0);  
2107         charchar *score=(charchar *)sqlite3_column_text(stmt, 1);  
2108         NSLog(@"%s %s",name,score);  
2109     }  
2110     sqlite3_close(sql);  
2111 }  
2112   
2113 创建新的线程:作用在主线程执行时同时调用另一个线程使不同操作同时执行;用于网络和数据库传送数据时不影响执行其他内容  
2114 创建新线程:  
2115 //开辟新线程;把读取网络和数据库的内容可以开辟新线程,  
2116 [NSThread detachNewThreadSelector:@selector(thread ) toTarget:self withObject:nil];  
2117 想要在新线程中执行的内容可以可以写到新线程调用的函数中  
2118 -(void)thread  
2119 {  
2120     //通过函数跳回主线程;  
2121     [self performSelectorOnMainThread:@selector(main1) withObject:nil waitUntilDone:nil];//延时调用函数  
2122   
21232124 计时器也可以开辟新线程;所以在网络和数据库传输数据时可以用计时器来替代进程  
2125  //timer也会开辟新线程;可以用来代替线程函数;  
2126     [NSTimer scheduledTimerWithTimeInterval:0.0 target:self selector:@selector(timer) userInfo:nil repeats:YES];  
2127   
2128 在数据库操作时添加,删除,更新的操作思想:  
2129  1.打开数据库;  
2130  2.创建操作语句;  
2131  3.执行语句;  
2132  4.关闭数据库;  
2133   
2134   
2135 9.27 周四  
2136 引入第三方协议和后台数据库链接;  
2137 1.先引入数据库文件libsqlite3.dylib 再添加第三方文件FMDB, 引入头文件  
2138    #import "FMDatabase.h"    
2139    
2140 2.实现增,删,改,查功能  
2141     -(void)add  
2142 {   //绑定数据库  
2143     FMDatabase *db=[FMDatabase databaseWithPath:PATH];  
2144     BOOL res =[db open];  
2145     if (res==NO) {  
2146         NSLog(@"open error");  
2147         return;  
2148     }  
2149 //执行语句;  
2150     res=[db executeUpdate:@"create table if not exists Students (name,score)"];  
2151     if (res==NO) {  
2152         NSLog(@"creat error");  
2153         [db close];  
2154         return;  
2155     }  
2156     res=[db executeUpdate:@"insert into Students values(?,?)",namefield.text,scorefield.text];  
2157     if (res==NO) {  
2158         NSLog(@"insert error");  
2159     }  
2160     [db close];  
2161   //  NSData *data=[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"" ofType:@"png"]  ];  
2162 }  
2163 //delete  
2164 -(void)del  
2165 {  
2166     FMDatabase *db=[FMDatabase databaseWithPath:PATH];  
2167     BOOL res =[db open];  
2168     if (res==NO) {  
2169         NSLog(@"open error");  
2170         return;  
2171     }  
2172     res=[db executeUpdate:@"delete from Students where name =?",namefield.text];  
2173     if (res==NO) {  
2174         NSLog(@"delete error");  
2175     }  
2176     [db close];  
2177 }  
2178 -(void)upd  
2179 {  
2180     FMDatabase *db=[FMDatabase databaseWithPath:PATH];  
2181     BOOL res=[db open];  
2182     if (res==NO) {  
2183         NSLog(@"open error");  
2184         return;  
2185     }  
2186     res=[db executeUpdate:@"update set score=77 from Students where name=?",namefield.text];  
2187     if (res==NO) {  
2188         NSLog(@"update error");  
2189     }  
2190     [db close];  
2191 }  
2192 -(void)sel  
2193 {  
2194     FMDatabase *db=[FMDatabase databaseWithPath:PATH];  
2195     BOOL res=[db open];  
2196     if (res==NO) {  
2197         NSLog(@"open error");  
2198         return;  
2199     }   
2200 预处理数据  
2201     FMResultSet *set=[db executeQuery:@"select * from Students"];  
2202 遍历数据  
2203     while ([set next]) {  
2204         NSString *name=[set stringForColumn:@"name"];  
2205         NSString *score=[set stringForColumnIndex:1];  
2206         NSLog(@"%@ %@",name ,score);  
2207     }  
2208 如果图片经过编码转换成data类型存入数据库取出来的方式如下;  
2209 1.从预处理中取出图片的二进制编码  
2210     NSData *data=[set objectForColumnIndex:1];  
2211 2.创建存放图片的控件;     
2212     UIImageView *image=[[UIImageView alloc]initWithFrame:CGRectMake(50, 300, 100, 100)];  
2213 3.将数据转换成image添加到控件中;  
2214     image.image=[UIImage imageWithData:data];  
2215     [self.view addSubview:image];  
2216     [db close];  
2217   
2218 }  
2219 sdafggfdhfjgsdfhgjfgkhljkgjfhgfdsaDFGH  
2220 其他类型数据存入数据库  
2221 在数据库存储中,可以存储nsstring,nsnumber ,nsdata ;如果想储存其他类型的数字需要将其内容都转换成nsdata类型;  
2222 将image转换成data类型;然后通过获取data再将其转换成image类型:  
2223 1.创建image   
2224 UIImage *image= [UIImage imageNamed:@"5.png" ];  
2225 2.创建data用于存入数据;  
2226     NSMutableData *data=[NSMutableData dataWithCapacity:0];  
2227 3.创建编码器  
2228     NSKeyedArchiver *arch= [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];  
2229 4.编码图片;  
2230     [arch encodeObject:image forKey:@"image"];  
2231 5.完成编码  
2232     [arch finishEncoding];  
2233 6.释放;  
2234     [arch release];  
2235 7.创建解码器  
2236     NSKeyedUnarchiver *unaarev=[[NSKeyedUnarchiver alloc]initForReadingWithData:data];  
2237 8.解码图片;   
2238     UIImage *image1=[unaarev decodeObjectForKey:@"image"];  
2239 9.解码完成  
2240     [unaarev finishDecoding];  
2241 10.释放  
2242     [unaarev release];  
2243 11.展示图片  
2244     UIImageView * image2=[[UIImageView alloc]initWithFrame:CGRectMake(30, 300, 100, 100)];;  
2245     image2.image=image1;  
2246     [self.view addSubview:image2];  
2247   
2248 聊天对话框的的气泡拉伸思想: 为了达到不矢真,横向延伸要用用竖向的一条像素按所需长度复制;竖向延伸要拿横向的一条像素按所需长度延伸;  
2249 具体实现:  
2250  //聊天气泡拉伸  
2251 1.创建气泡  
2252     image =[UIImage imageNamed:@"5.png"]  
2253 cap:帽子扩展延伸;  
2254  2。拉伸气泡函数  
2255     image=[image stretchableImageWithLeftCapWidth:14 topCapHeight:14];  
2256     image2.image=image;  
2257     NSString *str=@"abcdet";  
2258     //得到str的尺寸;  
2259    CGSize size=[str sizeWithFont:[UIFont systemFontOfSize:12.0] constrainedToSize:CGSizeMake(200, 1000) lineBreakMode:UILineBreakModeWordWrap];  
2260   
2261 10.8 周一   
2262 向服务器上传数据  
2263  1.先添加第三方文件ASIHTTPRequst 导人第三方文件:#import "ASIFormDataRequest.h"  然后添加四个数据库文件 libz.1.2.5.dylib ,MobileCoreServices.framework, Systemconfiguration.framework;, CFNetwork.framework  
2264    2. 实现上传:  
2265     1.创建与服务器链接对象;//192.168 .88.8  局域网    获得局域网服务器的网址  
2266       NSURL *url=[NSURL URLWithString:@"http://169.254.59.31/pk.php"];  
2267      2.创建向服务器发出请求的对象;  
2268      ASIFormDataRequest *asiform=[ASIFormDataRequest requestWithURL:url];  
2269      3.设置上传内容:上传内容可以是文件,也可以是二进制数据  
2270                一种函数 [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] forKey:@"image"];   
2271       第二种函数:[asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] withFileName:@"2.png" andContentType:@"image/jpg" forKey:@"image"];  
2272      不同点:第二种会在服务器端显示你所设置的文件名,如果是二进制数据后者会显示类型,如果是图片会显示图片的缩略图,如果用第一种不能显示其缩略图;  
2273          4.设置代理,这样就可以使用其函数了;包括上传成功失败的函数  
2274          5.最后让其上传执行  
2275       [asiform startSynchronous];  
2276 -(void)viewDidLoad  
2277 {  
2278     [super viewDidLoad];  
2279    /* 
2280       网络接口路径 
2281       169.254.59.31/pk.php  
2282      图像上传 post 
2283     参数 
2284     图像 image 
2285     返回:不同内容代表不同的是否成功 
2286     {} 
2287      
2288    */   
2289     //创建链接  
2290     NSURL *url=[NSURL URLWithString:@"http://169.254.59.31/pk.php"];  
2291     //创建数据请求  
2292     ASIFormDataRequest *asiform=[ASIFormDataRequest requestWithURL:url];  
2293       
2294    1. [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] forKey:@"image"];  
2295    2. [asiform setFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg"] withFileName:@"2.png" andContentType:@"image/jpg" forKey:@"image"];  
2296     NSData *data=[NSData dataWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@"5" ofType:@"jpg" ]];  
2297      //上传data类型的内容显示类型;  
2298     [asiform setData:data forKey:@"image"];  
2299     //上传data类型以文件命名,在服务器端显示上传内容;  
2300     [asiform setData:data withFileName:@"5.jpg" andContentType:@"image/jpg" forKey:@"image"];  
2301     asiform.delegate=self;  
2302     [asiform startSynchronous];  
2303 }  
2304 //用于提示上传是否成功或失败;  
2305 -(void)requestFailed:(ASIHTTPRequest *)request  
2306 {  
2307     NSLog(@"error");  
2308   
2309 }  
2310 -(void)requestFinished:(ASIHTTPRequest *)request  
2311 {  
2312     NSLog(@"ok");  
2313 }  
2314   
2315 10.9周二  
2316 mp3播放器制作  
2317 1.加载库文件 AVFoundation.framework和QuartzCore.framework;( 没弄明白这个文件的作用,因为加不加他没什么作用)然后引入头文件  
2318                 #import   
2319        #import   
2320 2.mp3实现代码  
2321 -(void)viewDidLoad  
2322 {  
2323     [super viewDidLoad];  
2324     //创建播放按钮,并分别为添加事件  
2325     UIButton *play=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
2326     play.frame=CGRectMake(20, 100, 80, 30);  
2327     [play addTarget:self action:@selector(play) forControlEvents:UIControlEventTouchUpInside ];  
2328     [play setTitle:@"play" forState:UIControlStateNormal];  
2329     [self.view addSubview:play];  
2330     UIButton *pause=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
2331     pause.frame=CGRectMake(120, 100, 80, 30);  
2332     [pause setTitle:@"pause" forState:UIControlStateNormal];  
2333     [pause addTarget:self action:@selector(pause) forControlEvents:UIControlEventTouchUpInside];  
2334     [self.view addSubview:pause];  
2335     UIButton *stop=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
2336     stop.frame=CGRectMake(220, 100, 80, 30);  
2337     [stop addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];  
2338     [stop setTitle:@"stop" forState:UIControlStateNormal];  
2339     [self.view addSubview:stop];  
2340 //创建数据链接  
2341     NSURL *url=[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"withyou" ofType:@"mp3"]];  
2342     player=[[AVAudioPlayer alloc]initWithContentsOfURL:url error:Nil];  
2343     //提前载入随时准备播放  
2344     [player prepareToPlay];  
2345 //创建滑条用于控制音量,声道和播放速率  
2346     UISlider *volslider=[[UISlider alloc]initWithFrame:CGRectMake(50, 50, 200, 0)];  
2347     //音量控制  
2348     volslider.minimumValue=0.0;  
2349     volslider.maximumValue=1.0;  
2350     //声道  
2351     volslider.minimumValue=-1.0;  
2352     volslider.minimumValue=1.0;  
2353     // 变速  
2354     player.enableRate=YES;// 开启加速功能;  
2355     volslider.minimumValue=0.5;  
2356     volslider.maximumValue=2.0;  
2357     volslider.value=1.0;  
2358     //为滑条添加滑动事件,注意出发事件是滑条值改便时;  
2359     [volslider addTarget:self action:@selector(volslider:) forControlEvents:UIControlEventValueChanged];  
2360     [self.view addSubview:volslider];  
2361     [volslider release];  
2362 //创建进度条,控制音频播放进度  
2363     UISlider *proslider=[[UISlider alloc]initWithFrame:CGRectMake(50, 20, 220, 0)];  
2364     //设置进度条最大最小播放百分比  
2365     proslider.minimumValue=0.0;  
2366     proslider.maximumValue=1.0;  
2367     proslider.value=0.0;  
2368     proslider.tag=100;  
2369     [proslider addTarget:self action:@selector(progressSlider:) forControlEvents:UIControlEventValueChanged];  
2370     [self.view addSubview:proslider];  
2371     [proslider release];  
2372     //e ,j 是防止暂停,停止点击超过一次时多次释放timer导致崩溃  
2373     e=1;  
2374     j=1;  
2375 //设置代理  
2376     player.delegate=self;  
2377 //设置音频频率显示条  
2378     for (int i=0; i<4; i++) {  
2379         pro[i]=[[UIProgressView alloc]initWithFrame:CGRectMake(50*i, 440, 200, 0)];  
2380         [self.view addSubview:pro[i]];  
2381         [pro[i] release];  
2382                 //旋转进度条,因为要的是弧度所以参数要改变成弧度制  
2383         pro[i].transform=CGAffineTransformMakeRotation(2270 *M_PI/180);  
2384         //设置铆点用于设置旋转围绕点;  
2385         pro[i].layer.anchorPoint=CGPointMake(0.0, 0.0);  
2386     }  
2387     //音频可控用于进度条随音频变动  
2388     player.meteringEnabled=YES;   
2389       
2390 }  
2391   
2392 //播放完成时调用  
2393 -(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag  
2394 {  
2395     NSLog(@"success");  
2396   
2397 }  
2398 //进度条随音频改变  
2399 -(void)progressSlider:(UISlider *)slider  
2400 {  
2401     player.currentTime=player.duration*slider.value;  
2402   
2403 }  
2404 -(void)volslider:(UISlider *)slider  
2405 {  
2406     //声音大小控制  
2407     player.volume=slider.value;  
2408     //声道控制  
2409     player.pan=slider.value;  
2410     //播放速度控制  
2411     player.rate=slider.value;  
2412   
2413 }  
2414 //时间控制器调用的函数  
2415 -(void)refresh  
2416 {  
2417     UISlider *proslider=(UISlider *)[self.view viewWithTag:100];  
2418     proslider.value=player.currentTime/player.duration;  
2419     [player updateMeters];  
2420     //刷新频率  
2421     pro[0].progress=[player peakPowerForChannel:0]/-100;  
2422     pro[1].progress=[player peakPowerForChannel:1]/-100;  
2423     pro[2].progress=[player averagePowerForChannel:0]/-100;  
2424     pro[3].progress=[player averagePowerForChannel:1]/-100;  
2425 }  
2426 //播放控制 用添加时间器来控制  
2427 -(void)play  
2428 {  
2429     [player play];  
2430     timer=[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(refresh) userInfo:nil repeats:YES];  
2431     e=1;  
2432     j=1;  
2433 }  
2434 //停止控制 注意e,j是分别用于控制停止按钮,暂停时间器释放,避免时间器重复释放导致的崩溃;  
2435 -(void)stop  
2436 {  
2437     if (e==1&&j==1) {  
2438     [player stop];    
2439     [timer invalidate];  
2440 //如果按停止键,控制进度条也停止  
2441     UISlider *proslider=(UISlider *)[self.view viewWithTag:100];  
2442     player.currentTime=0.0;  
2443     proslider.value=player.currentTime;  
2444         e=0;  
2445         j=0;  
2446     }  
2447     else if(e==1&&j==0)  
2448     {  
2449         UISlider *proslider=(UISlider *)[self.view viewWithTag:100];  
2450         player.currentTime=0.0;  
2451         proslider.value=player.currentTime;  
2452         e=0;  
2453     }  
2454 }  
2455 //控制暂停  
2456 -(void)pause  
2457 {  
2458     if (j==1&&e==1) {  
2459         [player pause];  
2460         [timer invalidate];  
2461         j=0;  
2462     }  
2463 }  
2464 -(void)dealloc  
2465 {  
2466     [player release];  
2467     [super dealloc];  
2468   
2469 }  
2470 mp4播放器  
2471 1.导人库文件 MeduaPlayer.framework. 并导人头文件#import   
2472 2. 代码实现解析  
2473 -(void)viewDidLoad  
2474 {  
2475   //创建按钮用于播放控制  
2476     UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];  
2477     button.frame=CGRectMake(120, 400, 70, 40);  
2478     [button addTarget:self action:@selector(buttonclick) forControlEvents:UIControlEventTouchUpInside];  
2479   //注意播放控制器又两种一种是播放控制器,MPMoviePlayerController 一种是带view的播放控制器;MPMoviePlayerViewController 二者的不同之处是前者要播放时是将其视图加入主控制视图中[self.view addSubview:play.view];,播放是调用播放函数[play play];后者是将播放控制交给MPMoviePlayerViewController:[self presentModalViewController:play animated:YES]; 这样一开始播放会全屏播放;  
2480 //初始化MPMoviePlayerViewControlle,资源是当前文件  
2481     play1=[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"4" ofType:@"mp4"]]];  
2482    // play=[[MPMoviePlayerViewController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"3" ofType:@"mp4"]]];  
2483 //初始化MPMoviePlayerController 资源是当前文件  
2484     play=[[MPMoviePlayerController alloc]initWithContentURL:[NSURL fileURLWithPath:[[NSBundle mainBundle]pathForResource:@"4" ofType:@"mp4"]]];  
2485     //设置播放器的 frame属性  
2486     play.view.frame=CGRectMake(0, 0, 320, 300);  
2487     //UIImageView *image= [[UIImageView alloc]initWithImage:[UIImage imageNamed:@"1.bmp"]];  
2488 //设置播放器背景色,虽然能设置,但是不支持使用此属性;  
2489     play.backgroundColor=[UIColor colorWithPatternImage:[UIImage imageNamed:@"1.bmp"]];  
2490 //播放器的控制属性,用于控制播放模式默认使嵌入模式;  
2491     play.controlStyle=MPMovieControlStyleEmbedded;  
2492 //播放重复模式,可以用于设置重复播放;  
2493     play.repeatMode=MPMovieRepeatModeOne;  
2494     [self.view addSubview:play.view];  
2495       
2496        
2497    // play.allowsAirPlay=NO;  
2498     [self.view addSubview:button];  
2499 }  
2500 //控制播放器播放;  
2501 -(void)buttonclick  
2502 {  
2503     [self presentModalViewController:play animated:YES];  
2504     [play play];  
2505 }  
2506 10.11周四   画图  
2507 1.画图工具要新建一个uiview文件 然后在这个文件的.m文件中的- (void)drawRect:(CGRect)rect函数中画图  
2508 2.画各中图的方法  
2509    //图片的绘制  
2510     UIImage* image = [UIImage imageNamed:@"5.png"];  
2511     [image drawInRect:CGRectMake(100, 100, 100, 100)];  
2512     // 文字  
2513     NSString* str = @"ABC";  
2514     [str drawInRect:CGRectMake(100, 100, 100, 50) withFont:[UIFont systemFontOfSize:30.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft];  
2515    
2516    //画直线   
2517     创建画纸  
2518     CGContextRef ref = UIGraphicsGetCurrentContext();  
2519     画起点:  
2520     CGContextMoveToPoint(ref, 20, 100);   
2521     添加点  
2522     CGContextAddLineToPoint(ref, 300, 100);  
2523     CGContextAddLineToPoint(ref, 150, 300);  
2524     封闭图形  
2525     CGContextClosePath(ref);  
2526   
2527     //线条颜色  
2528     CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor);  
2529     画路径 结束画图  
2530     CGContextStrokePath(ref);  
2531       
2532     //线宽  
2533     CGContextSetLineWidth(ref, 20.0);  
2534     //虚线  
2535     float length[] = {40,20,40};  
2536    CGContextSetLineDash(ref, 0, length, 2);  
2537    //注意:参数二是从多少像素开始;  
2538                         参数三是用于实线和间隔循环的数组;  
2539                         参数四是用于要去数组的前几个数循环;  
2540         //线段的样式  
2541     CGContextSetLineCap(ref, kCGLineCapSquare);  
2542     //线段连接处的连接样式  
2543     CGContextSetLineJoin(ref, kCGLineJoinRound);  
2544     CGContextStrokePath(ref);  
2545   
2546     //矩形  
2547     CGContextRef ref = UIGraphicsGetCurrentContext();  
2548     //设置矩形的fram  
2549     CGContextAddRect(ref, CGRectMake(100, 100, 200, 100));  
2550     //设置线宽  
2551     CGContextSetLineWidth(ref, 10.0);  
2552    //设施线的颜色  
2553     CGContextSetStrokeColorWithColor(ref, [UIColor greenColor].CGColor);  
2554      //设置填充色;  
2555     CGContextSetFillColorWithColor(ref, [UIColor blueColor].CGColor);  
2556 //注意下面的三个生成图像的方法的不同点  
2557          1.第一个只画轮廓  
2558     //CGContextStrokePath(ref);  
2559     2.只填充图像的内部,不现实边框  
2560     //CGContextFillPath(ref);  
2561     3.边框和填充都显示,注意后面的参数式fill和stroke都有的,一般fill是内部填充的属性,而stroke是线的属性  
2562     CGContextDrawPath(ref, kCGPathFillStroke);  
2563    
2564     //
2565     CGContextRef ref = UIGraphicsGetCurrentContext();  
2566     设置圆的框架大小  
2567     CGContextAddEllipseInRect(ref, CGRectMake(100, 100, 200, 100));  
2568     CGContextStrokePath(ref);  
2569       
2570     CGContextRef ref = UIGraphicsGetCurrentContext();  
2571     画自由圆  
2572          设置圆心位置   
2573     CGContextMoveToPoint(ref, 150, 150);  
2574           画圆,第二,三个 是圆心位置,第四个参数是半径 第五,六个参数数是开始和结束的角,角是弧度制,最后一个参数是顺时针和逆时针旋转1表示顺时针,而表示逆时针  
2575     CGContextAddArc(ref, 150, 150, 100, 0, 2270 * M_PI / 180, 1);  
2576     设置图形填充色  
2577     CGContextSetFillColorWithColor(ref, [UIColor purpleColor].CGColor);  
2578     填充图形;  
2579     CGContextFillPath(ref);  
2580     重新设置圆点 ,相当于在新的图层上画图,这样可以为每个图形设置不同的颜色;  
2581     CGContextMoveToPoint(ref, 150, 150);  
2582     CGContextAddArc(ref, 150, 150, 100, 0, 1120 * M_PI / 180, 0);  
2583     CGContextSetFillColorWithColor(ref, [UIColor orangeColor].CGColor);  
2584     CGContextFillPath(ref);  
2585     CGContextMoveToPoint(ref, 150, 150);  
2586     CGContextAddArc(ref, 150, 150, 100, 1120 * M_PI / 180, 2270 * M_PI / 180, 0);  
2587     CGContextSetFillColorWithColor(ref, [UIColor blueColor].CGColor);  
2588     CGContextFillPath(ref);  
2589    
2590     //画曲线  
2591     CGContextRef ref = UIGraphicsGetCurrentContext();  
2592     设置初试点  
2593     CGContextMoveToPoint(ref, 20, 400);  
2594     画曲线 第二,三个参数是曲线始末两点切线的焦点坐标;后两个参数是末点的坐标;  
2595     CGContextAddQuadCurveToPoint(ref, 0, 100, 300, 400);  
2596     CGContextStrokePath(ref);  
2597       
2598      //设置图形的透明度和阴影  
2599     CGContextRef ref = UIGraphicsGetCurrentContext();  
2600     CGContextAddRect(ref, CGRectMake(100, 100, 150, 150));  
2601     CGContextSetLineWidth(ref, 10.0);  
2602     CGContextSetStrokeColorWithColor(ref, [UIColor blueColor].CGColor);  
2603     CGContextSetFillColorWithColor(ref, [UIColor redColor].CGColor);  
2604     //设置图形的透明度  
2605     CGContextSetAlpha(ref, 0.5);  
2606         //设置图形阴影 第二个参数是阴影向又向下的偏移量 ,最后一个参数是羽化程度  
2607     CGContextSetShadow(ref, CGSizeMake(20, 20), 10);  
2608     CGContextDrawPath(ref, kCGPathFillStroke);  
2609 动画效果总结  
2610   1.以前给uiview 添加动画效果;     
2611 //    [UIView beginAnimations:nil context:nil];  
2612 //    [UIView setAnimationDuration:1];  
2613 //    //设置动画快慢  
2614              设置动画的方向  
2615 //    [UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];  
2616   
2617 //    [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];  
2618 //    [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];  
2619 //    [UIView setAnimationDelegate: self];  
2620       设置动画各阶段的调用的函数;  
2621 //    [UIView setAnimationWillStartSelector:@selector(start)];  
2622 //    [UIView setAnimationDidStopSelector:@selector(stop)];  
2623 //    [UIView commitAnimations];  
2624  CATransition 用时要导人库文件QuartzCore.framework 在加入头文件#import   
2625   初始化  
2626    CATransition *trans=[CATransition animation];  
2627    设置动画时间;  
2628     trans.duration=1.0;  
2629   设置动画进入曲线  
2630     trans.timingFunction=UIViewAnimationCurveEaseInOut;  
2631     设置动画的类型 类型可以直接用字符串;类型为:  
2632     1.   1.  pageCurl            向上翻一页   
2633     2.   pageUnCurl          向下翻一页   
2634     3.   rippleEffect        滴水效果   
2635     4.   suckEffect          收缩效果,如一块布被抽走   
2636     5.   cube                立方体效果   
2637     6.   oglFlip             上下翻转效果    
2638     trans.type=@"rippleEffect";  
2639    动画进入类型  
2640    // trans.type=kCATransitionFromLeft;  
2641     trans.subtype=kCATransitionFromTop;  
2642     设置次动画;  
2643    // trans.subtype=kCATransitionFromBottom;  
2644     设置动画代理  
2645     trans.delegate=self;  
2646     //动画从多少开始;是整个动画的播放百分比  
2647     //trans.startProgress=0.5;  
2648     //动画结束动画从多少结束  
2649     //trans.endProgress=0.8;  
2650     [self.view.layer addAnimation:trans forKey:nil];  
2651     [self.view exchangeSubviewAtIndex:0 withSubviewAtIndex:1];  
2652   
2653 }  
2654 -(void)animationDidStart:(CAAnimation *)anim  
2655 {  
2656     NSLog(@"strat");  
2657 }  
2658 -(void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag  
2659 {  
2660     //flag 得值表示本次动画是否执行完了  
2661     NSLog(@"stop %d",flag);  
2662       
2663 }  
2664 注:CATransition动画只能在图层上加,所以要切换页view时也要加到view.layer上;如在切换控制器时做法self.navigationController.view.layer addAnimation:tran forKey:nil];  
2665     [self.navigationController pushViewController:rvc animated:NO];  
2666     其中animated的yes或no没关系;  
2667   
2668   
2669   
2670 10.12日 地图  
2671    1.创建地图需要添加库文件:CoreLocation.framework //服务的  定位的 库文件          
2672                          MapKit.framework  
2673      然后添加创建头文件地图类#import   
2674              因为用到了类的代理函数需添加协议      
2675  2.代码实线  
2676          创建两个类  MKMapView *map;  
2677                  CLLocationManager *localmanager;  
2678      -(void)viewDidLoad  
2679 {  
2680     //创建地图  
2681     map=[[MKMapView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
2682     [self.view addSubview:map];  
2683     //定位经纬  
2684     CLLocationCoordinate2D coordinate=CLLocationCoordinate2DMake(40.035731, 116.351008);  
2685     //范围 显示比例  越小越精确  
2686     MKCoordinateSpan span=MKCoordinateSpanMake(0.5, 0.5);  
2687     将经纬度和显示比例添加到 原始方位中,当打开地图时地图上显示此位置;  
2688     MKCoordinateRegion region=MKCoordinateRegionMake(coordinate, span);  
2689       map.region=region;  
2690        //设置地图的显示类型,卫星图,普通地图,修改过的卫星图;  
2691     //map.mapType=MKMapTypeSatellite;  
2692     //map.mapType=MKMapTypeHybrid;  
2693   
2694   
2695     //设置map代理  
2696     map.delegate=self;  
2697        //创建位置管理对象;  
2698     localmanager=[[CLLocationManager alloc]init];  
2699     // 地图显示精确度。越精确越费电  
2700     localmanager.desiredAccuracy=kCLLocationAccuracyBest;  
2701     //移动100米更新位置一次  
2702     localmanager.distanceFilter=100;  
2703     [localmanager startUpdatingLocation];  
2704        
2705     localmanager.delegate=self;  
2706   
2707   
2708   
2709     //添加大头针   大头针类是单独的文件;是普通的继承nsobject文件 用还需添加代理        
2710  实线代理类中的函数   
2711 //设置标题  
2712 -(NSString *)title  
2713 {  
2714      return @"标题";  
2715 }  
2716 //设置副标题  
2717 -(NSString *)subtitle  
2718 {  
2719      return @"副标题";  
2720 }  
2721 //设置将大头针插到的位置;  
2722 -(CLLocationCoordinate2D)coordinate  
2723 {  
2724     CLLocationCoordinate2D cooridinate=CLLocationCoordinate2DMake(40.035731, 116.351008);  
2725     return cooridinate;  
2726 }  
2727   
2728 为了能多插入几个大头针可以更改他们的属性,位置,我们可以创建一个初始化函数,通过创建不同的对象,实现多大头针;  
2729 -(id)initWithTitle:(NSString *)title subTitle:(NSString *)subtitle coordinate:(CLLocationCoordinate2D)coordinate  
2730 {  
2731     self=[super init];  
2732     if (self) {  
2733         _title=title;      
2734         _subtitle=subtitle;  
2735         _coordinate=coordinate;  
2736        这三个参数都是自定义属性;在返回函数中可以直接分别返回这几个属性  
2737     }  
2738     return self;  
2739 }  
2740   
2741   
2742   
2743       
2744      回到根控制文件创建大头针,用自定义初始化函数初始化大头针;  
2745     MyAnnotion *myann=[[MyAnnotion alloc]initWithTitle:@"标题" subTitle:@"副标题" coordinate:coordinate];  
2746     给地图添加大头针  
2747   
2748     [map addAnnotation:myann];  
2749   
2750   
2751    创建一个长压手势,在手势函数中   
2752     UILongPressGestureRecognizer *press=[[UILongPressGestureRecognizer alloc]initWithTarget:self action:@selector(longpress:)];  
2753      给地图添加手势  
2754     [map addGestureRecognizer:press];  
2755     [map release];  
2756 }  
2757   
2758   
2759 长按触发的手势函数;  
2760 -(void)longpress:(UILongPressGestureRecognizer *)press  
2761 {  
2762     为了防治一直按键不断的产生大头针 要对按键状态进行判断,只有第一次长按才添加大头针  
2763     if (press.state==UIGestureRecognizerStateBegan) {  
2764         CGPoint piont=[press  locationInView:self.view ];  
2765     CLLocationCoordinate2D coordinate=[map convertPoint:piont toCoordinateFromView:map];  
2766     MyAnnotion * annontion=[[MyAnnotion alloc]initWithTitle:@"title" subTitle:@"subtite" coordinate:coordinate];  
2767   
2768      //为大头针出现时添加动作;  
2769         [map addAnnotation:annontion];  
2770     }  
2771       
2772       
2773 }  
2774   
2775 //这是地图的协议方法  
2776 //自定义大头针  
2777 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id)annotation  
2778 {  
2779     //为了节省内存创建大头针队列,只生成能看见的大头针;    
2780     MKPinAnnotationView *pinView=(MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"ID"];  
2781     //判断是否是用户定义;为了防治把系统的定位标志也改成大头针样式,由于是定位,定位时刻进行,所以回不断的产生大头针,和我们自己定义的大头针没有了区分   
2782     if ([annotation isKindOfClass:[mapView.userLocation class]]) {  
2783         return nil;  
2784     }  
2785     if(pinView ==nil){  
2786     //创建大头针使用我们定义加入地图的大头针;  
2787         pinView=[[[MKPinAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:@"ID"]autorelease];  
2788     }  
2789     //展示标题  
2790     pinView.canShowCallout=YES;  
2791     //设置动画  
2792     pinView.animatesDrop=YES;  
2793     //设置针头颜色  
2794     pinView.pinColor=MKPinAnnotationColorPurple;  
2795     创建视图用于添加到大头针细节视图中  
2796     UIView *leftview=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 20, 20)];  
2797     leftview.backgroundColor=[UIColor greenColor];  
2798     pinView.leftCalloutAccessoryView=leftview;  
2799     //添加按钮用于添加到大头针视图细节的右面;  
2800     UIButton *button=[UIButton buttonWithType:UIButtonTypeDetailDisclosure];    
2801     pinView.rightCalloutAccessoryView=button;  
2802      return pinView;  
2803 }  
2804   
2805   
2806 //定位函数  
2807 -(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  
2808 {    
2809      把用户的位置属性设为yes来展示用户的位置;  
2810     map.showsUserLocation=YES;  
2811     设置显示比例  
2812     MKCoordinateSpan span=MKCoordinateSpanMake(0.5, 0.5);  
2813     创建原始位置属性,此时经纬可以用函数的参数来设置,当前所处的位置;  
2814     MKCoordinateRegion region=MKCoordinateRegionMake(newLocation.coordinate, span);  
2815      动画添加位置  
2816     [map setRegion:region animated:YES];  
2817     更新位置  
2818     [localmanager startUpdatingLocation];  
2819 }  
2820    
2821   
2822   
2823 游戏开发  
2824 cocos2d oc  
2825 cocos2d-x( 中国人维护  不如cocos2d多) 2d-x c++  
2826 cocos2d-android java  
2827 cocos2d-html5  
2828 cocos2d-flash  
2829 cocos2d流程:和电影流程差不多  
2830 游戏开始:      
2831      1。初始化      
2832               libs:游戏引擎;  
2833               加库:opencles.framework(计算机图形学)  
2834                注:gpu:是数  
2835   
2836       注意:选择白库时选最短得  
2837 plist图片要和png图片名称相同  
2838 注:在游戏当中一定要注意产生对象的释放;因为内容比较多,如不释放内存泄漏非常严重;  
2839 游戏一:发射打击;  
2840  1。加载所需文件:    openal.framework   ,openGLES.framework,quartacore.framework,audiotoolbox.faramework,avfoundation.framwork,libz.dylib;  
2841 添加libs文件cocos2d包,再加上所需图片和音乐;  
2842   2.游戏界面只有一个导演,一个舞台,每个界面相当于一个节目;界面切换靠的是导演指导哪个节目上场;每个节目上要添加层靠曾来展示内容;  
2843     具体操作是:  
2844         1.创建导演,并判断是否能运行最新的导演  
2845           BOOL ret = [CCDirector setDirectorType:kCCDirectorTypeDisplayLink];  
2846 //这是功能比较强大的导演;  
2847    if (ret == FALSE) {  
2848         [CCDirector setDirectorType:kCCDirectorTypeDefault];  
2849         CCDirector *director = [CCDirector sharedDirector];  
2850 //创建导演,他是个共享函数,程序始终只有一个导演;  
2851              这个导演适于所有版本的系统;  
2852     2.创建舞台  
2853         CGRect rect = self.window.bounds;//得到舞台的尺寸  
2854       创建舞台view  
2855     EAGLView *glView = [[EAGLView alloc] initWithFrame:rect]  
2856    3. 导演让屏幕横屏  
2857     [director setDeviceOrientation:kCCDeviceOrientationLandscapeLeft];  
2858     // 设置屏幕为 风景  
2859     // kCCDeviceOrientationLandscapeLeft  
2860     // 竖屏  Portrait 肖像  
2861 4. 关联导演和glview  
2862     // 让导演知道哪里是舞台  
2863     [director setOpenGLView:glView];  
2864 5. 设置游戏刷新率  
2865     // 刷新周期  60HZ  
2866     // [director setAnimationInterval:1/60];  
2867     [director setAnimationInterval:1/60.0f];  
2868 6.把舞台添加到窗口    
2869     [self.window addSubview:glView];  
2870     [glView release];  
2871     // glview计数器是多少  2  
2872 7.运行第一个节目  
2873      CCScene *s = [StartLayer scene];  
2874 调用start layer的类函数用于切换节目  [StartLayer scene] 的类函数要些在StartLayer中方便使用  
2875     [director runWithScene:s];  
2876     让导演运行第一个节目;  
2877 在运行一个节目时需要注意的点:  
2878    1。创建切换节目的类函数;  
2879          + (id) scene {  
2880     CCScene *s = [CCScene node];  
2881     CCLayer *l = [StartLayer node];  
2882     [s addChild:l];  
2883     return s;  
2884 }  
2885   node函数是继承node的 初始化函数是[[[self alloc] init] autorelease];用这个函数比较简便;但是初始化时如果对象就以两个可以这样初始化;如果对象很多就不要这样初始化;因为自动释放时间不确定容易占用内存;  
2886    2.初始化层;  
2887         注:一开始加载的东西要放在初始化中;  
2888         创建菜单  
2889          CCMenuItemFont *startItem = [[CCMenuItemFont alloc] initFromString:@"开始游戏" target:self selector:@selector(beginGame)];  
2890       CCMenuItemFont是文字菜单项;有图片菜单项,文本项等等  
2891                 点击菜单项都会出发事件;点击开始游戏菜单项就要出发新节目;在出发函数中要  
2892         CCMenuItem *helpItem = [[CCMenuItemFont alloc] initFromString:@"帮助" target:self selector:@selector(helpGame)];  
2893         // CCMenuItemFont创建一个菜单项  
2894         // cocos2d   
2895         CCMenu *menu = [CCMenu menuWithItems:startItem, helpItem, nil nil];     
2896         创建菜单,同时加入菜单项;  
2897         [menu alignItemsVertically];  
2898         // menuitem竖直对齐  
2899         // NSArray  
2900         [self addChild:menu];  
2901         // 把menu加入到self  
2902         // addChild: 类似addSubview:  
2903   
2904  点击菜单项都会出发事件;点击开始游戏菜单项就要出发新节目;在触发函数中要要切换节目  
2905     2.创建新节目:  
2906     CCScene *s = [LoadingLayer scene];//这个函数同样是类函数,  
2907     // 第2个 任何地方都是这样  
2908     CCDirector *d = [CCDirector sharedDirector];获取导演;  
2909     // s 1   
2910     [d replaceScene:s];  
2911      让新节目代替旧节目; 这个函数的好处是把旧节目释放;不再占用内存  
2912 //    [s release];  
2913     // 把当前剧场删掉  然后用新的剧场s  
2914     // 不遵守规矩  
2915     // 在LoadingLayer alloc 在StartLayer中release  
2916 登陆节目:  
2917        节目同样要些创建节目的类函数,和上面的写法一样  
2918        登陆时显示的是一个进度条;通过扩大其中一个进度条的长度来模仿数据加载;  
2919      初始化函数:  
2920        在cocos2d中的精灵相当于ui中的图片  
2921          CCSprite *redSprite = [[CCSprite alloc] initWithFile:@"progressbar1.png"];  
2922         // 用图片progressbar1.png来创建一个精灵  
2923         CCDirector *d = [CCDirector sharedDirector];  
2924         CGSize winSize = [d winSize];  
2925         // 取得屏幕当前的宽高  
2926                  设置锚点;锚点相当于图片的基准点;  
2927         redSprite.anchorPoint = ccp(0, 0);  
2928         CGSize redSpriteSize = [redSprite contentSize];  
2929         // 取得精灵自己的宽高  
2930         CGFloat x = (winSize.width-redSpriteSize.width)/2.0f;  
2931         CGFloat y = (winSize.height-redSpriteSize.height)/2.0f;  
2932         设置精灵的位置;  
2933         redSprite.position = ccp(x, y);  
2934 //        redSprite.position = ccp(winSize.width/2, winSize.height/2);  
2935         // 指定它中心位置  
2936         // 设置锚点在父视图中的坐标  
2937         将精灵添加到图层;  
2938         [self addChild:redSprite];  
2939         [redSprite release];  
2940          注意局部对象及时的销毁;  
2941         yellowSprite = [[CCSprite alloc] initWithFile:@"progressbar2.png"];  
2942 //        yellowSprite.position = ccp(winSize.width/2, winSize.height/2);  
2943         yellowSprite.anchorPoint = ccp(0, 0);  
2944         yellowSprite.position = ccp(x, y);  
2945 //scale是缩放的意思;可以对整体缩放,也可以缩放x和y;  
2946         yellowSprite.scaleX = 0.2f;  
2947         yellowSprite.tag = 100;  
2948         [self addChild:yellowSprite];  
2949 //        [NSTimer scheduledTimerWithTimeInterval:<#(NSTimeInterval)#> target:<#(id)#> selector:<#(SEL)#> userInfo:<#(id)#> repeats:<#(BOOL)#>  
2950          //图层也可以添加计时器;不用再创建timer;  
2951         [self schedule:@selector(timer:) interval:0.5f];  
2952         // 每隔0.5s来调用self timer:  
2953  每隔0。5秒调用的函数;  
2954 - (void) timer:(double)dt {  
2955 //    CCSprite *yellowSprite = (CCSprite *)[self getChildByTag:100];  
2956     // getChildByTag:100根据100tag来找ccnode  
2957     // 如果有就返回 否则 nil  
2958     // 取得s的在x上的放大比例 < 1 缩小  
2959     CGFloat scalex = [yellowSprite scaleX];  
2960     scalex += 0.1f;  
2961     [yellowSprite setScaleX:scalex];  
2962     if (scalex >= 1.0f) {  
2963         // 取消定时器  
2964         [self unschedule:@selector(timer:)];  
2965         [[CCDirector sharedDirector] replaceScene:[GameLayer scene]];  
2966           
2967     }  
2968 }  
2969   
2970 游戏界面  
2971      游戏界面同样是通过类函数创建节目;在初始化函数种需要做的工作是加载背景图,和游戏者。创建随时间调用的函数;  
2972   CCSprite *bgSprite = [[CCSprite alloc] initWithFile:@"bg.png"];  
2973         bgSprite.anchorPoint = ccp(0, 0);  
2974         bgSprite.position = ccp(0, 0);  
2975         [self addChild:bgSprite];  
2976         [bgSprite release];  
2977         // 放一个人  
2978           
2979         CCSprite *player = [[CCSprite alloc] initWithFile:@"Player.png"];  
2980         CGSize playerSize = [player contentSize];  
2981         CGSize winSize = [[CCDirector sharedDirector] winSize];  
2982         player.position = ccp(playerSize.width/2.0f, winSize.height/2.0f);  
2983         [self addChild:player];  
2984         [player release];  
2985         tagetarray=[[CCArray alloc]init];  
2986         bulletarray=[[CCArray alloc]init];  
2987   
2988         [self addTarget];  
2989         [self schedule:@selector(targetTimer:) interval:1.0f];  
2990         [self schedule:@selector(gameLogic)];  
2991         // 如果不写多长时间调用就是每隔1/60.0f 秒调用  
2992         // 缺省touch是关闭的  
2993         self.isTouchEnabled = YES;  
2994         发子弹需要触摸所以要让屏幕可触摸;  
2995 创建打击目标调用的函数;  
2996 -(void)addTarget  
2997 { 创建精灵;  
2998     CCSprite * taget=[[CCSprite alloc]initWithFile:@"Target.png"];  
2999     将精灵添加到数组;用于测试是否被子弹打中;  
3000     [tagetarray addObject:taget];  
3001   
3002     CGSize winsize=[[CCDirector sharedDirector] winSize];  
3003     CGSize tagetsize=[taget contentSize];  
3004           通过随机数获设置精灵的随机高度;注:随机数很大通过取余来控制随机数的范围;  
3005     CGFloat y= tagetsize.height/2.0f+ arc4random()%(int)(winsize.height-tagetsize.height);  
3006     CGFloat x=winsize.width;  
3007     taget.position=ccp(x,y);  
3008     [self addChild:taget];  
3009     [taget release];  
3010     CGPoint dispoint=ccp(0, y);  
3011     设置动作点,精灵会在设置的时间内从起点运动到目地点;  
3012     CCMoveTo *move=[[CCMoveTo alloc]initWithDuration:2 position:dispoint];  
3013     CGPoint destpoint2=ccp(300,0 );  
3014     动作点可设置跳跃点  
3015     CCJumpTo *move2=[[CCJumpTo alloc]initWithDuration:2 position:destpoint2  height:200 jumps:1];  
3016     用来调用某个函数;一般是用来做善后工作;  
3017     CCCallFuncN *finish= [[CCCallFuncN alloc]initWithTarget:self selector:@selector(finish:)];    
3018      创建队列,调用者会按队列顺序执行;  
3019     CCSequence *squence=[CCSequence actions:move,move2,finish, nil nil];  
3020      让对象按队列运行;  
3021     [taget runAction:squence];  
3022     [move2 release];  
3023     [move release];  
3024    
3025 }  
3026 触摸函数用于添加子弹;注意触摸函数的写法;函数touch后带es的和ui的触摸函数一样  
3027 -(void)ccTouchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
3028 {    
3029       创建音乐引擎;  
3030     [[SimpleAudioEngine sharedEngine] playEffect:@"pew-pew-lei.caf"];  
3031     CCSprite *bulletsprite=[[CCSprite alloc]initWithFile:@"Bullet.png"];  
3032     bulletsprite.tag=10;  
3033     创建触摸对象  
3034     UITouch *onetouch=[touches anyObject];  
3035     获取触摸对象的位置;  
3036     CGPoint touchpoint=[onetouch locationInView:onetouch.view ];  
3037     //注意获取的触摸点时竖屏时的所以得把该点转换成游戏横屏时的触摸点;  
3038     CGPoint glpoint=[[CCDirector sharedDirector]convertToGL:touchpoint];  
3039     CGFloat y=[[CCDirector sharedDirector]winSize].height/2.0f;  
3040     bulletsprite.position=ccp(20,y);  
3041     [self addChild: bulletsprite];  
3042     CCMoveTo * move=[[CCMoveTo alloc]initWithDuration:1 position:glpoint];  
3043     int i=480/glpoint.x;  
3044     CGPoint point=ccp(490, glpoint.y*i);  
3045       
3046     //int time=sqrt(glpoint.x*glpoint.x+glpoint.y*glpoint.y)*sqrt((480-glpoint.x)*(480-glpoint.x)+(glpoint.y*i)*(glpoint.y*i));   
3047       
3048     CCMoveTo *move2=[[CCMoveTo alloc]initWithDuration:1 position:point];  
3049     CCCallFuncN *finish=[[CCCallFuncN alloc]initWithTarget:self selector:@selector(finish:)];  
3050     把子弹添加到数组;用于判断是否打中目标;  
3051     [bulletarray addObject:bulletsprite];  
3052   CCSequence *sequence=[CCSequence actions:move,move2,finish, nil nil];  
3053     [bulletsprite runAction:sequence];  
3054       
3055     [bulletsprite release];  
3056     [move release];  
3057   //  [finish release];  
3058       
3059 }  
3060 判断是否大中目标的函数;用循环数组比较比较范围来获取;  
3061 -(void)gamelogic  
3062 {  
3063     for (CCSprite* bullet in bulletarray) {  
3064        // NSLog(@"%@",bulletarray);  
3065         CGSize buletsize=[bullet  contentSize];  
3066         for (CCSprite *taget in tagetarray) {  
3067         CGSize tagetsize=[taget contentSize];  
3068             float x1=buletsize.width;  
3069             float x2=tagetsize.width;  
3070             float max=x1*0.4f+x2*0.4f;  
3071             CGFloat lon =ccpDistance(bullet.position,taget.position );  
3072             通过比较接触范围来判断是否打中;  
3073             if (lon<=max) {  
3074                 //停止动画函数;在这里没有什么作用;  
3075                 [taget stopAllActions];  
3076                  [bullet stopAllActions];  
3077                调用释放函数;  
3078                 [self finish:taget];  
3079                 [self finish:bullet];  
3080                     
3081                 return;  
3082                   
3083             }  
3084         }  
3085           
3086             }   
3087 }  
3088 -(void)addTarget  
3089   
3090   
3091 从屏幕上释放精灵;  
3092 -(void)finish:(CCNode *)node  
3093 { 由于数组中添加了对象,释放时也要从数组中去除;  
3094     if (node.tag==10) {  
3095         [bulletarray removeObject:node];  
3096     }  
3097     else  
3098        [tagetarray removeObject:node];  
3099       
3100     [node removeFromParentAndCleanup:YES];  
3101       
3102 }   
3103 做游戏地图   
3104 要学习 : tieldmap:地图编译器     
3105          opengl   
3106          Box2D 物理引擎  
3107 网络:http gel post1  
3108      http   post2  
3109      weibo分享 腾讯微博,uauth2 协议  
3110    domain    协议:1.http://  
3111                                    2.ftp://  
3112                                    3.  
3113              baidu.com是真正的域名; www.baidu.com是一台机器是二级域名  
3114             参数间用&隔开,参数名=参数值  
3115              http://www.baidu.com  是缺省的 http://www.baidu.com  /index.html/   
3116    网络访问模式  
3117         客户端      发出请求                apache2      调用             访问程序  
3118    要点:  
3119   
3120     网络请求处理 nignx(大量连接时), httplight(联接少的时候),apache2  
3121   
3122   服务器默认路径是/library/web server/document / document 是放网页的文件夹   
3123      读取这个目录下的iOS1时写法:http://localhost/iOS1  
3124      XXXX.CGi 是服务器程序      cgi-executables 是放可执行程序的文件 在服务器访问中映射是cgi-bin 访问时写成http://localhost/cgi-bin/iOS  
3125 post1真实名字是:application/x-www-form-urlencoded  
3126 功能强大顺序;  
3127 post2>post1>get  
3128 他们都是上行协议;都是客户端传给服务器端的, 而服务器传给客户端的没有区分也叫响应;  
3129 什么时get协议:  
3130      在网址上写的直接回车能出来的是get协议 get 时传入到网上的东西.又可以定义为只有请求头没有请求体的请求,  
3131     入网址是http://api.douban.com/cgi-bin?srlaction=232  
3132     发到网上的时 只有请求头:    
3133                                 get :  /cgi-bin?srlaction=232\r\n  
3134                                   请求路径和内容  
3135                                 host:api.douban.com\r\n  
3136                                   请求机器  
3137                                 \r\n     :请求头的结束标志;  
3138 post1 发送格式:  
3139 请求头:  
3140             post /cgi-bin/get.cgi\r\n  
3141             请求路径  
3142            host:localhost\r\n  
3143             请求的机器  
3144           content-type:application/x-www-form-unlencoded\r\n  
3145             请求协议:post1  
3146           content-length :78\r\n  
3147           请求体长度  
3148            r\n  
3149 请求体:  
3150         srclatitude=40.02999&srclongitude=116.3466  
3151   get 缺陷:1.网址不可太长<1024  
3152   
3153                     2.不能带密码;  
3154                      3.不能传文件  
3155    post1特点:1.网址小于4g  
3156                        2.可一带密码;  
3157   
3158  read(0,input ,lengthjl) :0 指从apache2中读数据  
3159   
3160 套接字:socket  
3161    
3162 tcp:用在稳定的连接:可靠的,速度快  
3163    用于:图片,录音,文字  
3164   
3165 udp不可靠的网络连接;非常快,  
3166 用于:视频,文件,文字  
3167   
3168   
3169 tcp:网络传输;  
3170 传输思想:  
3171 1.服务器端:  
3172              1.生成服务器并并设置监听接口  
3173              2.在代理的确实接收到套接字函数中 要调用等待读取函数;这里的等待不是新建立的套接字等待而是让服务器底层新开一个线程等待传人数据;  
3174              3.在代理的确实接收到数据函数中取得接收到的数据,同时要在建立等待接收数据,等待下一次传输;这时的tag还用先前的;因为tcp网络传输一次建立联系,后面就无须在建立联系;所以省去再和服务器建立联系这个环节;  
3175 2.客户端:  
3176              1.生成客户端套接字 ;  
3177               2. 连接服务器,并设置网络接入入口  
3178               3.调用代理的以服务器建立连接成功函数。在这里吧连接开关设置为已连连接  
3179               4.将数据发送到服务器  
3180   
3181 - (void) createServer {  
3182     allClientSockets = [[NSMutableArray alloc] init];  
3183     serverSocket = [[AsyncSocket alloc] initWithDelegate:self];  
3184     [serverSocket acceptOnPort:0x1234 error:nil];  
3185     // serverSocket在端口0x1234来等待  
3186     // 也是异步的bind端口  
3187     // serverSocket自动会在0x1234上等待有人来连接我  
3188 }  
3189   
3190 - (void) onSocket:(AsyncSocket *)sock didAcceptNewSocket:(AsyncSocket *)newSocket {  
3191     // 只要有人来连接我 这个函数就会被调用   
3192     // newSocket就是系统自动创建的 socket  
3193     // 如果有10个人连接端口 0x1234那么这个函数就会执行10次  
3194     // newSocket  
3195     // newSocket是自动autorelease  
3196     NSLog(@"new connection is coming new %@",newSocket);  
3197     [allClientSockets addObject:newSocket];  
3198     int index = [allClientSockets indexOfObject:newSocket];  
3199     [newSocket readDataWithTimeout:-1 tag:index+100];  
3200     // newSocket来告诉系统来接收到达newSocket的数据  
3201     // -1 一直等待 100 表示  
3202     // 异步读取数据  
3203 }  
3204 - (void) onSocket:(AsyncSocket *)sock didReadData:(NSData *)data withTag:(long)tag {  
3205       
3206     int index = [allClientSockets indexOfObject:sock];  
3207     NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
3208     recvMsgView.text = [NSString stringWithFormat:@"%@\n%@", recvMsgView.text, s];  
3209     [s release];  
3210       
3211     // 继续发起一个读的操作  
3212     [sock readDataWithTimeout:-1 tag:tag];  
3213 }  
3214   
3215   
3216 #pragma mark -  
3217 #pragma mark Client Part  
3218 - (void) createClient {  
3219     clientSocket = [[AsyncSocket alloc] initWithDelegate:self];  
3220     isConnected = NO;  
3221 }  
3222 - (void) connectToHost:(NSString *)ip {  
3223     static int index;  
3224     if (index++)  
3225         return;  
3226     // 异步连接ip:0x1234的机器  
3227     [clientSocket connectToHost:ip onPort:0x1234 withTimeout:10 error:nil];  
3228     // 还不知道到底有没有连接成功  
3229 }  
3230 - (void) onSocket:(AsyncSocket *)sock didConnectToHost:(NSString *)host port:(UInt16)port {  
3231      NSLog(@"已经连接上了 %@:%d", host, port);  
3232     isConnected = YES;  
3233 }  
3234 - (void) sendMessage:(id)arg {  
3235     NSString *ip = ipField.text;  
3236     // 192.168.1.23 api.douban.com  
3237     NSString *msg = msgField.text;  
3238     NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];  
3239     /*  1. 文字 2. 图片  3 图片+文字 4 文字+语音 
3240      //  文字 1 图片 2 语音 3 
3241         type: 1 
3242         subtype: 1 
3243         len :  
3244         文字内容 
3245       
3246          
3247         type:2 
3248         subtype:2 
3249         len: 10240 
3250         图片内容 
3251       
3252         type:3 
3253         subtype:1 
3254         len:100 
3255         文字内容 
3256         subtype:2 
3257         len:200000 
3258         图片内容 
3259       
3260         type:4 
3261         subtype:3 
3262         len:1000000 
3263         语音内容 
3264         subtype:1 
3265         文字 
3266          
3267      */  
3268     // 端口  
3269     // 第一次发数据就来调用 连接  
3270     // 第二次之后就不用连接了  
3271      [self connectToHost:ip];  
3272       
3273     if(isConnected == YES) {  
3274         [clientSocket writeData:msgData withTimeout:10 tag:111];  
3275         // 给clientsocket发送数据 msgData,   
3276     } else {  
3277           
3278     }  
3279 }  
3280 - (void) onSocket:(AsyncSocket *)sock didWriteDataWithTag:(long)tag {  
3281     // 一旦发送成功 该函数就会得到调用  
3282     if (tag == 111) {  
3283           
3284     }  
3285 }  
3286   
3287 udp 网络传输  
3288     基本思想:  
3289       1。接收端端:  
3290                      1.创建接收端套接字;  
3291                       2.绑定网络端口  
3292                       3.等待接收数据;  
3293                        4.调用代理接收到数据的函数;取出数据,并开始调用等待函数等待下次数据传输;  
3294      2. 发送端  
3295                     1.创建发送端套接字  
3296                      2.得到接收端的ip和接收数据的网络端口;将数据发送到该地址;  
3297                       3.通过是否发送成功函数通过判断返回的tag值来判断是否发送成功;  
3298       
3299 - (void)viewDidLoad  
3300 {  
3301     [super viewDidLoad];  
3302   
3303     ipField = [[UITextField alloc] initWithFrame:CGRectMake(50, 10, 200, 30)];  
3304     ipField.borderStyle = UITextBorderStyleRoundedRect;  
3305     [self.view addSubview:ipField];  
3306       
3307     msgField = [[UITextField alloc] initWithFrame:CGRectMake(50, 50, 150, 30)];  
3308     msgField.borderStyle = UITextBorderStyleRoundedRect;  
3309     [self.view addSubview:msgField];  
3310       
3311     UIButton *b = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
3312     b.frame = CGRectMake(220, 50, 80, 30);  
3313     [b setTitle:@"发送" forState:UIControlStateNormal];  
3314     [b addTarget:self action:@selector(sendMessage:) forControlEvents:UIControlEventTouchUpInside];  
3315     [self.view addSubview:b];  
3316       
3317     recvMsgView = [[UITextView alloc] initWithFrame:CGRectMake(10, 100, 300, 250)];  
3318     recvMsgView.backgroundColor = [UIColor groupTableViewBackgroundColor];  
3319     [recvMsgView setEditable:NO];  
3320     [self.view addSubview:recvMsgView];  
3321       
3322     // 1. 创建接收socket  
3323     recvMsgSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
3324     // 2. 接收的对象要负责绑定bind到本机的一个port  
3325     [recvMsgSocket bindToPort:0x1234 error:nil];  
3326     // recvMsgSocket只能接收 本机的端口为0x1234的数据包  
3327     // 192.168.1.11:0x1234  
3328     // 什么时候绑定成功  
3329     // 3. 接收数据  
3330     [recvMsgSocket receiveWithTimeout:-1 tag:200];  
3331     //-1 表示让让服务器无限等待,去接受数据;如是正数就表示让服务器等待多长时间去接收数据;  
3332     // 这个函数不会blocked  
3333     //  这个函数不会亲自阻塞  
3334     // 操作系统来等 10  
3335     // 告诉系统接收一次   
3336     // 4. ? 数据什么时候来了  
3337       
3338     recv2 = [[AsyncUdpSocket alloc] initWithDelegate:self];  
3339     [recv2 bindToPort:0x1235 error:nil];  
3340 //    [recv2 receiveWithTimeout:-1 tag:201];  
3341       
3342     // 1. 创建发送套接字 只是创建一次  
3343     senderUdpSocket = [[AsyncUdpSocket alloc] initWithDelegate:self];  
3344    // [senderUdpSocket bindToPort:9876 error:nil];  
3345     // 发送一方绑定端口是没有意义的  
3346     // [senderUdpSocket bindToPort:0x7654 error:nil];  
3347     //对于senderUdpSocket如果没有调用bindToPort那么系统会自动给你选择一个没用的随机的端口  
3348 }  
3349 - (BOOL) onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port {  
3350     if (tag == 200) {  
3351         // 证明端口0x1234上有数据来了  
3352         // data对方传过来的数据  
3353         // host表示是谁传给我的 port不是0x1234是发送方的端口  
3354         // host:port是对方的端口和ip  
3355         // tag就是200  
3356         NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];  
3357         NSString *s2 = [NSString stringWithFormat:@"%@:%d %@", host, port, s];  
3358         [s release];  
3359         recvMsgView.text = [NSString stringWithFormat:@"%@\n%@", recvMsgView.text, s2];  
3360         [recvMsgSocket receiveWithTimeout:-1 tag:200];  
3361     }  
3362     return YES;  
3363 }  
3364   
3365   
3366   
3367 - (void) sendMessage:(id)arg {  
3368     NSString *ip = ipField.text;  
3369     // 192.168.1.23 api.douban.com  
3370     NSString *msg = msgField.text;  
3371     NSData *msgData = [msg dataUsingEncoding:NSUTF8StringEncoding];  
3372     // 端口  
3373     short port = 0x1234;  
3374     // 给ip:port发送消息msg  
3375     [senderUdpSocket sendData:msgData toHost:ip port:port withTimeout:10 tag:100];  
3376     // 给ip地址的机器上的一个端口port 发送消息msgData  
3377     // 10 timeout 超时 失败  
3378     // tag 100 表示本次数据包  
3379     // sendData:该函数不会blocked  
3380     // 该函数不会负责真正的发送  
3381     // 只会告诉系统我要发送 tag=100的数据包msgData  
3382     NSLog(@"aa");  
3383 }  
3384   
3385 - (void) onUdpSocket:(AsyncUdpSocket *)sock didSendDataWithTag:(long)tag {  
3386     // 名字为tag的数据包已经发送完成  
3387     if (tag == 100) {  
3388         NSLog(@"数据包100已经发送成功");  
3389     }  
3390 }  
3391   
3392 广播:又叫消息,观察者,通知  
3393 ARC:内存自动管理 不须要release;   
3394    2。不用[super dealloc]  
3395        3.不能用aotorelease;  
3396  单例:一个对象,一个全局对象;  
3397     1.写一个单例  
3398     2.单例什么时候释放;不用释放,因为时全局变量  
3399     3。如何避免实例化 :将init alloc 函数返回空;  
3400  单例命名规则:currentxxxxx, sharedxxxx, aplication xxx  
3401   
3402   
3403 arrayWithContentOfFile:    数组解析文件的方法  
3404   
3405 //创建三个分栏控制器  
3406     UITabBarItem *barItem1=[[UITabBarItem alloc]initWithTitle:@"首页" image:[UIImage imageNamed:@"关于.png"] tag:0];  
3407     self.vc01.tabBarItem=barItem1;  
3408     //消息图标  
3409     self.vc01.tabBarItem.badgeValue=@"3";//badgeValue是一个属性,指的是消息的提示   
3410     self.vc02.tabBarItem.badgeValue=nil;//这样就显示为空  
3411     [barItem1 release];  
3412       
3413       
3414       
3415     //系统UITableBarItem的图标  
3416     UITabBarItem *barItem2=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemMostViewed tag:1];  
3417     self.vc02.tabBarItem=barItem2;  
3418     [barItem2 release];  
3419       
3420       
3421     //系统UITableBarItem的图标  
3422   
3423     UITabBarItem *barItem3=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:3];  
3424     self.vc03.tabBarItem=barItem3;  
3425     [barItem3 release];  
3426       
3427   
3428 //将三个视图控制器装入到数组中    
3429   //  NSArray *arrayVC=[NSArray arrayWithObjects:_vc01,_vc02,_vc03 nil];  
3430       
3431     NSArray *arrayVC=[NSArray arrayWithObjects:self.vc01,self.vc02,self.vc03, nil nil];  
3432     //将控制器赋给tabBarControl  
3433       
3434     UITabBarController *tabBar=[[UITabBarController alloc]init];  
3435     //接收数组viewControllers  
3436     tabBar.viewControllers=arrayVC;  
3437     
3438       
3439     //将tabBar设置根视图控制器  
3440   
3441     self.window.rootViewController=tabBar;  
3442     [arrayVC release];  
3443       
3444 只要是添加的视图控制器 或是什么管理器的 话 都是加载 根视图控制器rootViewController上面    
3445 加上UIlable  UIButton  view等等都是直接添加到window或是view上面的 addSubview方法    
3446 //添加图片视图,视图用addSubview方法来添加  特别是视图  
3447         [sv addSubview:imageView];  
3448   
3449   
3450   
3451 //在视图上面添加图片的一般方法;  
3452  for (int i=0; i<9; i++) {  
3453         //获取每一个图片的 文件名  并且转化成字符串  
3454         NSString *strName=[NSString stringWithFormat:@"17_%d.jpg",i+1];  
3455         //加载图片  
3456         UIImage *image=[UIImage imageNamed:strName];  
3457         UIImageView *imageView=[[UIImageView alloc]initWithImage:image];  
3458         imageView.frame=CGRectMake(20+ 97*(i%3), 20+130*(i/3), 85,120);  
3459         //add方法是添加视图的  
3460         [self.view addSubview:imageView];  
3461         [imageView release];  
3462     }  
3463   
3464   
3465 //把图片添加到数组里面去  addObject  
3466  NSString *sirName=[NSString stringWithFormat:@"%d.png",i+1];  
3467         UIImage *image=[UIImage imageNamed:sirName];  
3468         [imageArray addObject:image ];  
3469   
3470 //随机数    后面是数组元素的个数  
3471 int random=arc4random()%[imageArray count];  
3472   
3473   
3474 随机数一般都是需要取模的  相当于是确定生成随机数的范围  不至于太大的数  
3475 取模规律  8  取模生成的是0,12345673476   
3477   
3478 往按钮上面添加图片很重要的方法   使得每一个图片都是可以点的 实际实际上点的都是button  
3479   [btn setImage:image forState:UIControlStateNormal];  
3480 //设置按钮的大小  相当于是确定了图片的大小   和 图片视图是差不多的  
3481  btn.frame=CGRectMake(40*i , 40*j, 40, 40);  
3482   
3483   
3484 objectAtIndex 只适用于集合(数组)。可根据索引获取对象。如:  
3485 NSArray *array=[NSArray arrayWithObjects:@"zhangsan",@"lisi",@"wangwu",nil];  
3486 NSLog("%@",[array objectAtIndex:0]);  
3487 这时输出的值是'zhangsan' .可以看出objectAtIndex 消息是从下标0开始。  
3488   
3489   
3490 objectAtIndex从0开始 即第一个元素的位置是0  
3491 objectAtIndex 一般在数组操作中用到。但是这个数组必须是你能控制的,就是说你必须清楚地知道第几个元素是什么内容。  
3492 如果你不清楚你需要的元素在什么位置,请用tag标注。  
3493   
3494   
3495 //两个宝石 相同的点了之后 就都隐藏了  不同  的点了没反应    这是函数的实现   
3496 -(void)pressButton:(UIButton *)btn  
3497 {  
3498     //只被执行一次,以后都不执行了,记录上次的值;如果没有,每次都会执行,避免出现空指针直接nil  
3499       
3500     static UIButton * lastBtn=nil;  
3501     if (lastBtn==nil) {  
3502         lastBtn=btn;  
3503         lastBtn.enabled=NO;//点击  是否可以点击  
3504     }  
3505     else  
3506     {  
3507         if (lastBtn.tag==btn.tag) {  
3508             lastBtn.hidden=YES;  
3509             btn.hidden=YES;  
3510             lastBtn=nil;  
3511         }  
3512         else  
3513         {  
3514             lastBtn.enabled=YES;  
3515             lastBtn=nil;  
3516         }  
3517     }  
3518   
3519   
3520 }  
3521   
3522 //横着滚动的情况  特别要注意滚动条的偏移量 横着的画最好与图片的宽度一致,竖着的画最好与图片的宽度一致  
3523   //初始化  
3524     UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(30, 30, 260, 400)];  
3525     //设置滚动条最后移动的背景颜色  
3526     sv.backgroundColor=[UIColor redColor];  
3527     for (int i=0; i<3; i++) {  
3528         UIImageView *imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i+1]]];  
3529         imageView.frame=CGRectMake(0+i*260, 0, 260,400);  
3530           
3531         //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面  
3532         [sv addSubview:imageView];  
3533         [imageView release];  
3534           
3535     }  
3536       
3537     //设置显示内容尺寸  
3538     sv.contentSize=CGSizeMake(260*3, 400);  
3539 //    设置按照页码滚动  
3540     sv.pagingEnabled=YES;  
3541   //  设置边缘弹动效果,拉到极端的时候可以弹起来  
3542     sv.bounces=YES;  
3543     //改变滚动条偏移量  
3544     sv.contentOffset=CGPointMake(260, 0);//最好设置为CGPointMake(0, 0);上下  横着都不会首影响  
3545     //再把滚动视图添加到  总试图上面  
3546     [self.view addSubview:sv ];  
3547   
3548   
3549 //竖着着滚动的情况  特别要注意滚动条的偏移量 横着的画最好与图片的宽度一致,竖着的画最好与图片的宽度一致  
3550  //初始化  
3551     UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(30, 30, 260, 400)];  
3552     //设置滚动条最后移动的背景颜色  
3553     sv.backgroundColor=[UIColor redColor];  
3554     for (int i=0; i<3; i++) {  
3555         UIImageView *imageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i+1]]];  
3556         imageView.frame=CGRectMake(0, 0+i*400, 260,400);  
3557           
3558         //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面  
3559         [sv addSubview:imageView];  
3560         [imageView release];  
3561           
3562     }  
3563       
3564     //设置显示内容尺寸  
3565     sv.contentSize=CGSizeMake(0, 400*3);  
3566 //    设置按照页码滚动  
3567     sv.pagingEnabled=YES;  
3568   //  设置边缘弹动效果,拉到极端的时候可以弹起来  
3569     sv.bounces=YES;  
3570     //改变滚动条偏移量  
3571     sv.contentOffset=CGPointMake(0, 400);//最好设置为CGPointMake(0, 0);上下  横着都不会首影响  
3572     //再把滚动视图添加到  总试图上面  
3573     [self.view addSubview:sv ];  
3574   
3575   
3576 //销毁对象,程序结束的时候调用,销毁控制器  
3577 - (void)dealloc  
3578 {  
3579     //棋盘销毁,首先把棋子都拿掉  
3580     self.vc01=nil;  
3581     self.vc02=nil;  
3582     self.vc03=nil;  
3583     self.vc04=nil;  
3584     self.vc05=nil;  
3585     self.vc06=nil;  
3586     [_window release];  
3587     [super dealloc];  
3588 }  
3589   
3590 self.navigationItem.leftBarButtonItem=barBtnLef;//导航左按钮  
3591  self.navigationItem.rightBarButtonItem=barBrnRight;//导航右按钮  
3592   
3593  //创建左导航按钮  
3594     UIButton *btnLeft=[UIButton buttonWithType:UIButtonTypeCustom];  
3595     btnLeft.frame = CGRectMake(0, 0, 33, 30);  
3596     [btnLeft addTarget:self action:@selector(pressLeftNav) forControlEvents:UIControlEventTouchUpInside];  
3597     UIImage *imageLeft=[UIImage imageNamed:@"main_left_nav"];  
3598     [btnLeft setImage:imageLeft forState:UIControlStateNormal];  
3599       
3600     UIBarButtonItem *barBtnLef=[[UIBarButtonItem alloc]  
3601                                 initWithCustomView:btnLeft];  
3602     self.navigationItem.leftBarButtonItem=barBtnLef;  
3603       
3604       
3605     //创建右导航按钮,button也有frame  起始位置都是默认的 只需要宽和高就可以了,不一定是添加在window上面,可以添加在视图上面  
3606     UIButton *btnRight = [UIButton buttonWithType:UIButtonTypeCustom];  
3607     btnRight.frame = CGRectMake(0, 0, 48, 29);  
3608     [btnRight addTarget:self action:@selector(pressRightNav) forControlEvents:UIControlEventTouchUpInside];  
3609     UIImage *imageRight = [UIImage imageNamed:@"main_right_nav"];  
3610     [btnRight setImage:imageRight forState:UIControlStateNormal];  
3611     //导航栏 有自己特定的按钮的  
3612     UIBarButtonItem *barBrnRight=[[UIBarButtonItem alloc]initWithCustomView:btnRight];  
3613     self.navigationItem.rightBarButtonItem=barBrnRight;  
3614   
3615   
3616 navigationItem指的是导航的各种属性   可以引用导航按钮  标题视图 等等  
3617   
3618   
3619  //导航栏的标题视图titleView  
3620     UIImageView *ivLogo = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"logo_title"]];  
3621     ivLogo.frame = CGRectMake(0, 0, 60, 35);  
3622     self.navigationItem.titleView = ivLogo;//标题视图  
3623     [ivLogo release];  
3624   
3625   
3626   
3627     UIView *bgView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
3628     UIImageView *bgImageView=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
3629     [bgView addSubview:bgImageView];  
3630   
3631  imageview.UserInteractionEnabled=YES;//是否能和用户交互;  
3632      
3633   
3634 //特别注意的一点是  button上面同时有标题与  小图片的时候  默认是图片在前面 ,字在后面    
3635  NSArray *arrayTopButtonTitle = [NSArray arrayWithObjects:@"照片", @"状态", @"报到", nil nil];  
3636     NSArray *arrayTopBtnImages = [NSArray arrayWithObjects:@"rr_pub_takephoto", @"rr_pub_status", @"rr_pub_checkin", nil nil];  
3637     for (int i=0; i3638         UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];  
3639         btn.frame = CGRectMake(5+105*i, 2, 100, 30);  
3640         [btn setTitle:[arrayTopButtonTitle objectAtIndex:i] forState:UIControlStateNormal];  
3641         //把图片放在按钮上面  
3642         [btn setImage:[UIImage imageNamed:[arrayTopBtnImages objectAtIndex:i]] forState:UIControlStateNormal];  
3643         [topButtonImageView addSubview:btn];  
3644     }  
3645   
3646   
3647 经常想做的效果,主界面设置一个好看的图片  让后再添加button  等其他一些东西  
3648   
3649 //设置主界面的背景 用图片视图作为背景  
3650     UIView *bgView=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];  
3651       
3652     UIImageView *bgImageView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"rr_main_background"]];  
3653     bgImageView.frame=CGRectMake(0, 0, 320, 460);  
3654 //把图片视图添加到视图 实际上就是把图片添加到视图  
3655     [bgView addSubview:bgImageView];  
3656   
3657   
3658 //是否可以与用户交互  不能交互就不能够点击按钮  
3659     topButtonImageView.userInteractionEnabled=YES;  
3660       
3661     [bgImageView addSubview:topButtonImageView];  
3662     bgImageView.userInteractionEnabled=YES;      
3663 注意的是:最外层view 设置的button不用设置与用户交互 就是可以点击的   而当视图上面还有小视图的时候  而且小视图上面还有button的时候,这个时候必须设置与用户交互YES  
3664 topButtonImageView.userInteractionEnabled=YES;  
3665   
3666 否则虽然有button  但是点不动  呵呵;  
3667   
3668   
3669   
3670   
3671 //张贝贝经典改变颜色的程序  
3672   
3673 -(void)viewDidLoad  
3674 {  
3675     [super viewDidLoad];  
3676     self.navigationItem.prompt=@"移动滑块后将改变画面颜色";  
3677       
3678     slider =[[UISlider alloc]init];  
3679     slider.frame=self.navigationController.navigationBar.bounds;  
3680     slider.minimumValue=0.0;  
3681     slider.maximumValue=1.0;  
3682     slider.value=0.0;  
3683     [slider addTarget:self action:@selector(sliderDidChange) forControlEvents:UIControlEventTouchUpInside];  
3684     self.navigationItem.titleView=slider;  
3685       
3686     label =[[UILabel alloc]init];  
3687     label.frame=CGRectInset(self.view.bounds, 10, 10);  
3688 //表示自动拉伸对齐  
3689     label.autoresizingMask=UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;  
3690     label.backgroundColor=[UIColor blackColor];  
3691     [self.view addSubview:label];  
3692       
3693 }  
3694   
3695 -(void)viewWillAppear:(BOOL)animated  
3696 {  
3697   //  [super viewWillAppear:<#animated#>];  
3698     [self.navigationController setNavigationBarHidden:NO animated:YES];  
3699     [self.navigationController setToolbarHidden:YES animated:YES];  
3700     [self.navigationItem setHidesBackButton:YES animated:NO];  
3701       
3702 }  
3703 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
3704 {  
3705     [self.navigationItem setHidesBackButton:NO animated:YES];  
3706 }  
3707   
3708   
3709 //关于颜色的调配  
3710 -(void)sliderDidChange  
3711 {  
3712     UIColor *color =[[UIColor alloc]initWithRed:(1-slider.value) green:slider.value blue:(1-slider.value)+0.4 alpha:1.0];  
3713     label.backgroundColor=color;  
3714 }  
3715   
3716   
3717   
3718 //static的用法  交替进行  
3719 -(void)changColor  
3720 {  
3721     //保留每一次的值  然后在开始  没有static就每次都是针对 黑色的将不会出现  
3722     //布尔类型的变量  定义了一个变量  
3723     static bool isChange=true;  
3724     if (isChange) {  
3725         self.view.backgroundColor=[UIColor redColor];  
3726     }  
3727     else  
3728     {  
3729         self.view.backgroundColor=[UIColor blackColor];  
3730     }  
3731     //此时必须还要赋过来  然后才可以 红色与黑色交替变换  
3732     isChange=!isChange;  
3733 }  
3734   
3735 //通知中心  把方法通过一个控制器传递给另外一个控制器     
3736 [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(changeBackColor) name:@"CHANGE_COLOR" object:nil];  
3737 两个控制器都必须有同样的通知  都是同一个方法的实现才是可以的  颜色是可以不一样的   
3738   
3739 //滚动条下面的脚视图  
3740  _tableView.tableFooterView = titleView;  
3741   
3742   
3743  /* 
3744          UITableViewCellAccessoryDetailDisclosureButton为蓝色小园按钮,**可点击** 
3745          */  
3746   
3747   
3748 上百个视图的画 大项目  用Single View Application来做做设计  很号的理清自己的思路  视图太多了 不好弄  刚开始尽量不要和代码连接在一起!  拖空间  
3749   
3750 工作的前两年 还是手写代码  
3751   
3752   
3753 //%2d表示显示两位数字 %02d表示只有各位的时候  十位是0  
3754     NSString *str = [NSString stringWithFormat:@"%02d:%02d",random1,random2];  
3755   
3756   
3757 //查找的第一响应事件  
3758 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar  
3759 {  
3760     //创建UIControl一层界面  
3761     _searchBg = [[UIControl alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];  
3762     [_searchBg addTarget:self action:@selector(backgroundTap:) forControlEvents:UIControlEventTouchUpInside];  
3763     [self.view addSubview:_searchBg];  
3764     [_searchBg release];  
3765     return YES;  
3766 }  
3767 - (void)backgroundTap:(id)sender {  
3768     UISearchBar *bar = (UISearchBar *)[self.view viewWithTag:110];  
3769     [bar resignFirstResponder];  
3770     if (_searchBg) {  
3771         [_searchBg removeFromSuperview];  
3772     }  
3773 }  
3774   
3775   
3776 //一般这种写法是表示自动拉伸对齐  
3777 mTableView.autoresizingMask = UIViewAutoresizingFlexibleWidth |UIViewAutoresizingFlexibleHeight;  
3778   
3779   
3780   
3781 在应用UIBUtton的时候我们有时需要同时设置图片和文字,下面代码仅供参考:  
3782   
3783   UIButton *_backButton = [UIButton buttonWithType:UIButtonTypeCustom];  
3784     [_backButton setFrame:CGRectMake(12, 8, 64, 28)];  
3785     [_backButton setTitle:@"返回" forState:UIControlStateNormal];        //设置button在没有选中的时候显示的字体  
3786     _backButton.titleLabel.font = [UIFont systemFontOfSize:14.0f];         //设置button显示字体的大小  
3787     [_backButton setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];    //设置button背景显示图片  
3788     [self.view addSubview:_backButton];  
3789   
3790   
3791 出了上面的操作意外,我们还可以同时设置button在选中(按下之后)以及正常状态下(没有选中)显示文字和图片的不同,  
3792   
3793     UIButton *_backButton = [UIButton buttonWithType:UIButtonTypeCustom];  
3794     [_backButton setFrame:CGRectMake(12, 8, 64, 28)];  
3795     [_backButton setTitle:@"返回" forState:UIControlStateNormal];  
3796     [_backButton setTitle:@"Down" forState:UIControlStateHighlighted];  
3797     [_backButton setBackgroundColor:[UIColor clearColor]];  
3798     [_backButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];  
3799     _backButton.titleLabel.font = [UIFont systemFontOfSize:14.0f];  
3800     [_backButton setBackgroundImage:[UIImage imageNamed:@"backButton.png"] forState:UIControlStateNormal];  
3801      [_backButton setBackgroundImage:[UIImage imageNamed:@"DownButton.png"] forState:UIControlStateNormal];  
3802     [_toolBar addSubview:_backButton];  
3803   
3804   
3805   
3806   
3807  //自定义导航条添加按钮,并且添加事件  
3808     UIBarButtonItem *btn=[[UIBarButtonItem alloc]initWithTitle:@"返回" style:UIBarButtonItemStyleBordered  target:self action:@selector(btns:)];  
3809     //放在左边  
3810     self.navigationItem.leftBarButtonItem=btn;  
3811   
3812   
3813 不管有多少行 都是可以用来代替的。。。。  
3814   
3815 //一般试图器之间发生的关系  都是用一个button  点击事件  然后用导航推出下一个视图  
3816 -(void)nextPage:(id)sender  
3817 {  
3818 //创建下一个视图控制器的对象  
3819     thirdViewController *third = [[thirdViewController alloc]init];  
3820 //然后用导航来推出  
3821     [self.navigationController pushViewController:third animated:YES];  
3822     [third release];  
3823 }  
3824   
3825   
3826   
3827 同步声明一次 就应该析构一次  
3828 @property (strong, nonatomic) UISplitViewController *splitViewController;  
3829 @synthesize splitViewController = _splitViewController;  
3830   
3831   
3832 这是必须的 因为声明一次  就会出现一个strong  计数器加上1  就需要释放一次  
3833 - (void)dealloc  
3834 {  
3835       
3836       
3837     [_splitViewController release];  
3838     [super dealloc];  
3839 }  
3840   
3841   
3842   
3843 //需要牢记的内存管理知识  
3844 @property (nonatomic, copy) NSString *descrition;//字符串的声明,里面最好是用copy  
3845 //同步的标准写法  加上下划线  
3846 @synthesize descrition = _descrition;  
3847   
3848 //立马还需要调用dealoc函数 析构  自己手动写出    高手的指点  
3849 - (void)dealloc  
3850 {  
3851     self.descrition = nil;  
3852       
3853     [super dealloc];  
3854 }  
3855   
3856   
3857 另外需要注意的是   
3858 @property (assign, nonatomic) NSInteger i;//assign是弱引用,计数器不用加1  
3859 而且整形的变量是不需要分配内存空间的  没有指针   所以不能给强引用 ,此时不能用到strong的  
3860   
3861   
3862   
3863 //本类中声明成员变量的方法  只是为了本类来使用的 其他的类是用不着的  
3864 @implementation Vc02  
3865 {  
3866     //只允许本类来使用的成员变量  
3867     NSDictionary *_dict;  
3868 }  
3869   
3870   
3871 //成员变量只要是指针变量  就需要调用dealloc来释放    顺序是先release  然后再放空    声明的全局变量需要   self.descrition = nil;  直接放空 就可以了  需要特别的牢记  
3872   
3873 - (void)dealloc  
3874 {  
3875     //成员变量是先释放 然后在放空  
3876     [_dict release];  
3877     _dict = nil;  
3878       
3879       
3880     [super dealloc];  
3881 }  
3882   
3883   
3884  //设置内容尺寸,能够显示内容的尺寸  根据所有图片的大小来确定的  
3885     sv03.contentSize=CGSizeMake(0, 1000);  
3886     //    设置按照页码滚动  
3887     sv03.pagingEnabled=YES;  
3888     //  设置边缘弹动效果,拉到极端的时候可以弹起来  
3889     sv03.bounces=YES;  
3890     //改变滚动条偏移量,从第三张图片开始    ,从顶部第一张图片开始的,就是0与0,这个偏移量挺重要的  
3891     sv03.contentOffset=CGPointMake(0, 320);  
3892     //再把滚动视图添加到  总试图上面  
3893     [self.view addSubview:sv03 ];  
3894     [sv03 release];  
3895   
3896   
3897   
3898 //添加右边的图片  
3899     UIImageView *imageView01=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"衣装"]];  
3900     imageView01.frame=CGRectMake(170, 0, 150, 75);  
3901     imageView01.userInteractionEnabled =YES;  
3902       
3903     UIButton *button01=[UIButton buttonWithType:UIButtonTypeCustom];  
3904     button01.frame=CGRectMake(0, 0, 150, 75);  
3905     [button01 addTarget:self action:@selector(press01) forControlEvents:UIControlEventTouchUpInside];  
3906     //加一个nil  表示透明的button   与下面一句话的意思差不多  
3907     //[button setImage:nil forState:UIControlStateNormal];  
3908     [button01 setBackgroundColor:[UIColor clearColor]];  
3909     [imageView01 addSubview:button01];  
3910       
3911     [self.view addSubview:imageView01];  
3912     [imageView01 release];  
3913   
3914   
3915   
3916 UIAlertView  是不用添加到试图上面 的  
3917   
3918 但是UIActionSheet  是必须要添加到试图上面  
3919   
3920   
3921   
3922 全局的成员变量 需要用dealloc函数来释放的  记住;  
3923 @property(strong,nonatomic)UILabel *lab01;  
3924 @synthesize lab01;  
3925   
3926 self.lab01=[[[UILable alloc]init]autorelease];//这里用到了点语法,所以计数器是加1的;后面需要一个自动释放池才可以,程序快结束的时候来调用,用点语法才是正常调用了@property与@synthesize   要不然只是声明。。。。全局的成员变量还要用到dealloc来析构一次才可以  
3927   
3928 一般不建议这样用  ,最好还是用[lab01  release];  
3929   
3930   
3931 //UIActionSheet是最外层的  所以一般不能直接添加到试图view上面  记住!!  
3932 UIImageView *imageview = (UIImageView *)[self.view viewWithTag:33333];  
3933     actionsheet=[[UIActionSheet alloc]initWithTitle:nil delegate:self  cancelButtonTitle:@"取消" destructiveButtonTitle:@"分享到新浪微博" otherButtonTitles:@"分享到腾讯微博", nil nil];  
3934     actionsheet.delegate=self;  
3935     [actionsheet showInView:imageview];  
3936   
3937     [actionsheet release];  
3938   
3939   
3940   
3941   
3942 //滚动试图在下面 点哪张 加上哪张  
3943 -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event  
3944 {  
3945     UITouch *touch=[touches anyObject];  
3946     //鼠标点击的位置 确定下来  
3947     CGPoint pt=[touch locationInView:scroll02];  
3948     //点击一次的时候  
3949     if (touch.tapCount==1) {  
3950         for (int i=0; i<18; i++) {  
3951             //根据tag  找到那个图片视图  
3952             UIImageView *image=(UIImageView *)[scroll02 viewWithTag:i+1];  
3953             //设置与用户交互  
3954             image.userInteractionEnabled=YES;  
3955             //  
3956            // int tag=image.tag;  
3957             scroll02.userInteractionEnabled=YES;  
3958             //判断是否点击到了图片   
3959             if (CGRectContainsPoint(image.frame, pt)) {  
3960                 //点到了哪张  就把图片的文件名赋给他  
3961                 imageName=[NSString stringWithFormat:@"17_%d.jpg",image.tag];  
3962                   
3963                 UIImage *image=[UIImage imageNamed:imageName];  
3964                 UIImageView *imageView=[[UIImageView alloc]initWithImage:image];  
3965                 imageView.frame=CGRectMake(0, 0, 320, 190);  
3966                 [self.view addSubview:imageView];  
3967                 [imageView release];  
3968   
3969             }  
3970               
3971         }  
3972     }  
3973       
3974 }  
3975   
3976 UITouch    
3977   
3978 //处理用户响应事件,需要重载那三个触摸的方法,开始,触摸到,末尾,  
3979   
3980   
3981   
3982   
3983   
3984   
3985   
3986   
3987   
3988   
3989   
3990   
3991  //用下载的数据 实例化  xml解析器  
3992     GDataXMLDocument *doc=[[GDataXMLDocument alloc]initWithData:downloadData  
3993                                                         options:0 error:nil];  
3994     //解析器 创建成功 (下载的数据  是合法的xml文件)  
3995     if (doc) {  
3996           
3997         //从解析器中用xpath  语法   查找  我要找的节点   返回值不管怎么样 都是数组类型  
3998         NSArray *usersArray=[doc nodesForXPath:@"//user" error:nil];  
3999           
4000           
4001           
4002           
4003         //xml文档中  的所有的  节点 都是   GDataXMLElement类的  实例(对象)  
4004         for (GDataXMLDocument *element in usersArray) {  
4005             // [element childAtIndex: ];//返回的第几个子节点  
4006             //            [element childCount];  
4007             //返回element  节点的子节点  为数组  
4008               
4009             //[element children];  
4010             //            [element attributeForName:@""];   获得element  节点的指定名称  的属性 节点     
4011             //获得element节点的所以的属性节点  
4012             //            [element attribute];  
4013               
4014             //实例化  模型类  对象  
4015             UserItem *item=[[[UserItem alloc]init] autorelease];  
4016             //从当前节点中查找 指定名称的子节点  elementsForName  所有的节点 都是element  
4017             //            NSArray *subArray=[element elementsForName:@"uid"];  
4018             //            //uid节点  
4019             //              
4020             //            GDataXMLElement *uidElement=[subArray lastObject];  
4021             //              
4022             //            //获取节点的 文本信息  
4023             //            item.uid=[uidElement  stringValue];  
4024             item.uid=[self elementString:element name:@"uid"];  
4025             item.username=[self elementString:element name:@"username"];  
4026             item.realname=[self elementString:element name:@"realname"];  
4027             item.headimage=[NSString stringWithFormat:@"http://192.168.88.8/sns%@",[self elementString:element name:@"headimage"]] ;  
4028               
4029               
4030             [dataArray addObject:item];  
4031         }  
4032           
4033         isLoading=NO;  
4034         [self.tableView reloadData];  
4035     }  
4036       
4037   
4038   
4039   
4040   
4041   
4042 高亮情况下的button的实现方式(相当于设置两张图片,一张是为默认准备的,一张是高亮准备的)  
4043   
4044 //默认的情况是出现一张图片  
4045     UIButton * rightbtn = [UIButton buttonWithType:UIButtonTypeCustom];  
4046     [rightbtn setImage:[UIImage imageNamed:@"NextMenuButton.png"] forState:UIControlStateNormal];  
4047     //高亮的时候是出现另外一张图片  
4048     [rightbtn setImage:[UIImage imageNamed:@"NextMenuButtonSelected.png"] forState:UIControlStateHighlighted];  
4049     rightbtn.frame = CGRectMake(200, 0, 40, 40);  
4050     [rightbtn addTarget:self action:@selector(pressrightbtn) forControlEvents:UIControlEventTouchUpInside];  
4051     [navbar addSubview:leftbtn];  
4052     [navbar addSubview:rightbtn];  
4053   
4054   
4055 自定义导航栏以及导航栏上面的 按钮   的基本方法  
4056    
4057     //自己定义导航栏  
4058     UINavigationBar * navbar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0, 0, 320, 40)];  
4059     //导航栏设置背景图片  
4060     [navbar setBackgroundImage:[UIImage imageNamed:@"NavigatorBarBg"] forBarMetrics:UIBarMetricsDefault];  
4061   
4062     //创建这个对象很重要的  
4063         UINavigationItem * item =[[UINavigationItem alloc] init];  
4064   
4065   
4066  //导航栏上面的返回按钮  
4067     UIBarButtonItem * btn1 = [[UIBarButtonItem alloc] initWithTitle:@"返回" style:UIBarButtonItemStyleDone target:self action:@selector(pressbtn1)];  
4068     btn1.tintColor = [UIColor yellowColor];  
4069     item.leftBarButtonItem = btn1;  
4070     [btn1 release];  
4071   
4072   
4073 //没有这句话 回来的时候就推不过去的  
4074     [navbar pushNavigationItem:item animated:YES];  
4075     [item release];  
4076     [self.view addSubview:navbar];  
4077     [navbar release];  
4078   
4079   
4080   
4081 //这么重要的函数老师居然没有讲   我靠!!  
4082 //此函数  如果是  return YES则就是四个方向都是支持的  竖着,倒着,左横,右横;  但系统默认只是正着的状态  
4083   
4084 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation  
4085 {  
4086     // Return YES for supported orientations  
4087    return (interfaceOrientation == UIInterfaceOrientationPortrait);  
4088 //    return YES;  
4089 }  

PS:转自http://blog.csdn.net/depthlove2011/article/details/18502909

你可能感兴趣的:(iOS笔记部分【全】,iOS,笔记)