- MVC模式:(model+view+controller):是一种帮你把代码功能和显示划分出来的设计模式;
- model:较为底层的数据引擎,负责管理实体中所继承的数据;
- view:和用户交互界面;
- controller:连接二者的桥梁;
- cocoa frameworks 有两个框架:
- foundation
- foundation 是cocoa中最基本的一些类;再mac应用程序中负责对象管理,内存管理,容器等相关数据;
- uikit:
- uikit:为程序提供可视化的底层构架,包括窗口,视图,控件类和管理这些对象的控制器。这一层中的其它框架允许你访问用户联系人和图片信息,以及设备上的加速器和其它硬件特征;
- code4app.com
- UI(User Interface)编程
- 9.3第八周,周一
- 创建ios项目
- 1.打开iOS中的application;
- 2.UIViewController:视图控件,通过点击,触摸来控制程序
- 3.UIView :视图;
- 4.在项目中创建一个文件。在 iOS的cocoa touch创建一个
- ulviewcontrollersubclass类然后在AppDelegate.m中找到application函数,在 self.window.backgroundColor = [UIColor whiteColor];后写如下代码
- RootViewCotroller *rvc=[[RootViewCotroller alloc]initWithNibName:@"RootViewCotroller" bundle:nil];
- self.window.rootViewController=rvc;
- [rvc release];
- 代码含义:创建根控件,并把新创建的根控件赋值给窗口的根控件;注意释放;
- 5.label控件的创建和属性:
- 可以用视图界面创建;然后修改属性;
- 6.代码实现label
- 1.IBOutlet :是个宏。控件和根界面控件内容建立联系
- 2.atomic:原子操作;线成保护;就是在几个线程中调用同一段内容时导致所用内容混乱,进行枷锁机制
- nonatomic:不加锁机制;能提高效率;
- 把控件打包,并和界面添加的控件建立联系:
- 3.在RootViewCotroller.m文件中在viewDidLoad(加载函数)函数中设置lable的属性;
- 4.iPhone 横向320 竖向480 横条占20; 所以一般是320*460
- 创建给label并在屏幕上定位
- CGRect rect={0,100,100,40};
- //创建定位结构体;
- 坐标原点是左上角;四个参数分别是距左框的距离;距上框的距离;label控件的宽度,高度;
- UILabel *label=[[UILabel alloc] initWithFrame:rect];
- UILabel *label=[[UILabel alloc]
- 可一直接生成UIrect;
- initWithFrame:CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)]
- 5.UIView * 指所有可视控件;
- 6.设置背景色
- [label1 setBackgroundColor:[UIColor blueColor]];
- 7.设置label的字体;
- [label2 setFont:[UIFont systemFontOfSize:20]];
- label1.font=[UIFont italicSystemFontOfSize:30];
- 8.设置字体的颜色
- label2.textColor=[UIColor redColor];
- 9.设置字体的对齐方式;
- label1.textAlignment=UITextAlignmentLeft;
- 10.自动调整字体
- label1.adjustsFontSizeToFitWidth=YES;
- 当文字数量多时可以自动调整字体大小
- 如果不设置就会变成省略;
- 字体省略方式:
- label2.lineBreakMode=UILineBreakModeHeadTruncation;
- 这个是截去头,还有尾截,和中间截去;
- label2.lineBreakMode=UILineBreakModeClip;
- 表示在已有控件写多少是多少,不写省略符
- label1.lineBreakMode=UILineBreakModeCharacterWrap;
- 字符换行,指只要需要换行就换行不考虑单词的整体性;
- label1.lineBreakMode=UILineBreakModeWordWrap;
- 以一个整个单词换行,不允许把整个单词分开写到不同的行;保持单词完整性;
- 设置自动调整的最小限制
- label1.minimumFontSize=10;
- 11.设置行数:
- label1.numberOfLines=3;
- 注:如果行高不够的话它不能显示完整;
- 字体省略方式
- 12.设置高亮颜色
- label1.highlightedTextColor=[UIColor whiteColor];
- 设置高亮的状态时的颜色;
- label1.highlighted=YES;
- 把label设置为高亮状态;
- 13.设置阴影色
- label1.shadowColor=[UIColor blackColor];
- 设置阴影颜色;
- label1.shadowOffset=CGSizeMake(-2,-2 );//只有长和宽 没有 起始位置
- 设置阴影位置;是相对字体的位置;
- 14.IOPhone的图标默认大小时57*57;
- 9.4周二
- 1. IBAction 时void型的,为了连接某个触发;
- 2.button创建
- button1=[UIButton buttonWithType:UIButtonTypeRoundedRect]
- 注:这样创建的button不是alloc出来的不用释放;
- 后面参数时button 的外观;
- 3.button设置位置:
- button1.frame=CGRectMake(120, 280, 80, 40);
- 4.button 设置title
- [button1 setTitle:@"click here" forState:UIControlStateNormal];
- 注:由于button继承view control所以它可以设置状态;
- 状态的作用?
- 答:可以在不同状态下展示不同的button 特点;
- 1.高亮状态下设置
- [button1 setTitle:@"click ready" forState:UIControlStateHighlighted];
- 2.禁用状态设置
- [button1 setTitle:@"forbid using" forState:UIControlStateDisabled];
- button1.enabled=NO;
- button设置成不可用,但是还可以更改button 的属性
- 5. 设置button的title的属性;
- button1.titleLabel.font=[UIFont systemFontOfSize:20];
- 注:button是复合了label所以可以调用title label,设置它的 文本属性就是设置button的文本属性;
- 6设置 颜色
- [button1 setTitleColor:[UIColor yellowColor] forState:UIControlStateNormal];
- 7.给button添加事件
- [button1 addTarget:self action:@selector(onclick) forControlEvents:UIControlEventTouchUpInside];
- addTarget:指触发的对象; action:触发的事件; forControlEvets:是表示如何点击按钮触发;
- 8.局部声明button,如何使用button使其执行动作;
- 在事件函数头传递button对象;谁调用它就传递谁的地址;
- -(void)onclick:(UIButton *)seder
- [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];
- 注意:传递调用函数带参数有冒号;
- 9.添加图片
- UIImage *image=[UIImage imageNamed:@"03.gif"];
- [button setBackgroundImage:image forState:UIControlStateNormal];
- [button setBackgroundImage:image1 forState:UIControlStateHighlighted];
- 10.得到图片大小
- CGSize size=image.size;
- NSLog(@"%f %f",size.width,size.height);
- 11.让button一直处于选择状态;
- button.selected=YES;
- button会一直处于一个状态而不改变? 到底什么意思
- 12. 判断button状态执行操作;
- if(button.state==UIControlStateNormal){
- }
- 13.移出事件
- [sender removeTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragOutside];
- 14.点击滑动的妙用;可以在作程序时加入实现触屏效果;
- [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragInside];
- [button addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchDragOutside];
- 9.6周四
- UIView (视图)
- 1.什么是uiview
- 在应用程序中看的见摸的着的是视图。相当于java中容器;
- viewController相当于底板;
- 2.创建视图
- UIView *view=[[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 420)];
- 3.将视图添加到父视图
- [self.view addSubview:view];
- 注意:子视图是父视图的子类,后添加的视图在最上曾;
- 4.在视图view中添加label(label 是view的子类)
- [view addSubview:label];
- 注:由于ui中的控件都是视图,所以可以在任意视图加载其他视图;
- 把一些视图装到另一个视图是为了保证视图的整体性;
- 注:在button上添加label点击label就是点击button label相当于透明;而在上添button就是点谁谁响应;
- 5.
- CGRectframe :坐标
- CGRectbounds:边界
- button.bounds=CGRectMake(0, 0, 50, 50);
- CGPointcenter:中点
- 该是图的中点在父视图的相对坐标;
- button.center=CGPointMake(160, 230);
- 指视图的中心位置在父视图的相对位置
- 得到视图的终点坐标:
- button.center.x;
- button.center.y;
- 6.视图层次
- 视图子类是个数组;
- 视图先添加的在下,后添加在上;
- 交换视图位置:
- [button1 exchangeSubviewAtIndex:0 withSubviewAtIndex:1];
- 1.遍历视图
- for (UILabel * l in button1.subviews) {
- l.text=[NSString stringWithFormat:@"%d",i++];
- }
- 2.插入视图
- [button1 insertSubview:label3 atIndex:1];
- 将视图label3插入到视图button1的第二位;
- [button1 insertSubview:label2 aboveSubview:label1];
- 将视图label2插到label1上;
- [button1 insertSubview:label1 belowSubview:label3];
- 3.将视图从父类视图中移出;
- [label2 removeFromSuperview];
- 4.[button1 delete:label2];
- 5.将视图放到最上层 ;
- [button1 bringSubviewToFront:label1];
- 注:写代码时把子视图写到一块,父视图写到一块
- 6.把视图放到最上下层
- [button1 sendSubviewToBack:label1];
- 7.判断某个视图是某个视图的子视图 返回类型是bool类型;
- [label1 isDescendantOfView:button1];
- 7.tag 视图的标志; 可以标志视图。是set 和get函数,设置和取得可以用“.”操作
- button1.tag=1;
- 8.label1.superview 表示label1的父视图;
- 9. 隐藏视图 :label1.hidden=YES; 默认为no。
- 应用:可以让视图重叠换灯片放映,或动画;如果父视图隐藏,子视图也随之消失
- 10.视图可能会超出父视图的范围;这时可以更改父视图边界属性裁减出边界 的子视图
- button1.clipsToBounds=YES;
- UIImageView
- 1.初始化:
- UIImageView *imageview=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"2.jpg"]];
- imageview.frame=CGRectMake(20, 20, 140, 220);
- imageview.contentMode=UIViewContentModeScaleAspectFit;
- 让添加的图片按比例填充;
- 3.imageview和label都不能触发事件 但是可以给他们添加事件
- //点击事件 搞清楚是单击还是双击 来处理事件
- //声明点击手势 初始化点击手势识别器
- 当单击判断失败 在触发单击;先判断,不知道是单击还是双击
- UITapGestureRecognizer *tgr=[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(onclick)];//来添加事件
- tgr.numberOfTapsRequired=1;//区分单击还是双击
- tgr.numberOfTapsRequired=2;
- [tag addTarget:self action :@selecter(press:)];//事件
- //创建敲击事件的接收器;
- [imageview addGestureRecognizer:tgr];//这个视图来响应,把手势加到视图上面
- 4.
- imageview.UserInteractionEnabled=YES;
- //是否能和用户交互;
- 5.三中图片填充方式
- imageview.contentMode=UIViewContentModeScaleAspectFit;
- imageview.contentMode=UIViewContentModeScaleAspectFill;
- //按比例添满会超出边界。所以如果超出可以裁减
- imageview.clipsToBounds=YES;
- imageview.contentMode=UIViewContentModeScaleToFill;
- //添满
- 6.创建视图还可以在appDelegate.m中的application中声明实现
- 7. 子视图按某中形式随父视图扩大或缩小;不同的扩大缩小方式特点可以或
- labelsub.autoresizingMask=UIViewAutoresizingFlexibleWidth;
- labelsub.autoresizingMask=UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
- 控制视图按比例的开关;
- labelsub.autoresizesSubviews=NO;
- MVC:设计思想: model:内存数据 view :可视控件;controller:控制代码;
- 单例:从头到尾使用的类
- RootController *rvc=[[RootController alloc]initWithNibName:@"RootController" bundle:nil];//有xib文件时创建连接文件,以后最好没有xib文件,xib文件降低速度
- 以后初始化要不创建xib文件初始化方法是:
- RootController *rvc=[[RootController alloc]init];
- kvo/kvc:?
- notification:?
- 窗口:
- iphono内存占用量不超过20Mb
- 全屏做法 1.记下此时的控件fram
- 2.修改控件的大小,使其全屏
- 3.把改图像拉到顶层;
- 4.修改tag
- 字体新设置:
- label.font=[UIFont fontWithName:@"宋体" size:30];
- timer
- 1.创建定时器,一但创建就开始运行;
- NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:0.5 target:self selector:@selector(changLabel) userInfo:nil repeats:YES];
- 2,定时器停止;一旦停止就释放,相当于release;
- [timer invalidate];
- 3,打开定时器
- [timer fire]
- 4.动画效果
- '
- UITextField:对话框 同样是个view
- 1.创建
- UITextField *field=[[UITextField alloc] initWithFrame:CGRectMake(40, 20, 250, 60)];
- 2.设置边框
- UITextField *field=[[UITextField alloc] initWithFrame:CGRectMake(40, 20, 250, 60)];
- 3.在文本框后面设置清除键
- field.clearButtonMode=UITextFieldViewModeAlways;
- 4.设置初始文本
- field.placeholder=@"username";
- 5。设置文本变为隐藏;
- field.secureTextEntry=YES;
- 6.设置textfield的自定义函数
- 首先在.h文件中提交协议 <UITextFieldDelegate>
- 这样就可以自定义textfield 函数;注:自定义函数如果是返回bool类型的函数说明这个函数是一个监听函数;自定义都是进行某些动作时自动调用;
- 7.-(void)textFieldDidBeginEditing:(UITextField *)textField
- 当文本框进入编辑模式时自动调用
- 8.退出编辑模式时调用函数;
- -(void)textFieldDidEndEditing:(UITextField *)textField
- {
- ( (UILabel *)[self.view.subviews objectAtIndex:0]).text=textField.text;
- }
- 9.点击键盘上return后调用的函数
- -(BOOL)textFieldShouldReturn:(UITextField *)textField
- 10.关闭键盘函数;
- [textField resignFirstResponder];
- return NO;
- 11.限定输入字符的长度函数
- -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
- { //textfield表示谁调用该函数,
- if (string.length>0) //string 表示当前输入的字符;
- return textField.text.length<10; //而textField.text的值是还没有加入刚输入的string
- return YES;
- }
- 9.10 第九周
- 多控制器操作:
- 一.多控制器间的切换;
- 思想:1.在每个视图控制器界面添加按钮点击触发事件创建新的视图控制器;然后把当前控制器交给新建的控制器;
- 2.在新建的视图控制器中等使用完该控制器后,把控制器释放;由于创建是在前一个控制器中释放的所以这里释放不是简单的release;
- 方法:一 1.在父控制器中创建新控制器,并把但前的控制界面交给新控制器
- ViewController* vc2=[[ViewController2 alloc] init];
- vc2.view.frame=CGRectMake(0,0,320,460);
- [self.view addSubview:vc2.view];
- [self addChildViewController:vc2];
- 注:由于这样vc2 是在原控制器上加载所以它会默认流出原视图导航栏,要想让新控制器全部占满屏幕就要更改视图的大小;
- 2. 然后用完vc2在最后把vc2从原控制器中移出
- [self.view removeFromSuperview];
- [self removeFromParentViewController];
- 注:由于创建vc2时原有的控制器可vc2关联,原有的view和vc2的view关联;所以在清理时得把这两项分别清理;
- 注:这中添加清理的方法使用高版本;为了程序的适用性通常用第二种方法;
- 二: 1.在父控制器中创建新控制器;并把当前的控制器设置为vc2,并添加动画效果
- ViewController* vc2=[[ViewController2 alloc] init];
- [self presentModalViewController:vc2 animated:YES];
- //添加新的controller而且带动画效果;animated:是否要动画效果
- 2 在用完vc2时移出该控制器;
- [self dismissModalViewControllerAnimated:YES];
- //释放当前的controller
- 动画效果:只要把新的位置改变放到这些代码之间;
- [UIView beginAnimations:nil context:nil];//动画设置开始;
- [UIView setAnimationDuration:0.2];//设置动画时间;
- text.frame=CGRectMake(<#CGFloat x#>, <#CGFloat y#>, <#CGFloat width#>, <#CGFloat height#>)//对象的新状态;
- [ UIView commitAnimations];//开始动画;
- 9。11周二
- 注:系统对象不开辟空间不能打印retaincount自己声明的类的对象不开辟空间可以打印retaincount
- 导航条UINavigationBar
- 1.导航条按钮初始化三种方法:
- 1.普通初始化
- UIBarButtonItem *rigthButton=[[[UIBarButtonItem alloc] initWithTitle:@"next" style:UIBarButtonItemStylePlain target:self action:@selector(click:)] autorelease];
- 第一个参数是按钮标题;第二个参数是按钮的样式;第三个参数是触发事件调用那个类中的方法第四个参数是触发的事件
- 2.用图片初始化
- UIBarButtonItem *rightButtton= [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"5.png"] style:UIBarButtonItemStylePlain target:self action:@selector(click:)];
- 注:这样初始化的按钮有按钮框,图片存在按钮框里要想只显示图片要自定义按钮然后用按钮初始化;如第三种方法;
- 3.自定义控件初始化
- //自定义的透明按钮 上面一般是要加上图片 让后点击图片
- UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
- [button setImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];
- 创建button 按钮,样式设置为普通,也就是没有样式;
- button.frame=CGRectMake(0, 0, 30, 30);
- 注:必须设置button 的frame否则不显示
- [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
- 给button添加事件
- UIBarButtonItem *rightButton=[[UIBarButtonItem alloc] initWithCustomView:button];
- 初始化导航条button
- 4.运用系统功能按钮初始化uibarbutton
- UIBarButtonItem *rightButton=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCamera target:self action:@selector(click:)];
- 2.添加副标题//导航栏添加副标题
- self.navigationItem.prompt=@"subtile"; 导航条高度是44;
- 3.把导航条按钮设置成数组;可多加按钮,按钮一多会把别的控件挤偏;但是不能覆盖;如果加的太多只能显示先加入的;
- self.navigationItem.rightBarButtonItems=[NSArray arrayWithObjects:<#(id), ...#>, nil nil]
- 注:UIBarButtonItem 有些属性和unbutton不一样,UIBarButtonItem不能设置
- //设置导航栏的颜色
- 4.设置导航条色调
- // tintColor:色调 控制器的导航条 的 色调
- self.navigationController.navigationBar.tintColor=[UIColor purpleColor];
- 5.颜色色透明度
- 1.黑色透明度
- self.navigationController.navigationBar.barStyle=UIBarStyleBlackTranslucent;
- 2.其他颜色透明度
- self.navigationController.navigationBar.translucent=YES;
- self.navigationController.navigationBar.alpha=0.8
- slider.frame=self.navigationController.navigationBar.bounds;//从边界开始设定大小
- 重点
- 6.更改导航条背景
- //更改背景图片ios5.0以后的方法
- //判断。如过是5.0以上的版本用以下方法;
- if (__IPHONE_OS_VERSION_MIN_REQUIRED>=__IPHONE_5_0) {
- [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@""] forBarMetrics:UIBarMetricsDefault];
- }
- 如果是5.0以下的可以创建类别
- //通过类别创建图像
- @implementation UINavigationBar(Custom)
- -(void)drawRect:(CGRect)rect{
- UIImage *image=[UIImage imageNamed:@""];
- [image drawInRect:rect];
- }
- 7.隐藏导航条
- [self.navigationController setNavigationBarHidden:YES animated:YES];
- 8.直接跳转到某页
- 1.创建数组把控制页面全部加载进来;
- NSMutableArray *array=[NSMutableArray arrayWithArray:self.navigationController.viewControllers];
- 2.设置跳转到哪页
- [self.navigationController popToViewController:[array objectAtIndex:0] animated:YES];
- 能够设置的常项
- 创建一个可变空数组;
- NSMutableArray *array1=[[NSMutableArray alloc]initWithCapacity:0];
- 用数组设置navigationController的ViewControllers
- //[self.navigationController setViewControllers:array];
- self.navigationController.viewControllers=array;
- 9.在子导航条中去除自带得返回上一级得button
- self.navigationItem.hidesBackButton=YES;
- ToolBar工具条
- 1.创建工具条:为单个viewcontroller添加toolbar
- UIToolbar *toobar=[[UIToolbar alloc] initWithFrame:CGRectMake(0,372,320, 44)];
- 注:一定要注意创建导航条后当前的viewcontroller的坐标原点已经改变是加上导航条后的的高度;导航条的高度是44;
- toolbar.tintColor=[UIColor purpleColor];
- toolbar的颜色设置;和导航条设置一样;
- toobar.hidden=NO;
- 注:toolbar的hidden属性默认是yes,所以加toolbar要把hidden设置为no;
- 2. 在导航条中有toolbar属性;所以要想每页都加toolbar 就可以在这里把导航条的toolbar的hidden属性设置为no;
- ];
- UINavigationController *nv=[[UINavigationController alloc]initWithRootViewController:vc];
- nv.toolbarHidden=NO;
- nv.toolbar.tintColor=[UIColor purpleColor];
- [nv setNavigationBarHidden:YES animated:YES];
- 3.把按钮写成一个数组然后添加到toolbar
- [array addObject:button];
- //设置viewcontroller的toolbar以数组初始化;
- //toobar的button不能调整大小;
- // self.toolbarItems.
- [self setToolbarItems:array animated:YES];
- 4.验证两个coloer属性;
- tinkcoloer:
- 9.12 周三
- //六个控件
- UISlider 滑条控件//滑动条控件
- 滑条初始化:
- UISlider *sl=[[UISlider alloc]initWithFrame:CGRectMake(30, 60, 280, 30)];
- 1.滑条的高度不用设置因为系统默认 ;但是可以设置背景图改变滑条的高度;具体看滑条的图片设置
- 创建label用来显示滑动的数值
- UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 40)];
- view控件的tag属性可以作为区分视图的标志想查找它时可以在另一个函数中写
- UILabel *label=(UILabel *)[self.view viewWithTag:100];
- label.tag=100;
- 设置滑条的最大值和最小值;
- sl.minimumValue=0.0;
- sl.maximumValue=20.0;
- 给滑条添加事件,由于滑条的值是可变的所以监听它时用值改变事件监听,以后一般遇到值可以不断改变的view控件要用值改变事件监听;
- [sl addTarget:self action:@selector(valuechang:) forControlEvents:UIControlEventValueChanged];
- // 设置默认滑条位置;
- sl.value=10.0;
- 设置大小端图像;
- sl.maximumValueImage=[UIImage imageNamed:@"5.png"];
- 设置滑条轨迹的颜色
- sl.minimumTrackTintColor=[UIColor purpleColor];
- sl.maximumTrackTintColor=[UIColor redColor];
- sl.thumbTintColor=[UIColor greenColor];
- //点击按钮分高亮状态和非高亮状态;所以要注意设置那个状态;
- [sl setThumbImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];
- //设置滑条的最大最小图像;注:1滑点滑动部分变大图像会被拉伸,如果图像到达原大小在压缩不会变化;2.如果滑条设置背景图片就会改变滑条的宽度,而且只能是改变minimumValueImag此时的图片高度就是滑条的高度;原因:因为滑条的大端是开始的占空间大小;显示的滑动进度是在原有基础上添加的所以大端改变整个滑条才会改变
- [sl setMinimumTrackImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];
- [sl setMaximumTrackImage:[UIImage imageNamed:@"5.png"] forState:UIControlStateNormal];
- 简单的滑条触发事件测试:滑条值的改变显示在label控件上;
- -(void)valuechang:(UISlider *)sender
- {
- UILabel *label=(UILabel *)[self.view viewWithTag:100];
- label.text=[NSString stringWithFormat:@"%.0f",sender.value];
- }
- UISwitch:开关控件//创建开关控件
- 初始化switch对象
- UISwitch * _swith=[[UISwitch alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
- 给with添加事件注意 事件控制是UIControlEventValueChanged
- [_swith addTarget:self action:@selector(sw:) forControlEvents:UIControlEventValueChanged];
- 设置with的打开时背景色
- _swith.onTintColor=[UIColor blackColor];
- 注:不用设置switch的宽高。因为时系统默认;设置没有作用;
- 给switch添加switch事件:状态改变一次触发一次
- -(void)sw:(UISwitch *)swith
- {
- if (switch.on==YES)
- NSLog(@"yes");
- else
- NSLog(@"no");
- }
- UIActivityIndicatorView:加载缓控件
- //加载缓冲页面;初始化
- UIActivityIndicatorView *aiv=[[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 100, 0, 0)];
- 设置当停止时隐藏
- aiv.hidesWhenStopped=NO;
- 设置旋转图标的样式。一共有三种
- aiv.activityIndicatorViewStyle=UIActivityIndicatorViewStyleWhiteLarge;
- 设置缓冲图标的颜色 注:要先设置样式在设置颜色,因为样式是带颜色,能覆盖以前的颜色;
- aiv.color=[UIColor blueColor];
- 缓冲图标开始,停止动画;
- [aiv startAnimating];
- [aiv stopAnimating];
- UIProgressView:进度条
- 初始化进度条
- UIProgressView *pgv=[[UIProgressView alloc] initWithFrame:CGRectMake(50, 100, 220, 0)];
- 设置进度条的tag属性;
- pgv.tag=100;
- pgv.progressViewStyle=UIProgressViewStyleBar;
- //颜色设置
- pgv.progressTintColor=[UIColor purpleColor];
- pgv.trackTintColor=[UIColor blackColor];
- //进度条图片设置
- pgv.progressImage=[UIImage imageNamed:@""];
- pgv.trackImage=[UIImage imageNamed:@""];
- //用时间控制器模拟时间进度条;
- [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(refresh:) userInfo:nil repeats:YES];
- //用函数对进度条做试验
- -(void)refresh:(NSTimer *)timer
- {
- UIProgressView *pv=(UIProgressView *)[self.view viewWithTag:100];
- [pv setProgress:pv.progress+0.1 animated:YES];
- if (pv.progress==1) {
- NSLog(@"%d",[timer retainCount]);
- [timer invalidate];
- // [timer release];
- //注意在ui中运用封装好的函数生成的控件不要给他们release它有他自动释放或需要调用释放函数;所以不必管它
- NSLog(@"%d",[timer retainCount]);
- }
- UITextView 文本编辑器
- 文本编辑器和文本框一样有代理函数在.h文件开头需引入;
- @interface ViewController : UIViewController<UITextViewDelegate>
- 它的代理函数和文本框的基本相同,不同的有两个
- -(void)textViewDidChange:(UITextView *)textView:(UITextView *)textView
- -(void)textViewDidChangeSelection:(UITextView *)textView
- 注:在调用代理函数时一定要textview的代理设置为调用函数所在的类;
- 文本框的一些属性设置:
- 1.初始化文本框
- UITextView *textView=[[UITextView alloc]initWithFrame:CGRectMake(0, 0, 320, 100)];
- 2.文本框的颜色,对齐方式,字体设置
- textView.textColor=[UIColor grayColor];
- textView.textAlignment=UITextAlignmentLeft;
- textView.font=[UIFont systemFontOfSize:30];
- 3。自动纠错关闭;
- textView.autocorrectionType=NO;
- 4.大写模式;除此之外还可以设置字母不大写;句首字母大写。单词开头字母大写; textView.autocapitalizationType=UITextAutocapitalizationTypeAllCharacters;
- 5.键盘模式:
- textView.keyboardType=UIKeyboardTypePhonePad;//打电话模式
- textView.returnKeyType=UIReturnKeyGo;返回模式变为go
- //根据输入框需要输入的内容不同要设置键盘的样式
- UIStepper 计步器//创建一个计步器
- 1.初始化
- //ValueChanged 点击是要用这种模式
- UIStepper *stepper=[[UIStepper alloc]initWithFrame:CGRectMake(100, 200, 100, 40)];
- 2.给stepper添加触发事件,还是注意 forControlEvents:UIControlEventValueChanged的设置
- [stepper addTarget:self action:@selector(stepper:) forControlEvents:UIControlEventValueChanged];
- 3.设置stepper的最大最小值
- stepper.minimumValue=0;
- stepper.maximumValue=50;
- 4.
- //常按可以自动加默认是yes 长按就一直进行
- stepper.autorepeat=YES;//autorepeat是否连续的执行这一操作或者响应
- //最小和最大间循环;
- stepper.wraps=YES;
- //设置每次增长值
- stepper.stepValue=2;
- //设置按键时是否显示每次加的值;如果设为no常按键会加到走好几个步长的值
- stepper.continuous=NO;//continue单位时间内是否响应
- UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(50, 50, 100, 50)];
- label.font=[UIFont systemFontOfSize:30];
- [self.view addSubview:label];
- label.tag=100;
- -(void)stepper:(UIStepper *)stepper
- {
- UILabel *label=(UILabel *)[self.view viewWithTag:100];
- label.text=[NSString stringWithFormat:@"%f",stepper.value];
- }
- UISegmentedControl 分段控制器;//创建分段控制器
- 1.分段控制器初始化
- UISegmentedControl *sc=[[UISegmentedControl alloc]initWithItems:[NSArray arrayWithObjects:@"a",@"b",@"c",[UIImage imageNamed:@"5.png"], nil nil]];
- 2 分段控制器设置frame
- sc.frame=CGRectMake(100, 100, 150, 40);
- 3. 为分段控制器添加监听事件;
- [sc addTarget:self action:@selector(sc:) forControlEvents:UIControlEventTouchUpInside];
- //注这个触发事件监听是ValueChanged,为了监听按钮
- 4。控制类型控制类型一共有四种;
- sc.segmentedControlStyle=UISegmentedControlStyleBordered;
- 5。按钮自动弹起开启;默认是no;
- sc.momentary=YES;
- 6。添加新按钮;可以是文字,或图像;
- [sc insertSegmentWithTitle:@"e" atIndex:3 animated:YES];
- [sc insertSegmentWithImage:<#(UIImage *)#> atIndex:<#(NSUInteger)#> animated:<#(BOOL)#>]
- 7.在段控制器中区分点击那个按钮的个属性
- //一共有多少个按钮;
- int i=sc.numberOfSegments;
- //当前点击的按钮位置;
- int j=sc.selectedSegmentIndex;
- //移出当前点击的段;
- [sc removeSegmentAtIndex:j animated:YES];
- //移出所有的段;
- [sc removeAllSegments];
- UIGesture 手势事件
- 1.移动手势
- 1.创建移动手势的对象:
- UIPanGestureRecognizer *pan=[[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(pan:)];
- 2.把此对象添加到操作的对象中;
- [imagview addGestureRecognizer:pan];
- 3.实现移动对象的方法
- -(void)pan:(UIPanGestureRecognizer *)pan
- {
- CGPoint point=[pan translationInView:self.view];
- //这个函数是得到触点在屏幕上与开始触摸点的位移值
- imagview.center=CGPointMake(imagview.center.x+point.x, imagview.center.y+point.y);
- //让图像的中心位置变化;中心变化图像位置就移动了 ,但是注意位移时如果不清空translation就会多移动一倍;所以每次要让pan的位置零;
- [pan setTranslation:CGPointMake(0, 0) inView:self.view];
- }
- 2.扩大缩小手势
- 1.创建扩大缩小手势的对象 在创建时就带了要触发的事件 手势器
- UIPinchGestureRecognizer *pinch=[[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(pinch:)];
- 2.记录下开始图像的大小,在扩大缩小函数时使用;原因是扩大尺寸是在图像的现有大小上乘,而图像的尺寸是变化的所以会使图像扩大缩小的太过火;所以纪录原图像大小一直在这个基础上扩大 size=CGSizeMake(imagview.bounds.size.width,imagview.bounds.size.height );
- 3.图像添加扩大缩小手势;
- [imagview addGestureRecognizer:pinch];
- 4.图像扩大缩小手势触发的事件;
- -(void)pinch:(UIPinchGestureRecognizer *)pinch
- {
- 改变图像的大小;pinch.scale是触摸点的相对于原有位置的位移量的倍数。
- imagview.bounds=CGRectMake(0, 0,size.width*pinch.scale, size.height*pinch.scale);
- 为了防止每次扩大缩小都要从原图开始,所以操作结束释放触点一次就要把当前的尺寸记下,下次变化在这个基础上改变;
- if (pinch.state==UIGestureRecognizerStateEnded) {
- size=CGSizeMake(imagview.bounds.size.width, imagview.bounds.size.height);
- }
- gesture.scale=1.0f;//这个很重要
- 3.旋转手势
- //电话在手机里面优先级是最高的
- 1.旋转角度对象的初始化
- UIRotationGestureRecognizer *rotation=[[UIRotationGestureRecognizer alloc]initWithTarget:self action:@selector(rotation:)];
- 2.给旋转图像添加旋转对象
- [imagview addGestureRecognizer:rotation];
- 3.旋转时触发的函数
- -(void)rotation:(UIRotationGestureRecognizer *)rotation
- {
- 让图像旋转某个角度,这个交度使相对原图旋转的角度。所以必须有个判断语句,如果释放一次触点就要把当前位置记下,否则图像还会回到原来状态;
- imagview.transform=CGAffineTransformMakeRotation(f+rotation.rotation);
- if (rotation.state==UIGestureRecognizerStateEnded) {
- f=f+rotation.rotation;
- }
- }
- 4.tap的一些属性
- 可以给image添加tap事件
- tap.numberOfTapsRequired=2;//点击几次触发事件,点击次数必须是连续点击
- tap.numberOfTouchesRequired=2;//设置触摸点数 只有两个触点存在时点击才能触发事件
- 5.触摸时自动调用的触摸函数一共有四个
- 触点事件调用时UITouch对象产生后自动调用的属性;由于单击的话只有一共对象;所以不论有几个touch对象都时指当前鼠标触点?那为什么还要创建触点对象呢?而anyobject之外还能做什么
- 1. 触摸开始触发的事件
- //开始触屏的时候touchesBegan
- -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- {
- NSLog(@"began");
- 建立触摸对象 触摸对象是任意触点;但是事实是当前鼠标点击的点;但是怎么得到另一个点的坐标?
- UITouch *touch=[touches anyObject];//anyObject 任何触摸的东西都储存在里面
- if(touch.tapCount==1)
- {
- NSLog(@"这是一个单击事件");
- }
- else if(touch.tapCount==2)
- {
- NSLog(@"这是一个双击事件");
- }
- CGPoint point=[touch locationInView:self.view];
- NSLog(@"%f %f",point.x,point.y);
- // 可以调用touch开始点和touch结束点做加减得到移动大小, 但是这样做很麻烦,ui有封装好的方法 UIPanGestureRecognizer
- // touch只调用第一触电大小,怎么得到第二个点?}
- //手指离开屏幕的时候
- 2.触摸事件结束触发事件
- -(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
- {
- NSLog(@"end");
- }
- 3.cancell实在移动时突然被其他进程打断时调用。比如突来电话
- -(void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
- {
- NSLog(@"cancel");
- }
- 4.触点移动时触发的事件;
- //手指移动发生的事件
- -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
- {
- UITouch *touch=[touches anyObject];
- CGPoint point=[touch locationInView:self.view];
- UIImageView * imageView=(UIImage *)[self.view viewWithTag:101];
- CGRect
- NSLog(@"move");
- }
- [performSelector:@selector(single Tag)withObject:nil afterDelay:delaytime]//实现函数的调用,延时调用,相当于多线程
- 9.13周四
- 1.各个控制器间的关系:
- window 的rootviewcontroller可以是uinavigationcontroller ,uitabbarcontroller ,uiviewcontroller
- uinavigationconroller 上可以添加uiviewcontroller
- uitabbarcontroller上可以添加uiviewcontrolller 也可以添加uinavigationcontroller
- 到此基本上控制器的关系弄清了;
- 1.UITabBarController :标签控制器,分栏控制器
- 当uitabbarcontroller含的uitabbaritem很多时,编译器会自动隐藏以省略号表示,点击省略号就可以查看不显示的item
- 1.初始化:
- UITabBarController *tc=[[UITabBarController alloc]init];
- 2.创建视图控制器然后创建 UITabBarItem并把它赋给视图控制器的 tabBarItem
- ViewController *vc=[[[ViewController alloc]init]autorelease];
- UITabBarItem *item=[[UITabBarItem alloc]initWithTabBarSystemItem:UITabBarSystemItemSearch tag:0];
- 注:可以自定义item 也可以用系统中定义好的;
- vc.tabBarItem=item;
- 3.创建导航条;用于放人UITabBarController 由此可知uitabbarcontronller和uinavigationcontroller的包含关系;
- UINavigationController *nc=[[UINavigationController alloc]initWithRootViewController:vc];
- 4.添加导航控件和视图控件;
- tc.viewControllers= [NSArray arrayWithObjects:nc,vc1,vc2, nil nil];
- 5.让根控制器为标签控制器
- self.window.rootViewController=tc;
- 2.解决不显示第二个以后的标签问题
- 1.原因:如果把每个控制器的标签生成写在viewdidload里面由于为了节省内存开始只会加载一个控制器。所以只能显示第一个标签;
- ViewController1 *vc1=[[[ViewController1 alloc]init]autorelease];
- //注如不使用vc1显示是没有其图,因为还不加载它的程序
- vc1.view.backgroundColor=[UIColor blueColor];
- 2.解决方法:1.init函数中生成控制器标签生成代码;在创建控制器时就会执行;
- 2. 在appdelegate中生成控制器的标签
- 3.在appdelegate 中调用控制器的函数
- 3.本地存储: NSUserDefaults:一旦运行数据就会被存储下来,每次运行程序以前的纪录下来的数据仍然有;
- //只能保存NSString NSNumber NSData,NSDictionary; NSArray;这五种类型;(其他的是需要强转的 类似于 图片的)
- //保存到本地,一旦保存,再运行还有数据,所以可以达到数据在不通页面间的传递
- NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
- //为本地存储添加数据;类似于字典的用法
- [userDefault setObject:@"adba" forKey:@"key"];
- //同步操作,保存到本地;
- [userDefault synchronize]; 同步了才可以保存到本地的
- //获取以前存储的数据;
- NSString * str=[userDefault objectForKey:@"key"];//根据关键字取出对应的用户默认数据
- NSLog(@"%@",str);
- //实现UITabBarControllerDelegate代理的方法
- - (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
- {
- NSLog(@"You selected: %d",tabBarController.selectedIndex);
- //只是一个单例
- NSUserDefaults *ud=[NSUserDefaults standardUserDefaults];//用来存储数据的数据库 创建一个指针来存储和取出数据
- [ud setInteger:tabBarController.selectedIndex forKey:@"LAST_PAGE"];
- [ud synchronize];//将新添加的数据存盘
- }
- //下面4个方法 不是属于类的方法 是系统本来已经提供的方法 只跟视图控制器的出现和消失有关系的
- //视图将要出现的时候
- - (void)viewWillAppear:(BOOL)animated; // Called when the view is about to made visible. Default does nothing
- //视图已经出现的时候
- - (void)viewDidAppear:(BOOL)animated; // Called when the view has been fully transitioned onto the screen. Default does nothing
- //视图将要消失的时候
- - (void)viewWillDisappear:(BOOL)animated; // Called when the view is dismissed, covered or otherwise hidden. Default does nothing
- //视图已经消失的时候
- - (void)viewDidDisappear:(BOOL)animated; // Called after the view was dismissed, covered or otherwise hidden. Default does nothing
- 4.数据字典:NSDictionary:用于存储数据可以和数组联合起来用;
- 1.字典的初始化方法
- 1.直接用数值初始化:
- NSDictionary *dic1=[[NSDictionary alloc]initWithObjects:[NSArray arrayWithObjects:@"",@"", nil nil] forKeys:[NSArray arrayWithObjects:@"",@"", nil nil]] ;
- 2.用数组初始化
- NSArray *array=[[NSArray alloc]initWithObjects:@"23",@"100",@"zhang" ,nil];
- NSArray *array2=[[NSArray alloc] initWithObjects:@"年龄",@"体重",@"姓名", nil nil];
- NSDictionary *dic1=[[NSDictionary alloc]initWithObjects:array forKeys:array2];
- 3.用其他字典初始化
- NSDictionary *dic=[[NSDictionary alloc]initWithDictionary:dic1];
- 4.用网络URL初始化
- NSDictionary *dic5=[NSDictionary alloc]initWithContentsOfURL:<#(NSURL *)#>
- 2.通过key来找到对应的值;
- NSLog(@"%@",[dic objectForKey:@"key"]);
- 3.创建动态字典 用法和普通字典一样;
- NSMutableDictionary *dic3=[NSMutableDictionary dictionaryWithCapacity:0];
- 4.为动态字典添加内容;
- [dic2 setObject:@"180" forKey:@"身高"];
- [dic2 setObject:@"56" forKey:@"weight"];
- [dic2 setObject:@"13" forKey:@"age"];
- NSNumber 数值对象
- 1.初始化数值对象 用一个基础数据类型初始化,如整形,浮点,字符都可以;
- NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];
- 2.把数值对象添加到数组中;
- [array addObject:num];
- 3.把nsstring类型转换成值;和把数值类型转换成整形
- int i=1;
- NSString *str=[NSString stringWithFormat:@"%d",i];
- int a=[str intValue];//其他数值形式的也可以类似转换 如float b=[str floatValue];
- UITabBarController的代理函数;
- uitabbarcontroller 中当item很多时会有省略;还可以调整uitabbaritem的排放顺序调整在主页显示的页面;这时会需要tabbarcontroller 的代理类
- 1.当某个viewcontroller被选择时触发的事件;
- 应用:每当页面显示时有些提示信息……..
- -(void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
- {
- NSLog(@"didSelectViewController");
- // NSLog(@"%d",tabBarController.tabBarItem.tag);
- NSLog(@"%d",viewController.tabBarItem.tag);
- }
- 2.在某个viewcontroller选择时触发的事件
- -(BOOL)tabBarController:(UITabBarController *)tabBarController shouldSelectViewController:(UIViewController *)viewController
- {
- NSLog(@"shouldSelectViewController:");
- NSLog(@"%d",viewController.tabBarItem.tag);
- return YES;
- }
- 3 将要结束用户自定义item时;既点击导航栏中的done时调用用法:可以提示用户确实要这样更改吗。
- -(void)tabBarController:(UITabBarController *)tabBarController willEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
- {
- NSLog(@"willEndCustomizingViewControllers");
- //NSLog(@"%d",viewControllers)
- NSLog(@"%d",changed);
- }
- 4.将开始进行用户自定义item时调用;既点击了导航栏中的edit时调用此函数;
- -(void)tabBarController:(UITabBarController *)tabBarController willBeginCustomizingViewControllers:(NSArray *)viewControllers
- {
- }
- 5.结束用户自定义item后调用既单击了done ;用法可以纪录此时的新的item用于永久性更改,下次运行此程序保持这个状态;
- -(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
- {
- NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];
- for (UIViewController *vc in viewControllers) {
- NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];
- [array addObject:num];
- // NSLog(@"%d",vc.tabBarItem.tag);
- //把nsstring转换成数据类型
- // int i=1;
- // NSString *str=[NSString stringWithFormat:@"%d",i];
- // int a=[str intValue];
- }
- NSUserDefaults *userdefault=[NSUserDefaults standardUserDefaults];
- [userdefault setObject:array forKey:@"num"];
- NSLog(@"didEndCustomizingViewController");
- }
- 如何保存用户更改的uitabbaritem位置?
- 1.在用户用编辑item顺序后执行done,这时在调用的didEndCustomizingViewControllers 函数传递的参数viewControllers 纪录了此时新的排列顺序;这时要用本地存储记下这个顺序;注意因为每个viewcontroller在初始化时设置了自己的tag值,所以只记下tag值就可以找到对应的viewcontroller
- -(void)tabBarController:(UITabBarController *)tabBarController didEndCustomizingViewControllers:(NSArray *)viewControllers changed:(BOOL)changed
- {
- 初始化可变数组用于存储tag值
- NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];
- 遍历新设置的控制器顺序;并把tag值按顺序存储到可变数组中
- for (UIViewController *vc in viewControllers) {
- NSNumber *num=[NSNumber numberWithInt:vc.tabBarItem.tag ];
- [array addObject:num];
- } 定义本地存储对象;
- NSUserDefaults *userdefault=[NSUserDefaults standardUserDefaults];
- 把可辨数组存入到本地存储中
- [userdefault setObject:array forKey:@"num"];
- NSLog(@"didEndCustomizingViewController");
- }
- 2. 在加载函数中可以先判断本地存储是否有数据;如果没有就是用户还未设置过,那item顺序要按加载顺序排列;如果非空的话就把本地存储的数据的赋值给viewcontrollers;
- NSMutableArray *array=[NSMutableArray arrayWithCapacity:0];
- for (int i=0; i<6; i++) {
- UIViewController *vc=[[UIViewController alloc]init];
- [array addObject:vc];
- UITabBarItem *item=[[UITabBarItem alloc]initWithTitle:[NSString stringWithFormat:@"vc%d",i+1] image:[UIImage imageNamed:@"1.png"] tag:i];
- vc.tabBarItem=item;
- [item release];
- [vc release];
- }
- UITabBarController *tabbar=[[UITabBarController alloc]init];
- tabbar.viewControllers=array;
- 注:没有alloc的对象一定不要release;如button一般创建不用alloc;注意注注意
- 9.14 周五
- 实现键盘弹起时页面也跟着弹起键盘的高度
- 1.基本思想:
- 1. 创建两个通知用于监听键盘弹起和落下
- //面试重点:通知;通知中心是管理通知的;
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
- //监听者一般是哪个控件创建谁监听器就谁监听
- //name是监听的信号;
- //selecto监听到信号后触发的事件;
- //object 指监听某个对象,一般是全局监听所以是nil
- [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
- 2.在监听键盘弹起的事件中记下键盘高度,然后把view提高键盘高度
- -(void)keyboardWillShow:(NSNotification *)noti
- { 键盘弹起时触发的事件;
- //获得键盘的高度, 将传递过来的消息信息纪录达字典;从字典中找到关键字为键盘框架的数据让然后把它转换成cgrect类型读取它的高度
- NSDictionary *dic=[noti userInfo];
- CGRect rect=[[dic objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];
- float h=rect.size.height;
- NSLog(@"%f",h);
- //设置动画 使键盘高度提高;
- [UIView beginAnimations:nil context:nil];
- [UIView setAnimationDuration:0.25];
- self.view.frame=CGRectMake(0, 20-h, 320, 460);
- //注意是20减去键盘的高度;因为view是加载在window上的它的frame是相对于window的。这就要注意了,a控件添加到b控件上a的frame就是相对于b的frame
- [UIView commitAnimations];
- }
- 3.收起键盘 键盘弹出和收起是随文本编辑开始和退出自动弹出和收起,所以要想让文本框退出编辑模式必须有个事件触发,而在touchesbegan的系统函数中只要鼠标点击就能触发,所以一般在这个里面让textfield退出编辑模式;
- [ resignFirstResponder]; 就是textfield退出编辑模式的函数;
- -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
- {
- UITextField * textfield=(UITextField *)[self.view viewWithTag:100];
- [textfield resignFirstResponder];
- }
- 4.不使用键盘时让view以动画跳下来;
- -(void)keyboardWillHide:(NSNotification *)noti
- {
- [UIView beginAnimations:nil context:nil];
- [UIView setAnimationDuration:0.20];
- self.view.frame=CGRectMake(0, 20, 320, 460);
- [UIView commitAnimations];
- }
- 弹出消息框
- 注:弹出消息框所用代理为UIAlertViewDelegate 这是提示框, 这个不用添加到窗口的!!!
- 1.创建消息框对象
- UIAlertView *alertview=[[UIAlertView alloc]initWithTitle:@"error" message:@"帐号错误" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"确定", nil nil];
- 让消息框展示出来
- [alertview show];//这是系统自动调用的函数
- [alertview release];
- 2.在消息框对象的代理函数中执行操作 消息框有四个代理函数,点击函数最常用
- -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
- {
- 通过传递过来的button序号知道那个button进行了操作执行相应的命令
- //按钮从左边计数;
- if (buttonIndex==0) {
- self.view.backgroundColor=[UIColor yellowColor];
- }
- else
- self.view.backgroundColor=[UIColor brownColor];
- }
- 从相册和相机获取图片
- 思想: 1.创建获取图片按钮和接收图像的的视图控件
- imageview =[[UIImageView alloc]initWithFrame:CGRectMake(100, 80, 100, 100)];
- [self.view addSubview:imageview];
- UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame=CGRectMake(100, 190, 120, 20);
- [button addTarget:self action:@selector(buttonClick) forControlEvents:UIControlEventTouchUpInside];
- [self.view addSubview:button];
- //提示框
- 2.在button触发的事件中生成UIActionSheet对象去选择从哪里获取图片
- -(void)buttonClick
- {
- UIActionSheet *as=[[UIActionSheet alloc]initWithTitle:@"选择图片来源" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"相机" otherButtonTitles:@"相册", nil nil];
- //可以生成多个按钮
- [as showInView:self.view];
- 展示这个动作页面;
- [as release];
- }
- 3.通过调用UIActionSheet的代理函数获取图片;所以头文件必须声明他的代理一般用到是点击函数,通过传递按钮的排列序号知道那个按钮被点击触发相应的事件
- -(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
- {
- if (buttonIndex==2) {
- return;
- }
- // 取消按钮序号是2,所以如果指针是2,表明触发了取消,注意对应的序号要和创建时一致;
- UIImagePickerController *pc=[[UIImagePickerController alloc]init];
- //创建图片获取控制器;根据点击按钮不同从不同的资源获取图片;
- // 防止触发虚拟机不能完成的事件发生崩溃,提前做一下判断,如果不是虚拟机就执行操作;
- if(buttonIndex==0 && TARGET_IPHONE_SIMULATOR)
- {
- [pc release];
- return;
- }
- if(buttonIndex==0){
- pc.sourceType=UIImagePickerControllerSourceTypeCamera;
- }
- else if(buttonIndex==1)
- {
- //pc.sourceType=UIImagePickerControllerSourceTypePhotoLibrary;
- pc.sourceType=UIImagePickerControllerSourceTypeSavedPhotosAlbum;
- //区分这两个属性的不同第一个
- }
- pc.delegate=self;
- //这个对象设置代理需要遵从两个协议UIImagePickerControllerDelegate, 和导航控制协议 因为图片控制器也是个导航控制器UINavigationControllerDelegate
- //把控制器交给图像资源获取控制器
- [self presentModalViewController:pc animated:YES];
- [pc release];
- }
- 在系统中的图片获取器中点击按钮可以触发的事件
- //点击图片调用的函数
- -(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingImage:(UIImage *)image editingInfo:(NSDictionary *)editingInfo
- {
- imageview.image=image;
- [picker dismissModalViewControllerAnimated:YES];
- }
- //点击取消触发的事件
- -(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
- {
- [picker dismissModalViewControllerAnimated:YES];
- }
- 9.17 第十周 周一
- UIScrollView 滚动视图
- 注:苹果的内存复用机制:视图很大超过了屏幕显示的范围,在显示的只是屏幕上的内容,为了减少内存使用把不现实的那用从内存中去除;
- 1.滚动视图的初始化
- UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- frame:是滚屏在视图上占用的大小;
- 2.给滚动视图添加控件时,如果控件有事件响应的话,系统设置了一个定时器,如果在限定事件内拖动的话,该控件就失去了响应机会,拖动视图也会跟着拖动;
- UIButton *button=[UIButton buttonWithType:UIButtonTypeRoundedRect];
- button.frame=CGRectMake(100, 100, 100, 50);
- //注意按钮的响应时间,如果按钮在没响应前滑动,此时就相当于视图滑动
- 3.设置滚屏的大小,这个属性很重要 显示的是内容的大小 体现了滚动视图的经典
- sv.contentSize= CGSizeMake(320, 460*2);
- 滚屏的真实大小;
- 4.初始位置设置 //偏移量 是一个点 有x值与 y值
- sv.contentOffset=CGPointMake(90, 90); // contentOffset.x 与 contentOffset。y
- //注:x,y是屏幕的框架原点相对于滚屏的原点的位置;当滚屏超出手机框架时这两个值比为正数;
- 5.竖直和水平滚动条是否显示;默认时显示滚动条//这条很重要
- sv.showsVerticalScrollIndicator=NO;//是否显示竖直方向的滚动条
- sv.showsHorizontalScrollIndicator=NO;//是否显示水平方向的滚动条,默认是显示的 ,不显示设置成NO
- 6.反弹效果的设置;设为yes后可以反弹;设为no就不能反弹;
- sv.bounces=YES;
- //总是反弹,即使大小和边框一样也可以有反弹效果;
- sv.alwaysBounceHorizontal=YES;
- sv.alwaysBounceVertical=YES;
- 7.设置为不可滚动;即使大于框架
- sv.scrollEnabled=NO;
- //添加图片视图,视图用addSubview的方法来添加,把图片添加到滚动视图上面
- [sv addSubview:imageView];
- //再把滚动视图添加到 总试图上面
- [self.view addSubview:sv ];
- //设置显示内容尺寸
- sv.contentSize=CGSizeMake(260*4, 400);
- //设置按照页码滚动
- sv.pagingEnabled=YES;//这样设置是保证 一页一页的显示出来 不可能只显示一半,用户不喜欢看到这个效果;
- //设置边缘弹动效果//主要是给用户感觉的
- sv.bounces=YES;//可以弹动的 也可以sv.bounces=NO;此时到边缘就不能滚动,不会出现一些不该出现的空白
- //改变滚动条偏移量 当前显示内容的偏移量;
- sv.contentOffset=CGPointMake(100, 0);
- 使用:代理的三部曲,每一个协议方法都是这么来做的
- 遵守协议(什么控制器遵守什么协议 写在尖括号里面)
- 委托代理(A.delegate=self)
- 实现方法(完成的方法);
- 8.滚动条的代理函数
- 1.当屏幕滚动时调用的函数
- -(void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- NSLog(@"%f %f",scrollView.contentOffset.x,scrollView.contentOffset.y);
- }
- 2. 将要开始拖动时调用
- -(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
- 3.滚动结束后调用 手指抬起开始减速的瞬间 开始回调 //用这个方法来实现拖动的时候 页的对应
- -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
- {
- NSLog(@"endDrag");
- }
- 4.滚屏结束时调用
- -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView
- 5.滚屏将开始减速时调用
- -(void)scrollViewWillBeginDecelerating:(UIScrollView *)scrollView
- 用一个类来封装一下,封装就是派生出一个类,写自己的类,
- 9.用滚动视图来显示图片的缩放;注:滚屏只能执行单一功呢,要么让他做缩放功呢,要么让他实现滚屏;
- 1.创建滚动视图
- super viewDidLoad];
- UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- 2.设置最大最小缩放
- //缩放和滑动止只能选一
- sv.maximumZoomScale=5.0;
- sv.minimumZoomScale=0.5;
- 3. 创建视图控件,然后添加到滚屏中。
- imageview=[[UIImageView alloc]initWithImage:[UIImage imageNamed:[NSString stringWithFormat:@"5.png"]]];
- imageview.frame=CGRectMake(100, 100, 50, 50);
- [sv addSubview:imageview];
- [imageview release];
- 4.用到滚屏的函数要给它设置代理
- sv.delegate=self;
- 处理用户响应事件,需要重载那三个触摸的方法,开始,触摸到,末尾,
- 5.在滚屏的放大缩小函数中写实现功能
- -(UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView
- {
- static int i=0;
- if (scrollView!=myScrollView) {
- return [scrollView.subviews objectAtIndex:i];
- i++;
- }
- else
- return NULL;
- }
- 封装一个类达到的效果 简化代码,很有好处
- 10.运用滚动屏实现广告条展示;
- 设计思想:滚动广告起始和最后广告条实现不间断的无限循环;所以要多家一个视图,最后一个视图和第一个一样,这样可以保证不间断;
- UIScrollView *sv=[[UIScrollView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
- sv.contentSize=CGSizeMake(320, 200*9);
- sv.scrollEnabled=NO;
- //视图的可滚动属性设为no不可滚动;
- sv.tag=100;
- [self.view addSubview:sv];
- sv.showsVerticalScrollIndicator=NO;
- for (int i=0; i<9; i++) {
- UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, i*200, 320, 200)];
- imageview.image=[UIImage imageNamed:[NSString stringWithFormat:@"17_%d.jpg",i]];
- [sv addSubview:imageview];
- [imageview release];
- }
- //创建计时器来控制图片定时更替
- NSTimer *timer=[NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(timer:) userInfo:nil repeats:YES];
- }
- -(void)timer:(NSTimer *)timer
- {
- UIScrollView *sv=(UIScrollView *)[self.view viewWithTag:100];
- //当滚屏滚到最后一幅图时,让滚屏从头开始
- if(sv.contentOffset.y==200*8)//偏移量contentOffset,画布向左偏移是正的,向右偏移是负的,这是原则;
- {
- sv.contentOffset=CGPointMake(0, 0);
- }
- [sv setContentOffset:CGPointMake(0, sv.contentOffset.y+200) animated:YES];
- }
- UIPageControl 分页显示 页面控制器
- 1.初始化对象
- UIPageControl *pc=[[UIPageControl alloc]initWithFrame:CGRectMake(0, 440, 80, 20)];
- 2.设置页数
- pc.numberOfPages=4;//设置小点的个数
- pc.tag=100;
- 3.为分页点添加事件
- [pc addTarget:self action:@selector(pc:) forControlEvents:UIControlEventTouchUpInside];
- 4.在滑动页面时,为每页定位 开发者无法判断用户判断到哪一页,所以只有委托UIScrollView的方法
- 使用这个函数之前要实现UIScrollViewDelegate代理
- -(void)scrollViewDidScroll:(UIScrollView *)scrollView
- {
- UIPageControl *pc=(UIPageControl *)[self.view viewWithTag:100];
- pc.currentPage=scrollView.contentOffset.x/320;//改变原点的颜色
- }
- 5.注意要想给滚屏分页,除了创建分页对象还要让滚屏设置分页属性
- sv.pagingEnabled=YES;
- //遵从UIScrollViewDelegate协议,实现UIScrollViewDelegate里面的方法
- -(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
- {//当页面开始减速的瞬间回调函数
- int pageNumber=scrollView.contentOffset.x/320;//contentoffset 内容的偏移量
- myPageontrol.currentPage=pageNumber;
- }
- 9.18周二
- 必须实现的
- @required
- - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
- // Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier:
- // Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls)
- - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
- UITableView 表视图
- 1.初始化表格控件
- UITableView * tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460-44) style:UITableViewStyleGrouped];
- tableview.tag=100;
- 2.给表格控件添加代理。注意它有两个代理//必须是两个代理
- tableview.delegate=self;
- tableview.dataSource=self;
- 3.表格控件的代理函数
- //delegate 行数和单元格函数必须实现。否则程序无法运行;
- 1.行数
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return dataarray.count;//有的时候每一行都是一样的
- }
- 1,复用机制;要重点了解;
- 2,只有一列,两列的话就是有两个tableView;
- 3,有数据源对象,代理对象,tableView本身的对象;
- 2.cell单元格//多少个格子要完成;每个格子里面是什么东西; 一定要完成这两个协议,否则UITableView会崩溃
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- 为每个单元个加一个标志,便于取得//每个格子的标题
- NSString *strID=@"ID";//代表的是某种类型的cell;字不是写的一样,但都是一种
- 从表格对象中得到移出屏幕得对象;
- UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:strID];//用队列的方式去找cell
- if (cell==nil) {
- //空值的情况,重现创建一个
- //顶多分配20个,然后不会再去分配了。然后反复的使用,0到10 是可以被替换的,不是一下子分配一万个,内存考虑
- cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:strID]autorelease];
- // UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(10, 10, 40, 20)];
- // label.text=[NSString stringWithFormat:@"%d",indexPath.row];
- // [cell addSubview:label];
- // label.tag=100;
- }
- // indexPath.row; 行数
- indexPath.section 段数 section代表的是组数,分组的时候就出来了
- // UILabel *label=(UILabel *)[self.view viewWithTag:100];
- // label.text=[dataarray objectAtIndex: indexPath.row];
- //添加图片
- cell.imageView.image=[UIImage imageNamed:@"5.png"];
- //添加细节名称表明可以展开cell
- cell.detailTextLabel.text=@"open";
- //表示有更多内容的展示风格//表格栏的尖尖 一半的中括号
- cell.accessoryType=UITableViewCellAccessoryDisclosureIndicator;
- //选择时变色设置
- cell.selectionStyle=UITableViewCellSelectionStyleNone;
- // 设置cell文本 从数组中取出来 可以把文字统一放到数组里面去
- cell.textLabel.text = [dataarray objectAtIndex:indexPath.row];//主标题
- //添加细节名称表明可以展开cell 副标题
- cell.detailTextLabel.text=@"open";
- return cell;
- }
- 删除或添加cell 先删除数据,再添加数据源 ,分为两步, 因为它有两个代理 ,其中一个就是数据源代理
- 3. 段数
- -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return 3;
- }
- 4.行高
- -(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- // 可以设置每个行行高
- // if (indexPath.row==1) {
- // return 20;
- // }
- return 50;
- }
- 5.段头标题
- -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
- {
- return @"abc";
- }
- 6.段尾标题
- -(NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
- {
- return @"tial";
- }
- 7.删除和添加
- 设置每个单元格的可编辑属性默认是yes所以当让它处于编辑模式时这个函数可以不写
- //设置元素的可编辑性
- -(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
- {
- return YES;
- }
- //更改单元格的编辑属性;可以设置为删除和插入
- - (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath{
- return UITableViewCellEditingStyleInsert;//插入模式;
- }
- //可以滑动弹出删除键删除,也可以设置编辑按钮,点击编辑按钮删除
- -(void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
- {
- 删除时既要从屏幕上删除,又要从数组中删除,
- [dataarray removeObjectAtIndex:indexPath.row];
- [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationRight];
- }
- 注意:如果表格分很多段,就必须分段操作;
- 1.分几段,就创建几个数组,以防删除不同段内容相互影响,导致崩溃;
- 2.在给每段单元格添加标题时也要分段添加;返回行数时也要按段来返回数组的行数;
- 3.在删除单元格时要根据段不同删除不同的数组元素;
- //删除按钮改名为
- -(NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- return @"2334";
- }
- 7.为选择cell添加操作;下面操作为点击就会跳到新页面;作为选择cell操作的时候来用的
- -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UIViewController *vc=[[UIViewController alloc]init];
- vc.title=[NSString stringWithFormat:@"%d",indexPath.row];
- [self.navigationController pushViewController:vc animated:YES];//push之后再去加载;
- }
- 8.//didSelectRowAtIndexPath作为cell选择操作的时候用
- - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UISearchBar * search = (UISearchBar *)[self.view viewWithTag:102];
- //是否是第一响应事件
- if ([search isFirstResponder]) {
- //若果是的画 就响应
- [search resignFirstResponder];
- }
- }
- 9.为表格添加索引,点击就会跳到对应位置,分段的话每个标记代表一段
- -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
- {
- return [NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];
- }
- 10.移动某个cell
- -(BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
- {
- return YES;
- }
- -(void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
- {
- //注意从前往后和从后往前移动不同
- NSString *str=[dataarray objectAtIndex:sourceIndexPath.row];
- // NSString *str1=[dataarray objectAtIndex:destinationIndexPath.row];
- if(sourceIndexPath.row<destinationIndexPath.row){
- [ dataarray insertObject:str atIndex:destinationIndexPath.row+1 ] ;
- [dataarray removeObjectAtIndex:sourceIndexPath.row];
- }
- else
- {
- [dataarray insertObject:str atIndex:destinationIndexPath.row];
- [dataarray removeObjectAtIndex:sourceIndexPath.row+1];
- }
- }
- 注意有导航条时table的高要减掉导航条的高;
- //@required里面的方法是必须要实现的;@optional里面的方法可以实现也可以不实现
- @interface VC01 : UIViewController <UITableViewDelegate, UITableViewDataSource>
- //UITableView实现不了的,就用代理,让别人帮他实现,实现里面需要的方法
- 9.19 周二
- 搜索条一般搜索条
- -(void)viewDidLoad
- {
- [super viewDidLoad];
- dataArray=[[NSArray alloc]initWithObjects:@"dwew",@"dfas",@"aads",@"we", nil nil];
- 注:在搜索设置时数组创建一定要用alloc;而且release 要在最后的dealloc中;因为数组用于更新数据,不断的使用如果不用alloc创建可能会被释放导致数组不可用;
- _tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460)];
- _tableview.delegate=self;
- _tableview.dataSource=self;
- 注:写tableview 的协议;
- [self.view addSubview:_tableview];
- //创建搜索条
- UISearchBar *search=[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 88)];
- search.delegate=self;
- 注:注意添加uisearchbar的协议;
- //添加搜索栏
- mSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 320, 44)];
- [mSearchBar setTag:102];
- _mTableView.tableHeaderView = mSearchBar;
- search.showsScopeBar=YES;
- search.scopeButtonTitles=[NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];
- 注:添加范围条;两个函数必须连用;要对其添加事件要在下面函数中添加,这个事件是在点击button时触发
- -(void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
- search.showsCancelButton=YES;
- 注:添加取消键
- search.showsSearchResultsButton=YES;
- 注:设置搜索键 出发事件要和下面的函数连用 一般用于撤销键盘实现搜索功能;
- -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
- 注:将搜索条添加到tableview中;
- _tableview.tableHeaderView=search;
- }
- // 添加取消按钮,点击取消按钮时触发;
- -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
- {
- [searchBar resignFirstResponder];
- searchBar.text=@"";
- }
- // 如果设置搜索列表键为真,将添加了搜索列表键到搜索列表的后面,点击时触这个事件;
- -(void)searchBarResultsListButtonClicked:(UISearchBar *)searchBar{
- searchBar.text=@"resultslistbutton";
- }
- //点击键盘上的搜索键时触发;
- -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
- {
- [self searchBar:searchBar textDidChange:searchBar.text];
- }
- //当添加了范围界定条时点击上面的按钮触发
- -(void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope
- {
- if (selectedScope==0) {
- searchBar.text=@"a";
- }
- else if(selectedScope==1){
- searchBar.text=@"b";
- }
- else
- searchBar.text=@"c";
- [self searchBar:searchBar textDidChange:searchBar.text];
- //调用自己的函数;对数据进行搜索;从此也得知,非键盘输入的数据要搜索必须通过调用搜索函数出发,或者在键盘状态加入非键盘输入的数据;
- }
- //返回表格的行数;根据是否是搜索状态还非搜索状态反会不同的数据
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- if (isSearch==YES) {
- return searchArray.count;
- }
- else
- return dataArray.count;
- }
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];
- if (cell==nil) {
- cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"]autorelease];
- }
- if (isSearch==YES) {
- NSLog(@"%@",searchArray);
- cell.textLabel.text=[searchArray objectAtIndex:indexPath.row];
- }
- else{
- cell.textLabel.text=[dataArray objectAtIndex:indexPath.row];
- }
- return cell;
- }
- //搜索条中的内容改变时调用;但有个问题就是一旦开始搜索取消后原内容不显示因为这个函数只有搜索条中输入值时才调用;所以搜索取消不显示原有数据;但是如果在结束编辑中调用此函数就不会出现此情况;
- 但是此时如果有取消键的话又必须在取消键中添加内容让取消后清空搜索框并加载原又数据;所以下面的三个函数是联系起来的
- -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
- {
- if (searchBar.text==nil||[searchBar.text isEqualToString:@""]) {
- isSearch=NO;
- [_tableview reloadData];//自动刷新, 自动刷新数据
- }
- NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF contains [cd] %@",searchBar.text];
- self.searchArray=[dataArray filteredArrayUsingPredicate:predicate];
- isSearch=YES;
- [_tableview reloadData];
- }
- -(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
- [self searchBar:searchBar textDidChange:searchBar.text];
- }
- -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar
- { searchBar.text=@"";
- isSearch=NO;
- [_tableview reloadData];
- [searchBar resignFirstResponder];
- }
- 运用搜索控制器来实现搜索功能
- -(void)viewDidLoad
- {
- dataarray=[[NSArray alloc]initWithObjects:@"da",@"dee",@"ded",@"rtt", @"esdf",@"effy",@"qqo",@"ett",@"sdfa",@"dfg",nil];
- 注:创建搜索数组,数组必须用alloc初始化而且不能被release;
- tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
- tableview.delegate=self;
- tableview.dataSource=self;
- tableview.tag=100;
- 注:要为tableview添加tag属性便于知道搜索状态应为处于搜索状态时搜索控制器就会覆盖住表格框;所以通过判断此时是的tableview是那个可以知道更新那个数组数据;
- [self.view addSubview:tableview];
- [tableview release];
- UISearchBar *searchbar=[[UISearchBar alloc]initWithFrame:CGRectMake(0, 0, 320, 44)];
- tableview.tableHeaderView=searchbar;
- 注:创建搜索展示控制器 把导航条添加进去;把文本控制设置为本类;
- searchdisplay=[[UISearchDisplayController alloc]initWithSearchBar:searchbar contentsController:self];
- 注:设置代理,和搜索资源搜索代理;
- searchdisplay.delegate=self;
- searchdisplay.searchResultsDataSource=self;
- searchdisplay.searchResultsDelegate=self;
- 注意:此时搜索控制器不用释放,因为这个搜索器需要不断被调用;
- [searchbar release];
- }
- 根据此时那个tableview被使用返回数据;
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- if (tableView.tag==100) {
- return dataarray.count;
- }
- return searcharray.count;
- }
- //设置单元格;
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];
- if (cell==nil) {
- cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];
- }
- if (tableView.tag==100) {
- cell.textLabel.text=(NSString *)[dataarray objectAtIndex:indexPath.row];
- }
- else
- cell.textLabel.text=(NSString *)[searcharray objectAtIndex:indexPath.row];
- return cell;
- }
- -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return 3;
- }
- //更新数据前对数据进行过滤;得到过滤的数据;此函数是个实时监控函数;
- -(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString{
- NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF contains [cd] %@",searchString];
- self.searcharray=(NSArray *)[dataarray filteredArrayUsingPredicate:predicate];
- NSLog(@"%@",searcharray);
- return YES;
- }
- //返回tableview中和对应段指针相对应的section的title;相当于为每段设置了一个名字
- -(NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
- {
- return [NSArray arrayWithObjects:UITableViewIndexSearch,@"a",@"b",@"c",nil];
- //注意这里添加了一个搜索,所以搜索指针对应发生改变;在下面的函数返回时要注意
- }
- //返回和title和index一致的section
- -(NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
- {
- if (index==0) {
- [tableView setContentOffset:CGPointMake(0, 0)];
- }
- return index-1;
- }
- //设置section的头标题;
- -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
- {
- return [NSString stringWithFormat:@"%d",section];
- }
- 注意:有些对象没有被释放要写dealloc函数;
- 设置控件的收起和放下
- (void)viewDidLoad
- {
- [super viewDidLoad];
- array=[[NSArray alloc]initWithObjects:@"小红",@"小梅",@"小李", nil nil];
- tableview=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320, 460) style:UITableViewStylePlain];
- tableview.delegate=self;
- tableview.dataSource=self;
- tableview.sectionHeaderHeight=30;
- //设置tableview的section头标题的高;便于以后添加控件和控件大小相适应
- [self.view addSubview:tableview];
- [tableview release];
- p[0]=1;//p是有两个元素的整形数组做为开关;如果设置几段需要几个开关,就让数组元素个数是几
- p[1]=1;
- }
- //根据数组元素的值确定段是打开还是收起;
- //简称设置行数
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- if (p[section]==0) {
- return 0;
- }
- return array.count;//直接返回
- }
- //设置组数
- -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- {
- return 2;
- }
- //创建表格单元格
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"ID"];
- if (cell==nil) {
- cell=[[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"]autorelease];
- }
- cell.textLabel.text=[array objectAtIndex:indexPath.row];
- return cell;
- }
- //为表格的段头添加view让此view加载label和button,并为button添加事件用于控制开关的打开和关闭;既置0和置1;
- -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
- {
- UIView *view=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 30)];
- view.backgroundColor=[UIColor blueColor];
- UILabel *label=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 80, 30)];
- label.backgroundColor=[UIColor clearColor];
- if (section==0) {
- label.text=@"我的好友";
- }
- else
- label.text=@"黑名单";
- [view addSubview:label];
- UIButton *button=[UIButton buttonWithType:UIButtonTypeCustom];
- button.tag=section;
- //注意添加button的tag用于鉴别是哪个button;
- button.frame=CGRectMake(0, 0, 320, 30);
- [button addTarget:self action:@selector(buttonclick:) forControlEvents:UIControlEventTouchUpInside];
- [view addSubview:button];
- return view;
- }
- //button事件用于控制开关状态;
- -(void)buttonclick:(UIButton *)sender
- {
- if (p[sender.tag]==0) {
- p[sender.tag]=1;
- }
- else
- p[sender.tag]=0;
- [tableview reloadSections:[NSIndexSet indexSetWithIndex:sender.tag] withRowAnimation:UITableViewRowAnimationFade];
- //重新加载section根据button的不同来决定加载那个section 之 所以可以这样适应为button。tag是根据section设置的;此时加载section需要的数据是nsindexset类型搜一要把button的tag转换成此类型;
- }
- 为解决问题:怎么让section头宽度变大?
- 解决方法:设置tableview的section的头高 设置代码为:tableview.sectionHeaderHeight=30;
- cell的层次 view在cell上contentview又在view上其他控件又加在了content view上
- cell的contentView cell上面的内容视图
- 9.20周四
- 和xib文件连用创建表格
- 创建表格框,然后创建xib文件,并把xib文件中的默认视图删除;添加tableviewcell 可以在里面添加其他控件;
- -(void)viewDidLoad
- { [super viewDidLoad];
- UITableView * tableView=[[UITableView alloc]initWithFrame:CGRectMake(0, 0, 320,460) style:UITableViewStylePlain];
- tableView.delegate=self;
- tableView.dataSource=self;
- [self.view addSubview:tableView];
- [tableView release];
- }
- //设置行数
- -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
- {
- return 20;
- }/
- //在创建cell的函数中将xib创建的文件添加到tableview中;
- -(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- UITableViewCell * cell=[tableView dequeueReusableCellWithIdentifier:indexPath.row%2==0?@"ID":@"ID2"];
- if(cell==nil){
- //cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];
- cell=[[[NSBundle mainBundle] loadNibNamed:indexPath.row%2==0?@"MYcell":@"MYCell2" owner:self options:nil]objectAtIndex:0];
- //和xib中的文件绑定;
- }
- //设置cell颜色要注意是设置contentview的颜色应为它覆盖在cell上;
- // cell.contentView.backgroundColor=[UIColor redColor]; //cell也是个view 上有contentview 其实label也是加再contentview上
- return cell;
- }
- //自定义的cell注意在创建自定义cell类在写继承时是继承UITableViewCell;
- 创建cell类后在初始化文件中写上初始化的cell特性,既需要更改什么属性,加在其他控件;
- - (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
- {
- self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
- if (self) {
- self.myLabel=[[UILabel alloc]initWithFrame:CGRectMake(0, 0, 320, 40)];
- myLabel.textAlignment=UITextAlignmentCenter;
- myLabel.backgroundColor=[UIColor greenColor];
- [self addSubview:myLabel];
- [myLabel release];
- }
- return self;
- }
- //在控制器中创建cell时创建自定义cell
- -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
- {
- //复用池,每次显示满屏dequeueReusableCellWithIdentifier方法 复用机制
- CustomCell *cell=(CustomCell *)[tableView dequeueReusableCellWithIdentifier:@"ID"];
- if (cell==nil) {
- cell=[[CustomCell alloc]initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:@"ID"];
- }
- //加载文本从资源文件中获取;
- 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];
- cell.myLabel.text=str;
- return cell;
- }
- 9.24 周一 第十一周(网络
- 在使用不同的网络协议传输时都要先加入协议文件;如果用到他们的对应函数时要写协议,设置代理
- 1.json 格式网络传输
- 在网络中传输请求时用的时是字符串。他们用{}[]链接起来;其中{}表示字典;[]表示数组;解析时只要分清层次需要从哪取数据就用相应的数组或对象取数据;
- 1.网络数据解析
- //{ "title":"harry pottery", "price":"999$"}
- NSString *json=@"{\"title\":\"harry pottery\",\"price\":\"99999\"}";
- //双引号里面不能在有双引号,所以加双引号前要加反斜杠;
- NSDictionary *dic=[json JSONValue];
- NSString *str=[dic objectForKey:@"title"];
- NSLog(@"%@",str);
- //[{"a","b","c"}]
- json=@"[\" a\", \"b\",\"c\"]";
- NSArray *array=[json JSONValue];
- for (NSString *s in array) {
- NSLog(@"%@",s);
- }
- /* { "books":[
- {
- "title": "harry1"
- },
- {
- "title":"harry2"
- }
- ]
- "num":"7"
- }
- */
- /*
- }
- */
- json=@"{\"key1\":[{\"key2\":\"value2\"},\"value3\" ]}";
- NSDictionary *dic1=[json JSONValue];
- array=[dic1 objectForKey:@"key1"];
- dic=[array objectAtIndex:0];
- NSString *st=[dic objectForKey:@"key2"];
- NSLog(@"%@",st );
- 2 .SBJson网络传输数据:要加入第三方协议:SBJson 冰岛入SBJson.h头文件
- NSData *data=[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://localhost/1.gif"]];
- UIImage *image=[UIImage imageWithData:data];
- UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
- imageview.image=image;
- [self.view addSubview:imageview];
- 3.SDWebImage 网络传输
- //使用SDWebImage 传输数据,而且它是个自带缓存打开过,再打开时还存在;
- 在使用图片按钮传输时要引人头文件
- #import "UIImageView+WebCache.h"
- #import "UIButton+WebCache.h"
- NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];
- UIImageView *image =[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
- [image setImageWithURL:url];
- [self.view addSubview:image];
- [image release];
- 4.ASIHTTPRequest网络传输???????
- 首先要导人四个库文件libz.1.2.5.dylib,CFNetwork.framework,
- SystemConfiguration.framework,MobileCoreServices.framework
- 引人头文件 #import "ASIHTTPRequest.h" 同时要添加ASIHTTPRequest.h协议;设置代理
- NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];
- //使ASIHTTPRequest 传输数据;注意这个需要加第三方协议
- ASIHTTPRequest *request=[ASIHTTPRequest requestWithURL:url];
- request.delegate=self;
- [request startSynchronous];
- //开始同步
- [UIApplication sharedApplication].networkActivityIndicatorVisible=YES;
- //网络请求,如果为yes,就一直旋转
- -(void)requestFinished:(ASIHTTPRequest *)request
- {
- UIImageView *imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
- imageview.image=[UIImage imageWithData:request.responseData];
- [self.view addSubview:imageview];
- }
- 5.异步传输 这种异步传输需要代理 <NSURLConnectionDataDelegate>
- /异步传输数据:优点:在传输数据没有完成前,可以对网页上的其他东西进行操作;
- [super viewDidLoad];
- NSURL *url=[NSURL URLWithString:@"http://localhost/1.gif"];
- //创建请求
- NSURLRequest *request=[NSURLRequest requestWithURL:url];
- //发送请求
- [NSURLConnection connectionWithRequest:request delegate:self];
- data1=[[NSMutableData alloc]init];
- imageview=[[UIImageView alloc]initWithFrame:CGRectMake(0, 0, 320, 200)];
- [self.view addSubview:imageview];
- }
- //异步传输链接的代理函数:
- //链接响应时调用
- -(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response
- {
- NSLog(@"didreceiveresponse");
- }
- //加载完成时调用
- -(void)connectionDidFinishLoading:(NSURLConnection *)connection
- {
- imageview.image=[UIImage imageWithData:data1];
- NSLog(@"connectiondidFinishload");
- }
- //反复调用不断接收新数据
- -(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
- {
- [data1 appendData:data];
- NSLog(@"didreceivedata");
- }
- //链接发生错误时响应;
- -(void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error
- {
- NSLog(@"error");
- }
- xml
- 首先导人GData 文件, 然后通过在项目头文件中Build Phases中第三个选项中数添加libxml2 文件并将其移动到项目下面, 然后在 BuildSettings中在search paths中在 Header Search Paths 中添加路径/use/include/libxml2 这样就可用xml 读取网络文件了;
- 1.将网络编码文件存入字符串;
- NSString *xmlstr=[NSString stringWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"xml" ofType:@"txt"] encoding:NSUTF8StringEncoding error:nil];
- 2.将字符串转变成GDataXMLDocument 类行的文件;
- 获取文件
- GDataXMLDocument *xmldoc=[[GDataXMLDocument alloc]initWithXMLString:xmlstr options:0 error:nil];
- 3.从文件中获取根元素;
- //获取跟元素
- GDataXMLElement * rootEle=[xmldoc rootElement];
- 4.获取元素的值
- rootEle.stringValue
- 5.获取根元素下面的某项值,用所在位置获取;也可以通过数组把他们全都放到数组,在从数组中获取;
- GDataXMLElement *sysele=(GDataXMLElement *)[rootEle childAtIndex:0];
- GDataXMLElement cityele=[sysele childAtIndex:0];
- NSArray *array=[sysele children];
- 6.获取元素的 XMLString属性值; 获取属性stringValue值 属性名值name
- array =[intel children];
- for (GDataXMLElement * itemele in array) {
- //itemele.attributes 是元素得属性 是个数组;
- for (GDataXMLElement * item in itemele.attributes) {
- //打印元素属性;会将每个属性和值一起打印出来;
- NSLog(@"%@",item.XMLString);
- //打印属性得值
- NSLog(@"%@",item.stringValue);
- //打印属性名字
- NSLog(@"%@",item.name);
- }
- }
- 7.通过元素名获取元素;
- //通过元素名获取元素
- GDataXMLElement *codeele=[[sysele elementsForName:@"areaCode"] objectAtIndex:0];
- 8.通过路径获取获取元素;
- //XPATH 通过路径获取元素 注意通过路径取出的元素因为不知道保函几个元素,所以是数组类行要想取得得用objectindexat 根据位置获取其中得某一个;
- //绝对路径
- GDataXMLElement *cityele=[[xmldoc nodesForXPath:@"root/systemConfig/CityName" error:nil] objectAtIndex:0];
- NSLog(@"%@",cityele.stringValue);
- //通过层次写;
- cityele=[[xmldoc nodesForXPath:@"//CityName" error:nil] objectAtIndex:0];
- NSLog(@"%@",cityele.stringValue);
- //获取在这个层次得所以item
- NSArray *array=[xmldoc nodesForXPath:@"//Item" error:nil];
- //获取某个目录下得item并通过item[i]打印它的元素;注意是从元素标号1开始;
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[1]" error:nil];
- GDataXMLElement *tem =[[xmldoc nodesForXPath:@"//Item" error:nil] o bjectAtIndex:0];
- GDataXMLElement *ele =[tem.attributes objectAtIndex:0];
- //元素得属性指针开始从0位置;
- NSLog(@"%@",ele.stringValue);
- //打印最后一个元素
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[last()]" error:nil];
- //打印某个范围内的元素通过位置号判断
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[position()<3]" error:nil];
- //获取不同节点下的元素
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[position()<3]|// ****/item[2]" error:nil];
- //通过关键字获取值;
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[@key=2]" error:nil];
- array=[xmldoc nodesForXPath:@"//intentionLevel/Item[@key<3]" error:nil];
- 在接收取出来的元素时,一般取出来的是数组,要用数组接,如果是单个元素要用数组的object 0去转换成对象;然后再取其中的属性;