怎么把控件放在表头ios

2016-07-15 12:04:58 u010170540 阅读数 483

实现该效果的关键在于  为tableview设定表头图片的时候  不要直接指定tableviewHeader为imagView  

要把imageView添加到一个UIView (baseView)上面  然后在将tableViewHeader指定为baseView



最后实现下拉缩放 

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    CGPoint offset = scrollView.contentOffset;
    //再下面改变区头图片的frame
    if (offset.y < 0) {
        CGRect rect = self.mg.frame;  
        rect.origin.y = offset.y;
        rect.size.height = 200 - offset.y;
        rect.origin.x = offset.y * (320 / 200) / 2 ;
        rect.size.width = 320 - offset.y * (320 / 200);
        _img.frame = rect;
    }}



2015-05-12 23:57:33 gwjxl 阅读数 1673

 如果使用高版本的xcode6以上,创建一个singleViewApplication项目,然后点击项目修改maininterface中的内容清空,相当于创建了一个EmptyApplication。 

5.window对象

         在一个IOS的应用中,window对象一般只有一个,window对象负责一些系统功能,比如键盘管理,一般不负责具体界面的显示。为了可以在一个应用中切换多个界面,我们不会直接在window放置一些具体的控件、视图(Lable),而应该给window对象设置一个根视图控制器(玻璃),做为第一个显示界面。

6.屏幕的窗口     显示内容的空间大小。

                                      屏幕的大小       分辨率

                                      点(坐标)        像素

iphone3GS          320*480         320*480            3.5寸

iphone4/4s          320*480         640*960            3.5寸

iphone5/5s          320*568         640*1136          4.0寸

Retina屏上1个点 = 2*2个像素

非Retina屏上1个点 = 1个像素

注:

程序中计算位置和大小使用的单位是点,到了具体的硬件上,自动转换相应的分辨率。

坐标系:屏幕的左上角为0,0原点

如果在普通屏幕上1一个点代表1个像素,在高清屏(Retina视网膜)屏幕上,1一个点代表2*2个像素。

7.具体描述屏幕的位置和大小的frame属性

         struct CGRect {

           CGPoint origin;

           CGSize size;

            };

            typedef struct CGRectCGRect;

            structCGPoint {

             CGFloat x;

             CGFloat y;

            };

            typedef struct CGPointCGPoint;

         structCGSize {

             CGFloat width;

             CGFloat height;

            };

            typedef struct CGSizeCGSize;

8.根视图控制器(root view controller)

                   视图 显示数据

                   视图控制器 控制显示什么数据

                   一个界面有一个视图对应一个视图控制器

                   控制台的警告也是指的根视图控制器

                   根:最下面的视图控制器

程序执行顺序:

         main.m->AppDelegate->window.rootViewController->ViewController->View->ViewDidLoad…

9.视图控制器(ViewController)和视图(View)

a.具体的功能

                   视图(View) 就是我们看见的界面

                   视图是UIView类或子类的对象(与VC的关系是组合有关系)

                  

                   视图控制器(ViewController,简称为VC)

                   控制视图如何显示的对象

                   是UIViewController类或子类的对象

总结:一个界面通常就是一个视图控制器,显示部分由属性view来解决,显示的内容由视图控制器来解决。

b.之间关系

         一般情况下,视图控制器默认就拥有一个视图,视图就是视图控制器的小跟班。在创建一个视图控制器对象(VC),此VC就拥有一个视图对象,做为VC的一个属性存在。self.view(组合)。

10.视图与window对象

         window相当于电视机,视图相当于电视节目的元素,小到花花草草在到宇宙万物(当然电视由于屏幕大小,只能看到一部分)。

 

一、viewDidLoad方法

         1.1 是什么

                   是UIViewController类中定义的方法

         1.2 在什么时候调用

                   在VC所控制的界面(View)"第一次"需要显示出来的时候,需要加载VC,等加载VC后,自动调用此方法。

         1.3 干什么

                   在此方法中设置界面的初始显示

         1.4  注意

                   一般此方法的第一会调用父类的方法,目的是让父类中的设置也起作用。

二、控件(Control)

         2.1 什么是控件

         严格来说,凡是UIControl类及子类的对象,才叫控件,控件会触发事件。严格来说UIButton是控件,UILabel不是控件。一般来说,口头上的经常能在界面上看见的东西,都叫控件。

         2.2 控件(UIControl)和视图(View)的关系

                   控件就是视图的一种

                   UIControl是UIView的子类

三、按钮控件(UIButton)

操作步骤:

         3.1 创建按钮对象

                   使用工厂方法,UIButtonTypeSystem

         3.2 设置相关属性

                   title按钮上显示的内容

                   state按钮状态

                   [buttonsetTile:…forState:…];

         3.3 加入到父视图中

         3.4 添加事件(Event)

                   addTarget:action:forControlEvents:

                   target:目标

                            当按钮触发了事件时,向哪个对象发送消息。

                            经常使用self,向当前对象发送消息。

                   action:动作

                            向target对象发送什么消息

                   events:事件

                            当用户触发了按钮对象的哪种事件时,才向target发送action消息。               UIControlEventTouchUpInside手指在按钮上按下并抬起时,触发此事件。

                   UIControlEventTouchDown手指在按钮上按下时触发此事件。

注:自定义的视图内容,要添加到自定义的视图控制器中,所以自定义一个类继承UIViewController。

 

四、视图控制器的创建方式

         4.1 代码的创建方式 code

         4.2 图形化界面的创建方式 xib(IOS5.0前)/storyboard(IOS5.0后)

         4.3 执行过程

                   main.m->Appdelegate->appliction…->

                   ***[TRViewControlleralloc]initWithNib …]

         4.4 操作步骤:

                   1>拖拽(show the object Library)相应的视图或控件到xib文件中。(xib自动创建一个相应的对象)

                   2>连线 (ctrl+鼠标左键连线,鼠标右键连线)

                   IBOutlet

                   使用类似于组合的模式,创建属性对象。(Xib)

                   是一种属性,这种属性指向了xib中的一个对象。

                   IBAction

                   是一种方法,这个方法连接到了xib中的一个控件,当用户触发了这个控件的事件方法,会调用此方法。

         4.5Interface Builder(IB)

                   1>是什么

                            是一个工具软件,以前是独立的,从xcode4开始集成到xcode中了。

                   2>干什么

                            帮助程序员设置和构造界面用的,可以不写代码或少写代码来构建界面,从而提高我们的开发效率,所见即所得。

                   3>工作原理

                            将界面上需要的控件(或视图)的创建、属性的设置、之间的关系等都保存到一个xml文件中,程序运行时,从xml中读取所有的控件信息、配置,自动创建这些对象,自动加入到父视图中。

                   4>一些文件

                            .doc(office2003以前)     .docx(office2003以后)

                            .nib                                       .xib

 

                            VC类->*.h *.m

                            IB->*.xib

         4.6 连线常见问题

                   1>xib中的视图或控件与类中的属性关联错误

                            删除类中的属性,并不会删除连线关系

                   'NSUnknownKeyException', reason: '[<TRViewController0xa8509b0> setValue:forUndefinedKey:]: this class is not key valuecoding-compliant for the key myLabel.'

                   2>xib中的控件与类的事件方法关联错误

                            删除(修改)类中的方法,并不会删除或修改连线关系

                   'NSInvalidArgumentException',reason: '-[TRViewController onClick]: unrecognized selector sent to instance0x8c33da0'

                   解决:删除原有连线,重新连线。

                   3>自己创建视图控制器中的根视图,默认是不会连线的。

'NSInternalInconsistencyException', reason:'-[UIViewController _loadViewFromNibNamed:bundle:] loaded the"TRViewController" nib but the view outlet was not set.'

            解决:自己连线。

 

五、详细操作

            5.1 步骤(视图)

              a.创建一个视图控制器,并创建相应的xib文件。

              b.将视图控制器设置成根视图控制器(rootVC)。

              c.在show the object library中,拖拽相应的视图或控件到父视图中。

              d.按住鼠标右键,连接相应的视图连线到相应的类(.m文件)的@interface部分。

              e.如果需要视图加载的时候,初始化子视图,应该在viewDidLoad方法,通过属性进行修改。

              注:相应的xib中的视图控制器类型要与视图控制器的类的类型相匹配。

            5.2 步骤(事件方法)

              a.创建一个视图控制器,并创建相应的xib文件。

              b.将视图控制器设置成根视图控制器(rootVC)。

              c.在show the object library中,拖拽相应的控件到父视图中。

              d.在xib中,右击相应的控件连线到相应的类中(视图控制器.m件implemention部分),会弹出一个对话框,设置相应的参数,会自动生成相应的事件方法。

            5.3IBAction对应的事件方法的参数

              任何一个控件产生事件时,如果调用一个方法,且这个方法有参数,就会将控件自身传给这个参数。(事件源)

              默认情况下,事件源的参数是id类型,使用前必须进行类型转换。

           

            总结使用控件四个步骤:

            (1)创建控件

            (2)设置属性

            (3)添加事件方法

            (4)添加到父视图         

六、控件S

            6.1UIStepper 控件

              重要属性:

                     .value当前值

                     .stepValue步进值(每一次增加或减少多少)

                     .minimumValue最小值

                     .maxmumValue最大值

              最常用的事件:

                     valueChanged(stepperValueChanged)

              练习:改变UIStepper的初始值,默认为20.

                                   取值范围是-50~+50之间,每次步长为5,显示在Label中。

            6.2UISlider 滑块控件

              重要属性:

                     .value当前值

                     .minimumValue最小值

                     .maxmumValue最大值

              最常用的事件:

                     valueChanged

            6.3Switch 开关控件

              最重属性:

                     .on: BOOL (getter:isOn)

              常用事件:

                     valueChanged

                    

                     //指定getter方法为isOn

                     @property(nanatomic,getter=isOn)BOOLon;

           

//通过UIColor类,可以得到一个颜色                       

self.myLabel2.backgroundColor = [UIColorcolorWithRed:0.5green:0.0blue:0.0alpha:1.0];

                                         

 

1.UIAlertView

         弹出一个警告小窗口。

         使用步骤:

                   1)创建对象

                   2)设置属性

                   3)show方法显示出来

                   4)设置被委托对象

                            1>遵守协议<UIAlertViewDelegate>

                                      UIXXX+Delegate…

                            2>实现方法

- (void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

2.委托(delegate)

         2.1 是什么

                   一个对象(A)委托另一个对象(B)做事(调用方法)。

                   我们把A叫委托方(委托对象),把B叫被委托方(被委托对象)。

         2.2 委托协议

                   委托方希望被委托方能做的事情写入协议。

                   委托方就是UIAlertView,被委托方就是self(viewController)。

                   同时定义了委托协议UIAlertViewDelegate。

         2.3 被委托方需要做的事情:

                   (1)遵守协议@interface … <委托协议>

                   (2)实现协议中要求的方法

                   (3)将委托方与被委托方建立联系(通过属性关联)

                            alertView.delegate =self;

                                      使用时,将委托对象调用被委托对象的方法,这种方式叫回调。(CallBack)

3.UIActionSheet

         3.1 是什么

                   类似UIAlertView的一个选择框。(分享)

         3.2 使用

                   1)创建对象

                   2)设置属性

                            UIActionSheet *as =[UIAction Sheet alloc]initWithTitle … delegate … cancelButtonTitle …

                   3)设置被委托对象

                            1>遵守协议UIActionSheetDelegate

                            2>actionSheet: clickedButtonAtIndex...

                   4)在某个视图下方弹出来

                            [asshowInView:self.view];

                            注:这个方法不可以用在viewDidLoad方法中

4.UITextField文本框控件

         4.1 是什么

                   是一个单行文本框控件,用来接收用户输入的信息。

         4.2 使用

                   与前面的控件相类似。

         4.3 重要的属性

                   .text          文本框中的内容

                   .secure… 密文的形式显示信息

                   .placeHolder 文本框的提示信息(淡显)

                   clearButton 是否出现清除功能

                   keyBoardType 还可以指定虚拟键盘的类型

                   Appearance 键盘显示的样式

                   ReturnKey 右下角的按钮提示

         4.4 设置被委托对象

                   1)代码方式

                            self.password.delegate= self;

                   2)图形化界面方式

                            右击相应的文本框控件连线到相应的file’s owner

         4.5 相应事件方法的功能

                            以下事件方法,描述了文本控件使用时候的生命周期:

将要执行编辑文本框内容时执行

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{}

已经开始文本框内容的编辑

- (void)textFieldDidBeginEditing:(UITextField *)textField{

}

文本框内容编辑将要结束

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{}

文本框内容编辑已经结束

- (void)textFieldDidEndEditing:(UITextField *)textField{}

文本框的内容发生修改

- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString *)string{}

清除文本框的内容执行

- (BOOL)textFieldShouldClear:(UITextField *)textField{}

点击虚拟键盘右下角的按钮时执行此方法

- (BOOL)textFieldShouldReturn:(UITextField *)textField{}

            4.6 隐藏键盘

              1)第一响应者      

                     一个界面中一般只有一个第一向响应者,如果UITextField控件变成第一响应者,键盘会自动弹出。

                     如果想取消键盘(隐藏),就得让UITextField控件放弃第一响应者身份,向对象发送resignFirstResponder,就可以让textField控件放弃第一向应者。

              2)有三种方式

                     1>点击按钮向文本框发送消息,隐藏键盘。

                     2>点击空白处也关掉文本框修改父视图的类型

                            a.UIView->UIControl

                            b.添加相应的事件方法 touchUpInSide

                     3>点击虚拟键盘右下角的return键盘

                            textFieldShouldReturn:

 

一、MVC 设计模式

         1.1 MVC是什么

                   是一个大型综合的设计模式。

                   设计模式是解决某一类问题的一种最优的办法。

         1.2 为什么要用设计模式

                   提高程序的可重用、可扩展性、可维护性。

                   苹果的系统大量的使用了设计模式。

         1.3 MVC简介

                   M:Model 模型

                            处理数据和业务逻辑,保存数据、网络通信…业务计算。

                   V:View 视图 xib

                            给用户提供界面显示,接收用户输入。

                   C:Controller控制器

                            控制程序的流程及跳转,协调View和Model之间的工作。

                   课程安排:

                            control&controller

                            view

                            model

 

         1.4 MVC之间的关系

                   CV:

                            C->V(IBOutlet)

                            V->C(TargetAction,IBAction,Delegate)

                   CM:

                            M不能访问C的

                            C->M 通过属性的方式或发送消息关联在一起的。

                   VM:

                            不能访问,不可以交互的。

         1.5 多MVC(多界面开发)

                   应用程序中有多个界面,而每一个界面就是一个MVC,所以说多界面开发就是多MVC开发。

                   操作步骤:

                            a.创建两个VC类

                            b.创建一个VC对象,并设为根视图控制器

                            c.添加了一个按钮,并添加了相应的事件方法

                                      1>创建第二个VC对象

                                      2> [selfpresentViewController:vc2animated:YEScompletion:nil];

                            d.在第二个VC对象中,添加一个按钮和相应的事件

    [self dismissViewControllerAnimated:YES completion:nil];

              视图控制器的生命周期:重写(dealloc方法)

                     1>第一个界面的生在appdelegate中

                        第二个界面的生在第一个界面中的事件方法中

                     2>A界面跳转的时候,创建新的B界面,但原来的A界面没有销毁。从B界面返回A界面,原有的B界面就销毁了。

                            根视图控制器永远不会销毁。

 

            1.6 传值

              将VC1中的数据传给VC2中。

              使用步骤:

                     VC1:

                            a.在界面跳转之前,创建VC2对象

                            b.并传值给VC2.属性(model)

                            传值的方式:属性、方法、自定义方法(事件源)

                     VC2:

                            a.声明一个属性(model),接收vc1传来的值。

                            b.第二个界面显示的时候(viewDidLoad)                    

                                   将model的数据->view显示(label)

 

 

1.传值的方向性

         如果从A界面跳转到B界面并传值,正向传值。

         如果从B界面返回到A界面并传值,反向传值。

2.反向传值

         VC1:

                   2>在VC1跳转VC2前,将自己赋值给VC2的属性。

                   3>在VC1声明一个属性,用来接收传值。(model)

                   5>重写了viewWillApear方法(每次界面显现的时候执行),将model的值->view(label)

         VC2:

                   1>首先要保存前一个界面的引用(属性)

                   4>触发返回上一个界面方法时,将VC2值传给VC1的Model。

        

         传值方式:

                   属性

                   方法

                   委托模式

 

         "委托模式"传值方式:

                   1.定义一个委托协议—(1)

                            传值方式:属性/方法—(2)

                   2.委托方—(3)

                            创建一个属性关联被委托式(delegate)—(4)

                            反回前一个界面前,得到委托方的值—(9)

                            (textFieldvalue)->self.delegate.value= textFieldValue

                   3.被委托方—(5)

                            遵守协议—(6)

                            实现协议要求的属性和方法—(7)

                            接收到值后,将值显示在界面上—(10)

                                      viewDidAppear-> self.myLabel.text = self.value;

                   4.将委托方与被委托方关联一起—(8)

                            在VC3->VC2之前,vc2.delegate = self;

 

                   补充:

                            声明属性时候的关键字:

                                      assign 基本数据类型,默认assign

                                      weak(MRCassign)

                                               修饰对象的引用,仅仅是指向对象,不会通知对象的引用计数器加1。如果指向的对象销毁了,那么该引用会自动置空。

                                      strong(MRCretain)

                                               修饰对象的引用,当该引用指向对象的时候,会通知引用计数器加1 。

                                      copy

                                               修饰对象的引用,但是会将原有的对象内容复制一份,并得到新的内存地址。

 

                                      *NSCopying对象的复制 深复制(深拷贝)

                                      NSString*str = [NSString alloc]init…"hello"];

                                      NSString*str2 = [str copy];

 

                                      引用复制 浅复制(浅拷贝)

                                      NSString*str = [NSString alloc]init…"hello"];

                                     NSString*str2 = str;

                                                                           

                                      int i =10;赋值

                                      int *p =&i;赋值(传地址)

 

4.UINavigationController(导航控制器)

         4.1 是什么

                   是控制器UIViewController的子类,是一个视图控制器的控制器,是用来管理其它VC的VC。(用来管理其它视图控制器的)

         4.2 有什么用

                   管理和控制VC的走向,比present方式更好、更清晰。

         4.3 怎么用

                   1) 创建一个UINavigationController的对象或*其子对象。并且要指一个根视图控制器。

                   2)推出一个界面(VC) 界面跳转

                                      self.navitionControllerpush VC2

                   3) 返回前一个界面

                                      a.会自动生成一个返回方式

                                      b.指定一个事件方法返回

                                               [self.navitionControllerpopViewController];

         4.4 内部原理

                   1)navi内部维护着一个VC对象的数组

                            self.navigationControllers.viewControllers

                            将此数组当做栈来管理

                            栈是一种数据结构,特点是先进后出,后进先出。

                   2)navi必须有一个根VC,第一个被navi包含的VC。

                   3)push一个新界面(VC),旧的VC是不会被释放的。

                   4)navi会保持所有push进去的VC的引用,push一个VC其实是此VC放入到navi中的数组中。

                   5)当pop一个VC从navi中出来时,此VC就会被释放。

                   6)不能pop根VC

         4.5 使用方式

                   传值:原理同上(present),重构传值练习。(正、反)

                   1)NavigationBar(导航栏)

                            导航栏主要分为三个部分,分别是左,中,右。

                            a.中 标题(Title)

                                      在具体的VC,设置了一个属性self.title。(viewDidLoad)

                                      当界面跳转时,默认的返回按钮,自动更新为上一个界面的标题。

                            b.左、右按钮

                                      .navigationItem.leftBarButtonItem

                                      .navigationItem.rightBarbuttonItem

                            c.UIBarButtonItem

                                      专门用于各种bar上的按钮,和UIButton不一样的系统按钮。

                                      系统按钮

                                               initWithBarButtonSystemItem:target:action:

                                      文字按钮

                                               initWithTitle:style:target:action:

                            d.多个按钮

                                      .navigationItem.leftBarButtonItems…

                                      .navigationItem.rightBarButtonItems…

                            e.隐藏导航控制器头

                                      self.navigationController.navigationBarHidden= YES;

                   2)ToolsBar 工具栏

                            工具栏默认是隐藏的。

                            a.显示工具栏

                                      self.navigationController.toolBarHidden= NO;

                            b.UIBarButtonItem

                                      专门用于各种bar上的按钮,和UIButton不一样的系统按钮。

                                      系统按钮

                                               initWithBarButtonSystemItem:target:action:

                                     文字按钮

                                               initWithTitle:style:target:action:

                            c.向工具栏添加按钮

                                      self.toolBarItems= @[……];

                            d.美工具栏的样式

                                      Fixed:固定值 填补指定宽度

                                      Flexibile:弹簧效果,尽可能的填补空间。

                   3)在一个NavigationController中,可以继续使用present,当然也可以使用NavigationController。

 

 

                                                        

                           

 

1.copy

         默认情况下,自定义的类是不具备copy能力的,必须遵守NSCopying协议,实现copyWithZone方法才可以具备copy能力,本质上copy就是新创建一个一模一样的对象(空间)。

         还想复制相应对象的值,是不是要依赖一个初始方法,在创建对象的时候,要把复制对象的值也要传进来。

         如果一个对象的属性修饰为copy,那么在给属性赋值的时候,相当于自动的发送了一个copy消息。

2.图像

         显示图信息。

         2.1 基本概念

                       数据                容器

                   NSString           UILabel

                   UIImage          UIImageView

         2.2 在界面上显示图像

                   使用步骤:

                            1)创建容器对象,并指定数据对象

                                      [[UIImageViewalloc]initWithImage:]

                            2)将它添加到父视图中

                   详细的操作步骤:

                            1)创建图像的对象,图像的文件名是包含扩展名的

                            2)将图像的对象放到图像的视图中

                            3)设置图像视图的位置和大小

                            4)将图像添加到父视图中

         2.3 contentMode属性

                            设置视图显示的样式,类型UIViewContentMode类型(枚举)

                            //填充满屏(默认) 拉伸

                            UIViewContentModeScaleToFill

                            //保持图片的原样, 保持宽高比不留白边。

                            UIViewContentModeScaleAspectFill

                            //保持等比显示 留有白边

                            UIViewContentModeScaleAspectFit

3.UIScrollView

         3.1 作用

                   在有限的区域中显示比较大的数据(图片、文字)。     3.2 本质

                   是一个View的View,用来管理其它的视图。

         3.3 使用

                   将其它视图放入到ScrollView,设置相关属性即可。

         3.4 关键属性

                   .frame scrollView的位置和大小

                   .contentSizescrollView的内容大小

         注:

                   a.不要设置imageView.frame的大小,默认大小就是和图片的大小是一样的。

                   b.contentMode = …AspectFill;

         3.5 重要属性

                   放大或缩小功能

                   1)比原来缩小多小倍

                            .minmumZoomScale= 0.2不能小于图片的20%

                            比原来放大多少倍

                            .maxmumZoomScale= 1.0不能比图片的本身大

                           

                            直接指定比率的大小是不合理的

                                     用物理屏幕的大小/图片的大小

                                              使用宽/高比值最小的那个

                   2)通过委托模式解决最终的问题

                            给scrollView指定delegate对象,回答以下问题:

                           

                            对scrollView中哪个子视图进行缩放操作

                            -(UIView*)viewForZoomingInScrollView…{

                                      returnself.image;

                            }

         3.6 重要属性

                   //翻页的时候 整页翻

         scrollView.pagingEnabled =YES;

              .showHorizontalScrollIndicator 显示横条

              .showVericalScrollIndicator 显示竖条

4.UIPageControl

            4.1 重要属性

              currentPage 当前页号

              numberOfPages 得到总页数

              pageIndicatorTintColor 未选中界面的颜色

              currentPageIndicatorTintColor 选中界面的颜色

 

 

5.UITableViewController(表视图控制器)

         5.1 是什么

                   是列表方式展示数据的一种VC

         5.2 在哪用

                   非常常见,有规律的展示固定样式的数据。

                   如果不用TableView,管理大量数据时:

                   1)手动布局,计算坐标

                   2)手动判断和事件处理

                   3)手动设置每一个控件的值

                   4)手动管理内存

         5.3 能帮助我们干什么

                   管理布局,管理事件,有规律的展示数据,管理内存...

                             

1.UITableViewController组成

         UITableViewController中的View类型是UITableView。

         +tableView : UITableView

                   +Table Header 表头

                            +Section 分区

                                      +SectionHeader分区头

                                               +Row行(Cell)

                                      +SectionFooter分区尾

                   +Table Footer 表尾

         表头、表尾、分区头、分区尾都可以没有。

         TableView 有两种Style:

                   Plain: 普通Style,只有一个分区。

                   Group: 组,有多个分区。

2.UITableView两个委托

         数据源 是TableView显示数据的来源。

         .dataSource :id<UITableViewDataSource>

         代理对象 处理一些数据源之外的其它事项,事件触发。

         .delegate :id<UITableViewDelegate>

3.UITableView重的问题

         三问:(显示)

                   a.你有几个分区

                            numberOfSectionsInTableView

                   b.每个分区有几行

                            numberOfRowsInSection

                   c.每行的内容是什么

                            cellForRowAtIndexPath

4.创建一个UITableViewController

         使用步骤:(自动生成)

                   a.继承UITableViewController

                   b.实现三问

         使用步骤:(xib手动生成)

                   a.创建UIViewController

                   b.拖拽一个UITableView到父视图中

                   c.将VC设置为被委托对象

                            <1>遵守协议(UITableViewDataSource)

                            <2>实现方法(三问)

                            <3>委托对象与被委托对象建立关联(连线)

         使用步骤:(code手动生成)

                   a.创建UIViewController

                   b.手动创建UITableView对象(code)

                   c.将VC设置为被委托对象

                            <1>遵守协议(UITableViewDataSource)

                            <2>实现方法(三问)

                            <3>委托对象与被委托对象建立关联

                                               (tv.dataSource= self)

5.多分区的使用

         每个分区有几行 参数1:事件源 参数2:区分不同的分区

                            - (NSInteger)tableView:(UITableView*)tableView numberOfRowsInSection:(NSInteger)section;

         注:要将UITableView的Style改成Grouped。

6.区分多行 indexPath

         NSIndexPath是一种集合(保存多维数组)描述数据关系。

         用来存储路径。例:描述分区行->Cell

                   .section 描述哪个分区

                   .row 描述此分区的哪一行

7.模型层与View层的关联

 

8.UITableViewCell类

         8.1 是什么

                   TableView中每一行就是一个UITableViewCell类型的对象。UITableView其实是UIView的子类,它是一个视图。

         8.2 Cell中的属性

                   UITableViewCell视图有以下子视图

                            .textLabel : UILabel用于在Cell上显示文字内容

                            .detailTextLabel :UILabel 用于在Cell上显示详细内容

                            .imageView :UIImageView 用于图片

         8.3 Cell显示的样式

                   Cell的style(系统提供的) initWithStyle

                            Default:默认,不显示详细信息

                            Value1:左右显示主要信息和详细信息,显示图片信息

                            Value2:居中显示详细信息,不显示图片信息

                            Subtitle:可以显示详细信息,详细信息另起一行

                            也可以自定义Cell

         8.4 Cell的性能(Cell的重用)

                   (1)第一种重用方式

                            tableView在运行期间,出了界面的Cell并不会释放,而是放到了tableView中的队列中,所以,需要在创建Cell之前先试着从此队列中去拿已经存在的Cell对象,如果能拿到就不需要创建,而是重用Cell对象。

                   (2)***第二种重用方式

                            向tableView“注册”一个重用的Cell对象,注册后如果向tableView索要队列中的对象时,如果没有队列中没有空闲的Cell对象,tableView会自动帮我们创建一个并返回,这样可以确保dequeue方法一定会返回一个Cell对象供我们使用。

                            使用步骤:

                            <1>注册

                            - (void)viewDidLoad

{[self.tableViewregisterClass:[UITableViewCellclass]forCellReuseIdentifier:CellIdenitifier];   }

              <2>直接去队列里面取

                     UITableViewCell*cell = [tableViewdequeueReusableCellWithIdentifier:CellIdenitifier];

            8.5 一向应(答)

              处理相应的事件方法。

              遵守一个协议(UITableViewDelegate)

              实现方法 didSelectRowAtIndexPath

              例:点击某一个Cell,跳转到详细信息界面。

                     1)创建一个详细信息界面

                     2)传值

                            将选中Cell的信息传值给新的界面

                     3)push一个新的界面

 

1.如何向TableView中增加一行数据(反向传值)

                   当从第二个界面返回第一个界面时,将数据传回给当前界面的模型层,但是界面不会自动的刷新,需要手动通知tableView刷新界面(重新执行三问)。

                   在viewDidApear方法中

                            [self.tableViewreloadData];//全局刷新

                            //局部刷新

                            self.tableViewinsertRowsAtIndexPath:…

                   注:如果复用指定样式的Cell

         UITableViewCell *cell = [tableViewdequeueReusableCellWithIdentifier:@"Cell"];

    if(cell== nil){

        cell = [[UITableViewCellalloc]initWithStyle:UITableViewCellStyleDefaultreuseIdentifier:@"Cell"];

    }

2.tableView的编辑模式

            2.1 是什么

              可以向TableView中插入、删除、移动Cell的一种状态。  2.2 如何进行编辑模式

              (1)UITableView有个属性editing(BOOL),将其值设置为YES会进行编辑模式,NO会退出编辑模式。

              (2)如何删除和插入

                     两问一响应:     

                            之两问:

                                   <1>哪些行进行编辑模式:(默认是所有行)

                                          -(BOOL)tableView:canEditRowAtIndexPath

                                   <2>进入模式时,样式是什么样的:(默认是删除)

                                          -(UITableViewCellEditingStyle)tableViewedtingStyleForRowAtIndexPath;

                            一响应:

                                   commitEditingStyle:forRowAtIndexRow:

                                   删除数据:

                                          1)***先从模型层删除相应的数据

                                          2)再从View层删除相应的数据

                                   插入数据

                                          1)***向模型层中插入相应的数据

                                          2)在视图层添加相应的数据

              (3)移动行

                     一问一响应(在编辑状态下 按住某行Cell进行移动)

                     一问:

                            哪些行可以移动(默认是所有行都可以移动)

                                   -(BOOL)tableView:canMoveRowAtIndexPath:

                     一响应:

                            当用户进行移动时,调用哪个方法进行数据

            -(void)tableView:moveRowAtIndexPath:toIndexPath;

                            操作步骤:

                             1.从model层,取出要移动的数据,将原来位置的数据删除掉

                            2.添加到新的位置 会自动刷新视图

 

1.UITableViewCell 高级

         1.1 是什么

                   是视图,是UIView的子类。

         1.2 组成

                   两大视图:

                            +contentView : UIView

                                      +textLabel : UILabel

                                      +detailLabel : UILabel

                                      +imageView : UIImageView

                            +accessoryView : UIView

         1.2 accessoryView

                   辅助视图,协助Cell实现一些界面效果,但默认是nil(没有辅助视图),当进入编辑模式下,辅助视图会默认隐藏。

         1.3 如何使用

                   (1)是UIView属性,可以指向任何类型的视图

                   (2)系统提供4种已经定义好的辅助视图

                            accessoryType来指定:

                                      DisclosureIndicator">"

                                               提示用户点击此Cell有更详细的内容

                                      DetailDisclosureButton"i"+">"

                                               提示用户点击此按钮i也会有更详细的内容

                                      Checkmark"√"

                                               一个"√",相当于打了个标记

                                      DetailButton"i"

                                               仅仅提示用户点击此按钮,会显示内容

                                      注:如果点击了辅助视图的按钮,会触发方法

tableView:accessoryButtonTappedForRowWithIndexPath

                   (3)除了使用系统定义好的辅助视图,还可以自定义辅助视图。

                            cell.accessoryView =view(任意视图)

                   (4)也可以自定义ContentView,定义的内容是ContentView的子视图

                             [cell.contentViewaddSubview:view];(任意视图)

                   注:如果自定义的是辅助视图,x,y坐标无效。

                                        如果自定义的是内容视图,x,y坐标有效。

                                        如果内容视图有值,自定义视图会将原来的内容视图挡住。

         1.4 自定义分区头、分区尾信息

                   (1)可以设置文字

                            tableView:titleForHeaderInSection

                            tableView:titleForFooterInSection

                   (2)可以设置视图

                            viewForHeaderInSection

                            viewForFooterInSection

                   (3)在导航栏中也有相关属性可以通过view赋值

                            self.navigationItem.titleView

                   1.5 完全自定义Cell

                            有两种创建方式,一个code方式,一个是***xib方式。

                            (1)基本原理

                                      UITableViewCell类是TableView的标准Cell类,自定义Cell就是自己写Cell类,然后在三问中最一个,“每一行的Cell”中回答,创建自定义的Cell。

                            (2)如何实现

                                     借助xib文件的功能,创建自定义Cell的界面,然后和自定义的Cell类进行绑定即可。

                            (3)详细的实现步骤:

                                      <1>创建一个Cell的类和xib文件

                                      <2>向xib中添加相应的视图

                                      <3>将xib中的视图与类的属性建立关联

                                      <4>在tableView中的三问,最后一问中使用自定义Cell对象。

                                                         a.注册的方式 创建自定义的Cell

                                                                  UINib *xib= [UINibnibWithNibName:@"TRTableViewCell"bundle:nil];

    [self.tableViewregisterNib:xibforCellReuseIdentifier:Identifier];

                                                         b.在队伍当中取出自定义的Cell对象并使用

TRTableViewCell *cell = [self.tableViewdequeueReusableCellWithIdentifier:Identifier];

                                   c.一定要设置自定义Cell的高度

                                          heightForRowAtIndexPath

                     <5>配置Cell对象中显示的内容

            1.6 TableView的使用

              (1)静态(Static)的TableView

                     <1>是什么

                            程序员直接写死TableView中有多少分区、多少行、以及每行的内容是什么。

                     <2>如何使用静态的TableView

                            硬代码的方法回答所有问题。

                            if(区、行){ 就怎么样 }

                            else if(区、行){ 就怎么样 }

                            else { 就怎么样 } 或使用switch

                     <3>应用广泛

                            各种设置界面(不会)

                            展示一个对象的信息(会变),静态的TableView并不意味着Cell中的内容不会改变。

                            使用code与xib创建静态的TableView

                            注:Demo 显示内容使用静态TableView

                                          Demo 显示的样式静态TableView但数据是动态

                                          Demo 使用xib的Cell实现表态的TableView

                                                 操作步骤:

                     1.拖拽一个Cell视图到tableView所在的xib文件中。

                     2.将该Cell连线到相应的TableViewController中的属性。                     3.在TableView的第三问中,直接回返回Cell对象属性。

                     注:如果需要设置Cell中的属性,参照自定义Cell。

              (2)动态(Dynamic)的TableView

                                      <1>是什么

                                               TableView中有多少区、多少行、每行的内容是什么,都有数据模型层来决定,而不是写死的。

                                      <2>灵活使用TableView

                                               a.两个TableView使用相同的数据源

                                               b.两个TableView使用不同的数据源

                                               c.两个TableView使用不同的委托对象

                                     

 

 

 

1.UITabBarController(标签控制器)

         1.1 是什么

                   类似于UINavigationConroller,也是一个控制器的控制器,经常看见的UITabBarController表现为UITabbar。(类似于NavigationController的UIToolBar)

         1.2 如何使用

                   创建UITabBarController对象,.viewControllers =@[vc1,vc2,vc3,vc4];

                   如果多出4个以下的视图控制器,会自动在Tabbar上生成一个More视图。

         1.3 重要的属性

                   设置VC的属性:(VC初始化的时候使用)

                            .title 文字

                            .tabBarItem 图片 默认是以单色显示

                            显示上的不同的内容

         1.4 NavigationController和TabBarController一起使用

                   window->TabBarController->NavigationController->TableViewController->ViewController

 

2.UICollectionViewController

         2.1 是什么

                   是一个展示大量数据的控制器,功能几乎与UITableViewController差不多,其实是UITableViewController的变种,是正真的二维表(多行多列)。

                   ios6以后支持的,用于展示视图、布局更加灵活,用法类似TableViewController。

         2.2 使用

                   使用方式与UITableViewController

         2.3 不同点

                   <1>UICollectionView是多行多列

                   <2>UICollectionView中的Cell一般需要"自定义"

                            UICollectionViewCell中没有定义

                                      .textLabel

                                      .detailLabel

                                      .imageView等属性都没有,所以需要自定义。

                  

                   分析:

                            tableView—属性—tableViewController

                            显示                              UITableViewDataSource—方法

                            操作                              UITableViewDelegate—方法

         2.4 实现步骤

                   (1)创建一个VC(UIViewController)

                   (2)拖拽CollectionView到VC中(委托对象)

                   (3)设置被委托对象

                            <1>遵守协议

                                      UICollectionViewDataSource

                                      UICollectionViewDelegate

                            <2>实现方法

                                      numberOfSectionsInCollectionView

                                      numberOfItemsInSection

                                      cellForItemAtIndexPath

                            <3>委托对象与被委托建立关联

                            <4>自定义Cell(参考自定义TableViewCell)

                                      a.创建一个类(UICollectionViewCell)

                                      b.创建相应的xib文件(并自定义中的内容)

                                               注:xib中的Cell与自定义的类进行关联

                                                                    xib中的label应该是自定义的类属性(IBOutlet)

                                      c.在CollectionView第三问中,使用自定义Cell。

                                                (1)先注册 (2)再从队列中取出来并赋值

                   2.5 重要的属性

                            Cell Size:设置Cell的大小

                            Header/Footer Size:设置分区头/尾的大小

                            Min Spacing:设置Cell对象间(横)/行(竖) 间隔距离

                            Section Insets:内边距,Cell对象与边的距离,上、下、左、右。

                   2.6 CollectionView 可以布局类,进行布局,使用UIKit提供的布局(UICollectionViewFlowLayout),也可以自定义布局。

                   2.7CollectionView的一些常用属性

                            layout:Flow/Custom

                                      如果选择Flow,Cell一个挨一个。

                                      如果选择custom,需要指定一个布局类,此类一定是自定义的,并且继承UICollectionViewLayout。

                            ScrollDirection:滚动的方向,默认是垂直,也可以是水平的。

                            CollectionView是UIScrollView的子类,所以有PagingEnabled属性。

                   2.8 布局

                            <1>是什么

                                      CollectionView是布局的精髓,相当于CollectionView的大脑和中枢,负责设置CollectionView的一些属性。

                                      位置、尺寸、透明度、层级关系、形状...

                            <2>本质

                                      本质就是对象,UICollectionViewLayout类的子类对象。

                                      UIKit提供了一个布局类:                                        UICollectionViewFlowLayout:  UICollectionViewLayout,流式布局,一个挨一个。

                            <3>***自定义布局

                                      写一个类,继承自UICollectionViewLayout或继承UICollectionViewFlowLayout,创建此类的对象,设置为collectionView的布局属性即可。

3.其它控件

         3.1 UISegementedControl 分段控制选择

                   允许用户在多个分段中做出选择。

                   重要属性:

                            selectedSegmentIndex按钮的索引

                   重要事件:

                            valueChanged

         3.2 Activity Indicator 活动指器

                   用来标识某个状态,活动或者空闲。

                   重要方法:

                            A.开始动画

                                      startAnimating

                            B.停止动画

                                      stopAnimating

         3.3 ProgressView 进度条

                   用来显示任务的状态,文件下载的进度或邮件的读取速度。

                   重要属性:

                            .progressTintColor 进度条颜色

                            .tractTintColor 底颜色

                            .progress 值0.0~1.0 之间

                   备注:

                            NSTimer定时器

                                      参数1:间隔时间 单位/秒

                                      参数2:通知哪个对象

                                      参数3:发送什么消息

                                      参数4:nil

                                      参数5:是否重复执行

                                      NSTimer*timer = [NSTimer scheduledTimerWithInterval:1 target: select: userInfo:repeats:]

                            [timer invalidate];停止定时器的继续执行

         3.4 UITextView 多行文本框

                   继承了UIScrollView,是一个可滚动的多行视图文本区域,可以格式化并且可以编辑。

                   重要属性:

                            .text 文本框的内容

                            .textColor 里面的字体颜色

                            .delegate 代理对象

                            .returnKeyType 返回按钮的类型

                            .scrollEnabled = YES是否可以拖动滚动条

                   重要方法:

                            … 参照 UITextField

         3.5 DatePicker   日期选择器

                   重要属性:

                            .date 得到选中的日期对象

                                                         (UTC时间 NSDateFormatter)

                            .locale = [NSLocalealloc]initWithLocaleIdentifier:@"zh_CN"];

                   重要方法:

                            valueChanged

         3.6 PickerView 视图选择器

                   允许用户从滚轮控件中选择数据,与TableView相似。

                   (1)数据源 UI……datasource…

                            数据源负责计算UIPickerView有多少列(滚轮的个数)、多少行(滚轮中数据的个数)。

                            返回总的列数:

                            返回总的行数:

                   (2)事件方法(Delegate)UI……delegate…

                            <1>第component列第row行显示样的View。(NSString)

                            <2>选择某一行时触发该事件方法

                            <3>返回component列每一行的高度

        

                            刷新某一列数据

                            [pickerViewreloadCompnent:1];

                  

 

1.WebView 网页视图(浏览器控件)

                   可以实现一个Web浏览器,可以实现加载静态html,动态URL地址,可以实现网页导航,以及调用JavaScript等。

                   重要方法:

                   [self.myWebViewloadHTMLString:…. baseURL:nil];

2.UISearchBar搜索控件

         按照指定要求 查找相应内容,通常与TableView结合使用。

        

         2.1 谓词(NSPredicate)(正则表达式)

                   (1)是什么

                            用于定义一个逻辑判定,判定结果是一个BOOL。

                   (2)干什么

                            作为if语句的条件和数据筛选。

                   (3)使用

                            通过使用predicateWithFormat:来创建一个谓词对象。

         2.2 搜索控件

                   实现步骤:

                            (1)搜索框的输入问题 UISearchBarDelegate

                            (2)将输入的内容要与模型层的数据进行筛选

                                      谓词

                            (3)将符合条件的数据保存下来

                                      遍历模型层 将符合条件的数据,保存起来

                            (4)将它显示在TableView中

3.UISearchBar+UISearchDisplayController

                   3.1 是什么

                            搜索显示控制器,继承于NSObject,非视图控制器,一个工具类。

                   3.2 干什么用

                            提供控制一个SearchBar和一个搜索结果tableView。

                            searchBar需要创建,添加到指定的视图,提供给搜索控制器。

                            搜索结果由tableView(由搜索控制器创建的)显示,需要指定delegate和datasource。

                            设置代理(委托)对象,实现委托协议中方法。

                   3.3 使用步骤

                            (1)创建一个TableView并显示

                            (2)拖拽一个searchBar

                                      设置searchBar在被代理对象

                                               得到筛选后的结果

                            (3)UISearchDisplayController

                                      设置了***显示结果TableView的dataSource、delegate

                                      将searchBar得到的筛选后的结果,显示在TableView2(UISearchDisplayController提供的TableView)中吧。

 


2016-10-31 11:35:31 love_monkey 阅读数 1629

iOS开发中,- (void)layoutSubviews{}方法及相关方法注意点!!

====

```objectivec

- (void)creatAutoLayoutUSE

{

// 一、layout相关方法

}

```

- (void)layoutSubviews

- (void)layoutIfNeeded

- (void)setNeedsLayout

- (CGSize)sizeThatFits:(CGSize)size

- (void)sizeToFit

- (void)setNeedsDisplay

- (void)drawRect

1.layoutSubviews在以下情况下会被调用/被触发??

----

+ 1、init初始化不会触发layoutSubviews,但是是用initWithFrame 进行初始化时,当rect的值 非CGRectZero时,也会触发。

+ 2、addSubview会触发layoutSubviews

+ 3、设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化

+ 4、滚动一个UIScrollView会触发layoutSubviews

+ 5、旋转Screen会触发父UIView上的layoutSubviews事件

+ 6、改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

####(在苹果的官方文档中强调:####

You should override this method only if the autoresizing behaviors of the subviews do not offer the behavior you want.layoutSubviews, 当我们在某个类的内部调整子视图位置时,需要调用。反过来的意思就是说:如果你想要在外部设置subviews的位置,就不要重写。)

2.刷新子对象布局??

----

####1.什么时候,需要重写??###

+ view是系统的,不需要重写 - (void)layoutSubviews

+ view是自定义的,需要重写  - (void)layoutSubviews

+ -layoutSubviews方法:这个方法,默认没有做任何事情,需要子类进行重写,自定义view时,手动重写,这里面只能写subview的frame限制。

####2.手动调用这个方法,系统默认 我们不能手动直接调用这个方法,这能通过下列两种方式,调用/触发 - (void)layoutSubviews方法####

+ -setNeedsLayout方法: 标记为需要重新布局,告诉系统未来某个时间点异步调用。不立即刷新,但layoutSubviews一定会被调用。

+ -layoutIfNeeded方法:如果,有需要刷新的标记,立即调用layoutSubviews进行布局(如果没有标记,不会调用layoutSubviews)

+ 若需要立即刷新view的frame更改:(同时调用,注意先后顺序)

*先调用[view setNeedsLayout],把标记设为需要布局

*然后马上调用[view layoutIfNeeded],实现布局

+ 在初始化方法init..。、或者view第一次显示之前,标记总是“需要刷新”的,可以直接调用[view layoutIfNeeded]

3.重绘

----

+ -drawRect:(CGRect)rect方法:重写此方法,执行重绘任务

+ -setNeedsDisplay方法:标记为需要重绘,异步调用drawRect

+ -setNeedsDisplayInRect:(CGRect)invalidRect方法:标记为需要局部重绘

- (注意:sizeToFit会 自动调用sizeThatFits方法;

sizeToFit不应该在子类中被重写,应该重写sizeThatFits)

* sizeThatFits传入的参数是receiver当前的size,返回一个适合的size

* sizeToFit可以被手动直接调用,注意(系统默认的一些控件可以通过调用sizeToFit方法使其有尺寸,egUIBarButtonItem,UITableView的组头,组尾,表头,表尾,,,......)

* sizeToFit和sizeThatFits方法都没有递归,对subviews也不负责,只负责自己

* layoutSubviews对subviews重新布局

* layoutSubviews方法调用先于drawRect

* setNeedsLayout在receiver标上一个需要被重新布局的标记,在系统runloop的下一个周期自动调用layoutSubviews

* layoutIfNeeded方法如其名,UIKit会判断该receiver是否需要layout.根据Apple官方文档,layoutIfNeeded方法应该是这样的

* layoutIfNeeded遍历的不是superview链,应该是subviews链

* drawRect是对receiver的重绘,能获得context

* setNeedDisplay在receiver标上一个需要被重新绘图的标记,在下一个draw周期自动重绘,iphone device的刷新频率是60hz,也就是1/60秒后重绘



文/hello_JSH(简书作者)
原文链接:http://www.jianshu.com/p/ed28cbeae943
著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”。
2015-03-02 08:57:00 weixin_34124577 阅读数 28

UITableView

  UITableView的样式有两种,一种是Grouped(左图),另一种是Plain(右图),如下图,它的属性是style,类型为UITableViewStyle,枚举值分别是UITableViewStyleGrouped和UITableViewStylePlain;

用这个控件的ViewController可以使用UITableViewController,使用了这个ViewController可以不需要另外创建UITableView,里面也包含了UITableViewDataSource和UITableViewDelegate这两个实现,这两个类稍后讨论,但是也有不方便的地方,默认情况下使用UITableViewController创建的tableView是充满全屏的,如果需要用到tableView是不充满全屏的话,我们应该使用UIViewController。

  UITableView的数据可以通过静态绑定和动态绑定,控件默认是动态绑定的,在StoryBoard里面设置Content属性,它有两个值Static Cell和Dynamic,顾名思义了。如果设置了Static Cell,点击Section的标题则可以控制UITableView的行数,添加了行数则可以。若要往行里添加内容可以直接把控件拖入单元格里面。

  如果要动态的往UITableView添加内容,则需要实现UITableViewDataSource和UITableViewDelegate的几个方法。其实这两个方法的共同作用有点类似于Andriod中的各种Adapter,Android中的Adapter是指定了列表中各个元素的布局,列表的数据源,而这两个协议要实现的方法是传递数据源的情况还有各个数据单元格的定义情况。

 

//返回分组的数量

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{
}
//每个分组里面行数
-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{
}
//定义单元格的内容,并返回。
-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
}

 

  如果使用了UITableViewController,则可以直接去实现这几个方法,假如用的是UIViewController,则在类声明的地方显式实现UITableViewDataSource和UITableViewDelegate。

  UITableView的每个单元格对象都是UITableViewCell类型的。在上面最后的一个方法里面构造并返回,单元格的布局类型有几种,它是UITableViewCellStyle类型的枚举,一般在初始化函数中设置它的类型。

  • UITableViewCellStyleDefault:只有一个靠左对齐的Label,它的值通过cell的textLabel设置

  • UITableViewCellStyleValue1:一个左对齐的Label和一个右对齐蓝色字体的Label,左边的Label是通过cell的textLabel设置,右边的Label是通过cell的detailTextLabel设置

  • UITableViewCellStyleValue2:同样有两个Lebel,但左边的Lable是右对齐的,Label的属性如上一个一样,效果如下图

  • UITableViewCellStyleSubtitle:同样有两个Lable,这种样式的第二个Lable充当了副标题

 

每个单元格的布局都是分左中右三块,最左边是图标,最右边是附件视图,附件一般是箭头,它通过UITableViewCellAccessoryType类型的属性accessoryType,它的值有以下几个

  • UITableViewCellAccessoryNone,
  • UITableViewCellAccessoryDisclosureIndicator,
  • UITableViewCellAccessoryDetailDisclosureButton,
  • UITableViewCellAccessoryCheckmark,
  • UITableViewCellAccessoryDetailButton

官方文档上是上面五个值,但是我的环境是iOS6的,只有截图的那几个值(None除外)。附件区域也可以自己添加控件,如下面这样的形式可以在每一行中添加了一个开关控件

cell.accessoryView= [[UISwitch alloc]init];

 

 

UITableViewCell提供了imageView来设置每一个单元格的图标它是一个UIImageView类型的属性,可以直接通过设置它的image属性来给每一行添加一个图标如

cell.imageView.image=[UIImage imageNamed:@"African Daisy.gif"];

 

假如这些控件还是太少的话,还可以通过Cell的contentCell的addSubview方法来添加控件到单元格里面,如下所示。

[cell.contentView addSubview:label];

 

但是要控制好添加到Cell里面控件的数量,因为如果控件数量多于3、4个的话,会比较影响效率,在列表滚动的时候会出现卡顿了。

在UITableView的表头表尾,分组头分组尾都可以添加视图,如果添加表头表尾的视图的话可以通过设置UITableVIew的tableHeaderView和tableFoorterView两个属性,如下所示

self.tableView.tableHeaderView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"bd_logo1.png"] highlightedImage:nil];

self.tableView.tableFooterView=[[UISwitch alloc]init];

 

那添加分组头和分组尾时就可以通过实现下面两个方法

-(NSString *) tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section
{
}

-(NSString *) tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
}

 

之前说了那么多,现在给个简单的例子来说明动态绑定的步骤

这里用到的数据源是自己填充上去的,

@property(nonatomic,strong) NSArray *carGroups;

-(NSArray*)carGroups

{

if(_carGroups==nil)

{

// 1.创建模型

HGTableviewModel *cg1 =[[HGTableviewModel alloc]init];

cg1.group=@"日本仔车";

cg1.desc=@"日系车";

cg1.cars=@[@"本田",@"丰田",@"日产"];

 

HGTableviewModel *cg2 = [[HGTableviewModel alloc] init];

cg2.group=@"鬼佬车";

cg2.desc=@"德国车";

cg2.cars=@[@"大众",@"别克",];

 

// 2.将模型添加到数组中

_carGroups = @[cg1, cg2];

}

return _carGroups;

}

 

在viewDidLoad方法中给tableView指定数据源

self.tableView.dataSource=self;

 

在这个方法里面可以对tableView做其他设置,这里不一一例举了,最后就实现之前获取分组数量,每个分组的列数,构造单元格的三个方法

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView

{

return self.carGroups.count;

}

-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

{

HGTableviewModel *item= self.carGroups[section];

return item.cars.count;

}

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

{

UITableViewCell *cell=nil;

if(indexPath.section==0)

cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:nil];

else

cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil];



HGTableviewModel *item=self.carGroups[indexPath.section];

cell.textLabel.text= item.cars[indexPath.row];

cell.accessoryType= UITableViewCellAccessoryDetailDisclosureButton;

cell.detailTextLabel.text=item.desc;

if(indexPath.section==0)

cell.imageView.image=[UIImage imageNamed:@"African Daisy.gif"];

else

cell.accessoryView= [[UISwitch alloc]init];//[UIButton buttonWithType:UIButtonTypeContactAdd];

return cell;

}

 

如果要给选中单元格这个事件绑定方法,只需要实现下面这个方法则可,如下面代码所示,选中了某行后弹出一个框说明当前选中了是哪个品牌

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

{

NSString *msg=[[NSString alloc]initWithFormat:@"你选中了 %@", ((HGTableviewModel*)self.carGroups[indexPath.section]).cars[indexPath.row]];

UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"选中行" message:msg delegate:self cancelButtonTitle:nil otherButtonTitles:@"确定", nil];

 

[alert show];

}

 

UIDatePickerView

  UIDatePickerView是一个日期时间选取的空间,它是以一个滚轮的形式呈现出来,可以通过设置它的当前显示时间,最大最小时间范围,这些值都是NSDate类型的,

NSDateFormatter *formatter=[[NSDateFormatter alloc]init];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

self.dtpDateTime.minimumDate= [formatter dateFromString:@"2011-01-01 00:00:00"];

self.dtpDateTime.maximumDate=[formatter dateFromString:@"2015-01-01 00:00:00"];

self.dtpDateTime.date=[formatter dateFromString:@"2015-03-01 00:00:00"];

 

它有一个datePickerMode属性来设置DatePicker的显示类型,它是一个UIDatePickerMode类型的枚举,分别有下面这些值

  • UIDatePickerModeTime:时钟模式,只有时分,
  • UIDatePickerModeDate:日期模式
  • UIDatePickerModeDateAndTime:日期时间模式,时间只有时分,日期只有月日
  • UIDatePickerModeCountDownTimer:时钟模式,只有时分,但是24小时

效果图按顺序如下图所示

UIDatePicker有个ValueChange事件,是在控件的Value发生改变之后触发的,需要绑定事件,通过StoryBoard或者使用addTargetWithActionForControlEvents方法,下面则是改变了值之后输出当前的日期

- (IBAction)dtpValueChanged:(id)sender {

NSLog(@"当前日期是 %@",self.dtpDateTime.date);

}

 

UIPickerView

  UIPickerView是把数据列表以滚轮的形式呈现给用户,与UITableVIew类似,它的数据绑定需要实现UIPickerViewDataSource和UIPickerViewDelegate两个协议,但是这个UIPickerView却不支持静态绑定数据。绑定数据主要是实现两个协议的下面这些方法

//返回显示的列数
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
}

//返回当前列显示的行数
-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
}
//下面的方法是PickerDelegate协议的方法,可以二选一,主要是返回每一项显示的内容
- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
}

 

加入滚轮中只是一些单纯的文本信息则可以使用返回String的那个方法,如果是每一项都是一些文本以外的内容,则需要使用返回UIView的那个方法,既然是返回View则说明可以返回任何的控件,包括自定义的也可以。

假如要在UIPickerView被选中后触发事件执行方法,则实现下面的方法则可

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component

{

NSLog([[NSString alloc]initWithFormat:@"SELECT Item %@ " ,[pickerDs objectAtIndex:row] ] );

}

 

下面则给出一个例子完整说明给一个UIPicker绑定数据的过程,里面的数据抄袭了某位网友的博文,莫怪。

首先是要实现两个协议

@interface HGDatePickerViewController : UIViewController<UIPickerViewDataSource,UIPickerViewDelegate >

@end 

通过StoryBoard建立了关联的变量picker和定义数据源一个NSArray的变量,然后在viewDidLoad里面添加下面这些代码,其中设置deletage的最为关键

pickerDs=[[NSArray alloc]initWithObjects:@"许嵩",@"周杰伦",@"梁静茹",@"许飞",@"凤凰传奇",@"阿杜",@"方大同",@"林俊杰",@"胡夏",@"邱永传", nil];

self.picker.delegate=self;

 

然后实现之前提到的方法,在这里把两个UIPickerViewDelegate的方法列举出来了,返回View的那种是返回一个UILabel,它们的效果图分别列举

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
return [pickerDs count];
}

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
return [pickerDs objectAtIndex:row];
}

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view
{
UILabel *myView = nil;

myView = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 180, 30)];
myView.text = [pickerDs objectAtIndex:row];
myView.textAlignment = UITextAlignmentCenter;
myView.font = [UIFont systemFontOfSize:14];
myView.backgroundColor = [UIColor clearColor];
return myView;

}

  

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component实现的效果

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view实现的效果

  其实UIPicker可以实现像以前在BS或CS开发中的下拉菜单多级联动效果的,这里都不详细列举了,主要是通过-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component方法根据当前级别的数据来调用[self.picker reloadComponent:xxx];方法来出发下一级别的值重新载入。

UIActionSheet

  UIActionSheet这个控件是在之前看UIDatePicker时别人用了而发现的,感觉也比较有用所以也记录下来,本人没有iOS的设备,故有哪些控件都不太了解,之前在一个界面原型图中见过这个控件,但不知道它是ActionSheet。这个ActionSheet个人感觉和AlertView很像。也能给界面弹出按钮选择框,同时具备遮罩的效果。

使用这个UIActionSheet需要实现UIActionSheetDelegate协议,构造和初始化ActionSheet的代码如下

UIActionSheet *as=[[UIActionSheet alloc]initWithTitle:@"This is my First ActionSheet" delegate:self

cancelButtonTitle:@"Cancle" destructiveButtonTitle:@"Sure" otherButtonTitles:@"First Btn",@"Second Btn", nil];

 

在上述参数中有两个比较特殊的按钮,cancelButton和destructiveButton,在ActionSheet中按钮也是有一定序列的,如AlertView那样,所有按钮都是有一定顺序的,按默认的情况下,destructiveButton是排在第一,是一个红色的按钮,接着是到ortherButton,它们的顺序由添加进去的顺序而定,最后的是cancelButton,是一个黑色的按钮。在上面的初始化函数中如果那个按钮不需要的话则可以传入nil则可。上面的ActionSheet显示的效果如下图

添加OtherButton也可以调用下面方法来添加

[as addButtonWithTitle:@"addButton"];

 

destructiveButton也可以更替由其他按钮来充当,通过下面这个属性的设置则可

as.destructiveButtonIndex=1;

 

效果如下图

显示ActionSheet则调用下面的方法

[as showInView:self.view];

 

在开发过程中,发现有时候UIActionSheet的最后一项点击失效,点最后一项的上半区域时有效,这是在特定情况下才会发生,这个场景就是试用了UITabBar的时候才有。解决办法:

在showView时这样使用,[actionSheet showInView:[UIApplication sharedApplication].keyWindow];或者[sheet showInView:[AppDelegate sharedDelegate].tabBarController.view];这样就不会发生遮挡现象了。

ActionSheet的actionSheetStyle属性是设置ActionSheet的样式,它是一个UIActionSheetStyle类型的枚举,它是值有下面三种

  • UIActionSheetStyleDefault //默认风格:灰色背景上显示白色文字
  • UIActionSheetStyleBlackTranslucent //透明黑色背景,白色文字
  • UIActionSheetStyleBlackOpaque //纯黑背景,白色文字

与UIAlertView类似,UIActionSheet也是有一组方法在ActionSheet里面出现,点击,消失各个时候触发调用的

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex

{

}

 

-(void)willPresentActionSheet:(UIActionSheet *)actionSheet

{

}

-(void)didPresentActionSheet:(UIActionSheet *)actionSheet

{

}

-(void)actionSheetCancel:(UIActionSheet *)actionSheet{

 

}

-(void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex{

}

-(void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex{

}

 

到这里遇到了在UIAlert中一样知什么时候会触发的actionSheetCancel方法,这些方法的触发顺序如下(actionSheetCancel是按照UIAlertView中的顺序推断出来的)

willPresentActionSheet——>didPresentActionSheet

点击了按钮之后

actionSheetclickedButtonAtIndex——>willDismissWithButtonIndex——>didDismissWithButtonIndex

2017-04-26 12:03:17 Wengyuyu1234 阅读数 3608


   

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

  

   UISwitch *shoutDown= [[UISwitch alloc]init];

   [shoutDown addTarget:self action:@selector(switchAction:) forControlEvents:UIControlEventValueChanged];

 //   return cell;

}


- (void)switchAction:(id)sender{

    //获取点击按钮对应的cell

    UISwitch *switchInCell = (UISwitch *)sender;

   //UISwitch的superview就是cell

    UITableViewCell * cell = (UITableViewCell*) switchInCell.superview;

    NSIndexPath * indexpath = [self.tableView indexPathForCell:cell];

    

}