iOS --- UI 简单总结

作者: 云之君兮鹏 | 来源:发表于2016-03-29 10:30 被阅读690次



    代码创建UIWindow对象

    Xcode7之后使用代码创建UIWindow对象:

    //创建UIWindow对象

    self.window =[[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];

    //给window设置背景颜色(白色)

    self.window.backgroundColor = [UIColorwhiteColor];

    //使window显示

    [self.window makeKeyAndVisible];

    //创建一个视图控制器

    UIViewController *VC = [[UIViewController alloc] init];

    //给window指定根视图控制器

    self.window.rootViewController = VC;

    自动创建UIWindow对象

    l1)先执行Main函数,执行UIApplicationMain()创建代理

    l2)看项目配置文件info.plist里面的StoryBoard的name

    l3)根据这个name找到对应的StoryBoard,加载StoryBoard

    l4)在加载的时候创建一个window。

    UIView功能

    •1)管理矩形区域里的内容

    •2)处理矩形区域中的事件

    •3)子视图的管理

    •4)实现UIView动画

    •5)UIView作为父类,子类也具有这些功能

    如何确定一个矩形

    1.首先确定这个矩形的位置。(iOS中以左上角为坐标原点)

    2.其次确定这个矩形的大小。

    iOS中通过确定一个矩形的左上角的点(x,y)以及矩形的 宽(width)和高(height)来确定一个矩形。

    坐标系相关数据类型

    坐标:

    struct CGPoint {CGFloat x;

    CGFloat y;

    };

    typedef struct CGPoint CGPoint;

    大小:

    struct CGSize {CGFloat width;

    CGFloat height;

    };

    typedef struct CGSize CGSize;

    矩形:

    struct CGRect {CGPoint origin;

    CGSize size;

    };

    typedef structCGRect CGRect;

    iOS中使用CGRect类型确定矩形位置以及大小

    创建UIView

    代码:

    //开辟空间创建UIView对象

    //设置frame确定UIView对象的位置及大小

    UIView *view =[[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];

    //设置UIView对象的属性:设置背景颜色

    view.backgroundColor = [UIColor redColor];

    //将创建好的UIView对象添加到window上显示

    [self.windowaddSubview:view];

    第二节:

    UILabel:

    •UILabel(标签):是显⽰示⽂文本的控件。在App中UILabel是出现频率最⾼高的控件

    •UILabel是UIView⼦子类,作为⼦子类⼀一般是为了扩充⽗父类的 功能UILabel扩展了⽂文字显⽰示的功能,UILabel是能显⽰示⽂文 字的视图。

    创建UILabel与创建UIView的步骤很相似。

    1、开辟空间并初始化(如果本类有初始化⽅方法,则使⽤用⾃自⼰己的初 始化⽅方法;否则使⽤用⽗父类的)。

    2、设置⽂文本控制相关的属性

    3、添加到⽗父视图上,⽤用以显⽰示

    4、 释放所有权(只是做了引⽤用计数-1)

    UILabel *userNameLabel = [[UILabel alloc]

    initWithFrame:CGRectMake(30, 100, 100, 30)]; userNameLabel.text = @“⽤用户名”;

    [containerView addSubview:userNameLabel];

    [userNameLabel release];

    注:containerView已经添加到根视图上

    •UITextField(输入框):是控制⽂本输入和显示的控件。在App中UITextField出现频率也比较高。

    •iOS系统借助虚拟键盘实现输入,当点击输入框,系统会自动调出键盘, ⽅便你进一步操作。在你不需要输入的时候,可以使用收回键盘的⽅法,收回弹出的键盘。

    •UITextField和UILabel相比,UILabel主要用于文字显示,不能编辑,UITextField允许用户编辑文字(输⼊)

    创建UITextField与创建UILabel的步骤很相似。

    1、开辟空间并初始化(如果本类有初始化⽅方法,则使⽤用⾃自⼰己的初始化⽅方法;否则使⽤用⽗父类的)。

    2、设置⽂文本显⽰示、输⼊入等相关的属性

    3、添加到⽗父视图上,⽤用以显⽰示

    4、释放对象所有权

    //使用初始化方法创建对象

    UITextField *userNameTextField = [[UITextFieldalloc] initWithFrame:CGRectMake(100, 100, 190, 30)];

    //设置边框⻛风格

    userNameTextField.borderStyle= UITextBorderStyleRoundedRect;

    //设置占位符

    userNameTextField.placeholder

    = @“手机号/邮箱";[containerViewaddSubview:userNameTextField];[userNameTextField release];

    •UIButton(按钮):是响应用户点击的控件。在App中UIButton是 出现频率很高的控件。

    •UIButton与UILabel、UITextField侧重点不同,侧重于处理用户交互 事件。当然UIButton类也提供了一些方法控制按钮外观。

    创建UIButton与创建UILabel、UITextField、UIView的步骤很相似。

    1、创建button对象(如果本类有初始化方法,则使用自己的初始化方法;否则使用父类的)。

    2、设置按钮相关的属性

    3、为按钮添加点击事件

    4、添加按钮到父视图上,用以显示

    5、按钮无需释放(一般情况创建UIButton都使用自己的便利构造器方法,无需释放对象的所有权)

    //便利构造器⽅方法创建对象

    UIButton*loginButton = [UIButton buttonWithType:UIButtonTypeSystem];loginButton.frame = CGRectMake(30, 200, 60,30);

    //设置button的标题

    [loginButton setTitle:@"登录" forState:UIControlStateNormal];

    //添加点击事件

    [loginButtonaddTarget:self action:@selector(login:)forControlEvents:UIControlEventTouchUpInside];[containerView addSubview:loginButton];

    UIImageView是iOS中用于显示图片的类,iOS中几乎所有看到的 图片,都是由这个类来显示的。

    //图⽚片⽂文件路径

    NSString *path= [[NSBundle mainBundle] pathForResource:@"1"ofType:@"jpg"];

    //创建⼀一个UIImage对象,使用initWithContentOfFile:方法

    UIImage *image= [UIImage imageWithContentsOfFile:path];//创建一个UIImageView对象,使用initWithImage:方法

    UIImageView*imageView = [[UIImageView alloc] initWithImage:image];

    imageView.frame= CGRectMake(100, 100, 100, 100);[self.view addSubview:imageView];

    •animationImages//设置⼀一组动态图⽚片

    •animationDuration//设置播放⼀一组动态图⽚片的时间

    •animationRepeatCount//设置重复次数

    •startAnimating//开始动画

    •stopAnimating//结束动画

    第三节:

    LTView的具体使用

    //创建LTView对象

    LTView*usernameView = [[LTView alloc] initWithFrame:CGRectMake(40,100, 300,50)];usernameView.leftLabel.text =@"⽤用户名:";usernameView.rightField.placeholder = @"请输入用户名";[usernameView.rightField becomeFirstResponder];[backViewaddSubview:usernameView];//backView是LTView添加到的父视图

    [usernameViewrelease];

    视图控制器指定自定义View

    如何设置

    -(void)loadView{

    [superloadView];

    self.myView =[[MyView alloc] initWithFrame:self.view.frame];

    self.view =self.myView;

    [self.myViewrelease];

    }

    #pragma mark视图加载完毕

    - (void)viewDidLoad {

    [superviewDidLoad];

    self.view.backgroundColor= [UIColor grayColor];NSLog(@"%s%d",__FUNCTION__, __LINE__);

    //为自定义视图里面的按钮添加点击事件[self.myView.buttonaddTarget:self action:@selector(buttonAction)forControlEvents:UIControlEventTouchUpInside];

    }

    #pragma mark点击⽅方法

    -(void)buttonAction{

    NSLog(@"点击了⾃自定义视图⾥里⾯面的按钮");

    }

    #pragma mark内存警告⽅方法

    -(void)didReceiveMemoryWarning {

    //即使没有显⽰示在window上,也不会⾃自动的将self.view释放。

    [super didReceiveMemoryWarning];

    NSLog(@"%s%d", __FUNCTION__, __LINE__);

    // Dispose ofany resources that can be recreated.

    }

    第四节:

    触摸事件的处理方法:

    在给定的触摸阶段中,如果发生新的触摸动作或已有的触摸动作发生变化,应用程序就会发送这些消息;

    当一个手指或多个手指触碰屏幕时,发送touchesBegan:withEvent:消息。

    当一个手指或多个手指在屏幕上移动时,发送touchesMoved:withEvent:消息。

    当一个手指或多个手指离开屏幕时,发送touchesBegan:withEvent:消息。

    手势识别器

    1 . UIapGestureRecognizer是轻拍⼿势识别器,能识别轻拍操作

    2.U I L o n g P r e s s G e s t u r e R e c o

    g n i z e r是长按⼿势识别器,能识别长按操作

    3 . U I R o t a t i o n G e s t u r e R e c o g n i z

    e r是旋转⼿势识别器,能识别旋转操作

    4 .U I P i n c h G e s t u r e R e c o g n i z e r是捏合⼿势识别器,能识别捏合操作

    5 .U I P a n G e s t u r e R e c o g n i z e r是平移⼿势识别器,能识别拖拽操作

    6 . U I S w i p e G e s t u r e R e c o g n i z e r是轻扫⼿势识别器,能识别拖拽操作

    7 . U I S c r e e n E d g e P a n G e s t u r e R e c

    o g n i z e r是屏幕边缘轻扫识别器

    View的transform属性:

    transform是view的一个重要属性,他在矩阵层面上改变view的显示状态,能实现view的缩放、旋转、平移、等功能。

    平移:CGAffineTransformMakeTranslation;

    缩放:CGAffineTransformMakeScale;

    旋转:CGAffineTransformMakeRottion;

    第五节

    UIControl常用方法:

    1.添加一个事件:

    参数说明:target为目标对象;action为方法选择器;controlEvents为触发事件。

    (void)addTarget:(id)target action:(SEL)action forControlEvents:(UIControlEvents)controlEvents;

    2.移除一个事件:

    参数说明:target为目标对象;action为方法选择器;

    controlEvents为触发事件。

    - (void)removeTarget:(id)target action: (SEL)action

    forControlEvents: (UIControlEvents)controlEvents;

    UISlider⽰示例代码:

    创建一个UISlider对象,并且添加到self.view上

    UISlider *slider = [[UISlider alloc] initWithFrame:CGRectMake(self.view.center.x- 100, imageView.frame.origin.y + imageView.frame.size.height + 50, 200,50)];

    [self.view addSubview:slider];

    [sliderrelease];

    2.UISlider相关属性设置

    //设置slider的最⼩小值

    slider.minimumValue = 0.0;

    //设置slider的最⼤大值

    slider.maximumValue = 2;

    //设置划过区域的颜⾊色

    slider.minimumTrackTintColor = [UIColor redColor];

    3.为UISlider添加事件:

    //添加slider的事件

    [slider addTarget:self action:@selector(sliderAction:)forControlEvents:UIControlEventValueChanged];

    UISegmentedControl添加事件

    1.为UISegmentedControl添加事件

    [segmented addTarget:self action:@selector(segmentedAction:) forControlEvents:UIControlEventValueChanged];

    2.UISegmentedControl事件的响应(通常我们和swich...case分⽀支语

    句组合使用)

    #pragma mark segmentedControl点击事件

    -(void)segmentedAction:(UISegmentedControl *)segmented

    {

    switch (segmented.selectedSegmentIndex) {

    case 0:

    [self.view insertSubview:self.redbelowSubview:segmented];

    break;

    case 1:

    [self.view insertSubview:self.bluebelowSubview:segmented];

    break;

    case 2:

    [self.view insertSubview:self.yellowbelowSubview:segmented];

    break;

    default:

    break;

    }

    }

    UIPageControl常用属性和方法

    •numberOfPages //指定页面个数(即点的个数)

    •currentPage //指定pageControl的值(即选中的点)

    •addTarget:action:forControlEvents: //给slider添加

    事件

    注意:controlEvent为UIControlEventValueChanged

    原因:分页本质是通过数据管理分页,所以使⽤用valueChanged

    属性来触发事件,即数组下标变化

    总结

    1.UIControl是所有控制视图的⽗父类。

    2.UISwitch的状态监测。

    3.UISlider为滑块控件,通过控制value来设置当前的值,通过⽤用来控制视

    频、⾳音频等播放进度。

    4.UISegmentedControl为分段控件,相当于⼀一组按钮,不同的Item可以

    设置不同的点击事件。

    5.UIPageControl的currentPage属性的使用。

    需要注意:添加的点击事件通过UIControlEventValueChanged来触发事件

    第六节

    UIScrollView的创建

    #define WIDTH self.view.frame.size.width

    #define HEIGHTself.view.frame.size.height

    // 1.创建⼀一个和屏幕等尺⼨寸的UIScrollView

    UIScrollView*scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0,WIDTH,HEIGHT)];

    // 2.设置背景颜⾊色

    scrollView.backgroundColor= [UIColoryellowColor];

    // 3.把scrollView放到self.view上显示

    [self.viewaddSubview:scrollView];

    // 4.内存管理

    [scrollViewrelease];

    UIScrollView协议方法

    •当我们签好协议,设置好代理人之后,我们就可以使用

    UIScrollView的协议方法了,它的协议方法分为两部分:

    •一是监控滚动时候的状态。

    •二是控制视图的缩放。

    总结

    •本节主要是为了让大家了解滚动视图的创建和基本的使用

    方法,并且配合UIPageControl实现关联使用。

    •UIScrollView主要的属性contentSize用来控制视图的滚动

    范围,视图的变化显示主要由contentOffset偏移量来控

    制。

    •UIPageControl一般会和UIScrollView一同使用。

    第七节

    UINavigationController

    UINavigationController:导航控制器,,是iOS中最常⽤用的多视图控制器之一,用它来管理多个视图控制器。

    导航控制器可以称为是,管理控制器的控制器,主要管理有层

    次递进关系的控制器。

    创建

    //创建根视图

    RootViewController *rootVC =

    [[RootViewController alloc] init];

    //创建导航控制器 把rootVC作为导航控制器的根视图控制器

    UINavigationController *navi =

    [[UINavigationController alloc]

    initWithRootViewController:rootVC];

    //设置导航为window的根视图

    self.window.rootViewController = navi;

    //内存管理

    [rootVC release];

    [navi release];

    导航栏半透明效果

    //导航栏半透明效果(iOS7以后 默认为YES)

    //当半透明效果开启时 屏幕左上⾓角为坐标原点

    //关闭时 导航栏左下⾓角为坐标原点

    self.navigationController.navigation

    Bar.translucent = YES;

    //创建⼀一个View

    UIView *view = [[UIView alloc]

    initWithFrame:CGRectMake(0, 0, 100,100)];

    view.backgroundColor = [UIColor blueColor];

    [self.view addSubview:view];

    [view release];

    页面跳转工作原理:

    UINavigationController通过栈的方式管理控制器的切换,控制入栈和出栈来展示各个视图控制器。

    •UINavigationController的ContentView里始终显示栈顶控制器的view。

    •viewControllers属性是一个可变数组(NSMutableArray)存储了栈中的所有被管理的控制器,入栈的时候,使用addObject把新的视图控制器对象添加到数组末尾,出栈时removeLastObject移除数组末尾的试图控制器对象。

    •navigationController属性,父类中的属性,每个在栈中的控制器,都能通过此属性,获取自己所在UINavigationController对象。

    工作原理

    • 栈的特点:先进后出,后进先出。

    • 栈顶为当前显⽰示的视图控制器。

    模态进入下一页

    - (void)next

    {

    //⻚页⾯面跳转

    //模态(modal)

    // 1.创建第二页对象

    SecondViewController *secVC = [[SecondViewControlleralloc]init];

    // 2.设置过渡动画(有默认值,可以不设置)

    secVC.modalTransitionStyle =UIModalTransitionStyleCoverVertical;

    // 3.模态控制器

    //参数1:第二页对象

    //参数2:是否使用动画

    //参数3:模态完成后执行的block

    [self presentViewController:secVC animated:YEScompletion:^{

    }];

    // 4.内存管理

    [secVC release];

    }

    总结

    1.UINavigationController的创建

    2.通过导航跳转页⾯面

    3.自定义NavigationBar

    4.模态

    第八节:

    回顾协议六步

    第一步:声明协议

    第二步:声明代理人

    第三步:执行协议方法

    第四步:签订协议

    第五步:指定代理人

    第六步:实现协议方法

    代码演示

    #warning第1步

    //在SecondViewController.h⾥里声明协议

    @protocol SecondViewControllerDelegate

    -(void)changeValue:(NSString *)name;

    @end

    @interface SecondViewController : UIViewController

    #warning第2步

    //声明代理人

    @property(nonatomic,assign)id

    elegate>secondDelegate;

    @end

    #warning第3步

    -(void)buttonAction:(UIButton *)button

    {

    //执⾏行协议方法

    [self.secondDelegate

    changeValue:self.textField.text];

    [self.navigationController

    popViewControllerAnimated:YES];

    }

    #warning第4步

    //FirstViewController签订协议

    @interface FirstViewController :

    UIViewController

    #warning第5步

    -(void)buttonAction:(UIButton *)button

    {

    SecondViewController *secondVC =

    [[SecondViewController alloc] init];

    //指定当前对象为代理⼈人

    secondVC.secondDelegate = self;

    secondVC.contents = self.label.text;

    [self.navigationController

    pushViewController:secondVC animated:YES];

    [secondVC release];

    }

    #warning第6步

    //实现协议方法,并接收传过来的值

    -(void)changeValue:(NSString *)name

    {

    self.label.text = name;

    }

    注意

    @protocol SecondViewControllerDelegate

    @required //必须要实现的⽅方法,默认是必须实现

    -(void)changeValue:(NSString *)name;

    @optional //可选实现的协议方法

    -(void)changeColor:(UIColor *)color;

    @end

    block传值两种方式

    • 方式一:使用block属性实现回调传值

    • 方式二:在方法中定义block实现回调传值

    方法中定义block

    • 创建一个RootViewController并添加一个button和一个label

    • 封装一个NSObject类

    • 实现点击button将一个NSInteger类型的10086数字传入NSObject中,

    • 将其转换为NSString类型

    • 用block将转换完的字符串回传给RootViewController并显示在label上

    提示:使用在方法中封装一个block来回调传值更方便

    #warning第一步

    //在AppTool.h中重定义void(^)(NSString *string)类型

    的别名为AppToolBlock

    typedef void(^AppToolBlock)(NSString *string);

    #warning第二步

    //声明方法,在方法中封装block

    -(void)sendNumber:(NSInteger )number andBlock:

    (AppToolBlock)block;

    #warning第三步

    //在AppTool.m实现方法,并执行block

    -(void)sendNumber:(NSInteger )number andBlock:

    (AppToolBlock)block;

    {

    NSString *string = [NSString

    stringWithFormat:@"%ld",number];

    block(string);

    }

    -(void)buttonAction:(UIButton *)button

    {

    #warning第四步

    AppTool *appTool = [[AppTool alloc] init];

    //执行方法,实现block并接收回传过来的string值

    [appTool sendNumber:10086 andBlock:^(NSString

    *string) {

    self.label.text = string;

    }];

    }

    总结

    使用属性传值解决从前往后传值的问题

    使用协议/代理解决从后往前传值的问题

    使用__block修饰变量来解决block循环引用问题

    注意:关于block内存管理上的三个区域,在arc和⾮非arc下还是有区别的,请学员自行打印验证结果

    第九节

    代码创建UITabBarController

    代码:

    // 1.创建UITabBarController对象

    UITabBarController *tabBarController =

    [[UITabBarController alloc] init];

    // 2.将TabBarController管理的视图控制器放到⼀一个数组中

    NSArray *viewControllers = [NSArray

    arrayWithObjects:firstNav, secondNav,thirdNav,fourthNav, nil];

    // 3.设置TabBarController的⼦子视图控制器数组

    mainTabBarVC.viewControllers = viewControllers;

    // 4.将根视图控制器设置成TabBarController

    [self.window setRootViewController:mainTabBarVC]

    程序的添加过程

    UITabBarController创建完成后有一句关键代码

    //将根视图控制器设置成TabBarController

    [self.window setRootViewController:mainTabBarVC];

    程序的添加过程:

    UIWindow—>UITabBarcontroller—>UINavigationController—>UIViewController

    UITabBar

    •UITabBar包含多个UITabBarItem,每一个UITabBarItem对

    应一个UIViewController。UITabBar的高度是49。

    • 系统最多只显示5个UITabBarItem,当UITabBarItem超过5个时系统会自动增加一个更多按钮,点击更多按钮没有在

    底部出现的按钮会以列表的形式显示出来

    •UITabBar的属性:tintColor、barTintColor、图像设置

    等。

    UITabBarItem的图⽚片处理

    代码:

    //未选中的图片

    UIImage *secondNormalImage = [UIImage

    imageNamed:@“carGary”];

    //图片不被渲染,保持图片本⾝身的样子

    secondNormalImage = [secondNormalImage

    imageWithRenderingMode:UIImageRenderingModeAlwaysO

    riginal];

    //选中时的图片

    UIImage *secondSelectedImage = [UIImage

    imageNamed:@"carRed"];

    secondSelectedImage = [secondSelectedImage

    imageWithRenderingMode:UIImageRenderingModeAlways

    Original];

    UIAppearance

    代码:

    //设置全局外观

    //通过[UITabBar appearance]得到当前应用的UITabBar对象来设置tabBar的外观

    //注意:设置全局外观最好在appDelegate里,否则会无效

    [[UITabBar appearance] setBarTintColor:[UIColorcyanColor]];

    [[UITabBar appearance] setTintColor:[UIColorbrownColor]];

    //改变导航栏外观颜色

    [[UINavigationBar appearance] setBarTintColor:[UIColor

    lightGrayColor]];

    //改变导航栏字体颜色

    [[UINavigationBar appearance] setTitleTextAttributes:

    [NSDictionary dictionaryWithObjectsAndKeys:[UIColor

    redColor],NSForegroundColorAttributeName,[UIFontsystemFontOfSize:17],NSFontAttributeName, nil]];

    总结

    •UITabBarController是项目开发中常见的布局样式,与

    UINavigationController不同,它的viewControllers都是并列

    的;⽽而UINavigationController的则是层次性的。

    •UITabBar通常都会定义外观以适应程序风格,必要时会完全自定义

    第十节

    UITableView

    •UITableView继承于UIScrollView,可以滚动。

    •UITableView的每一条数据对应的单元格叫做Cell,是UITableViewCell的一个对象,继承于UIView。

    •UITableView可以分区显示, 每一个分区称为section,每一行称为row, 编号都从0开始。

    • 系统提供了一个专门的类来整合section和row,叫做NSIndexPath。

    UITableViewDataSource协议方法的实现代码

    // tableView每个分区要显示的行数

    - (NSInteger)tableView:(UITableView *)tableView

    numberOfRowsInSection:(NSInteger)section{

    return 100;

    }

    // tableView每次要显示一个cell都会调用这个方法获取

    - (UITableViewCell *)tableView:(UITableView*)tableView

    cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    UITableViewCell *cell = [[[UITableViewCell alloc]

    initWithStyle:UITableViewCellStyleDefault

    reuseIdentifier:@"reuse"] autorelease];

    cell.textLabel.text = @"标题";

    return cell;

    }

    UITableView重用cell的流程

    •1.当一个cell被滑出屏幕,这个cell会被系统放到相应的重⽤用池中。

    •2.当tableView需要显⽰示一个cell,会先去重⽤用池中尝试获取一个

    cell(红色的cell)。

    •3.如果重用池没有cell,就会创建一个cell(黄色的cell)。

    •4.取得cell之后会重新赋值进行使用。

    UITableView和数组

    @interface ViewController ()

    UITableViewDelegate>

    //数组属性,用来和tableView结合使用

    @property (nonatomic, retain) NSMutableArray*sourceArr;

    @end

    @implementation ViewController

    - (void)viewDidLoad {

    [super viewDidLoad];

    //初始化数组

    self.sourceArr = [NSMutableArray arrayWithObjects:

    @"张三", @"李四", @"王五", @"赵六", nil];

    }

    总结

    1. UITableView的基本概念和创建方法

    2. UITableView的重用机制

    3.常用的UITableView的协议方法的使用

    第十一节

    UITableView编辑步骤

    UITableView编辑步骤如下:

    一.让TableView处于编辑状态

    二.协议设定

    1.确定Cell是否处于编辑状态

    2.设定Cell的编辑样式(删除、添加)

    3.编辑状态进行提交

    UITableView编辑步骤如下:

    一.让TableView处于编辑状态

    - (void)setEditing:(BOOL)editinganimated:(BOOL)animated

    二.协议设定

    1.确定Cell是否处于编辑状态

    - (BOOL)tableView:(UITableView *)tableViewcanEditRowAtIndexPath:

    (NSIndexPath *)indexPath

    2.设定Cell的编辑样式(删除、添加)

    - (UITableViewCellEditingStyle)tableView:(UITableView*)tableView

    editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath

    3.编辑状态进行提交

    -(void) tableView:(UITableView *) tableViewcommitEditingStyle:

    (UITableViewCellEditingStyle)editingStyleforRowAtIndexPath:

    (NSIndexPath *)indexPath

    UITableViewController

    一:UITableViewController继承自UIViewController,自带

    一个tableView

    二:self.view不是UIView而是UITableView

    三:datasource和delegate默认都是

    self(UITableViewController)

    四:开发中只需要建立UITableViewController子类

    总结

    1.UITableView编辑的写法

    2.UITableViewController

    第十二节

    自定义Cell

    为什么需要自定义Cell?

    • 在前期我们学过自定义视图,即创建一个类继承于UIView

    或者其他的视图,在自定义类中创建其子视图,这样就会

    形成一个新的自定义视图。

    • 系统提供的cell满足不了复杂的样式,因此:自定义Cell

    和自定义视图⼀一样,自己创建一种符合我们需求的Cell并

    使用这个Cell

    ⾃自定义Cell步骤:

    • 创建⼀一个类继承于UITableViewCell。

    • 实现UITableViewCell的初始化⽅方法:

    -(instancetype)initWithStyle:(UITableViewCellStyle)style

    reuseIdentifier:(NSString *)reuseIdentifier。

    • 确保所有的你想添加的子视图都在自定义Cell的初始化方法中创建,由于UITableView的重用机制,一个Cell在第一次创建成功并用于下一次显示的时候,不会再走初始化方法,这样

    可以避免子视图的重复创建。

    • 在Cell的子视图创建成功后,将子视图设置为属性,类似于

    UITableViewCell所自带的textLabel和detailTextLabel属性。便于在UITableView的协议中给自定义视图赋值。

    Model的使用

    创建步骤:

    • 创建一个类并继承于NSObject

    • 添加和字典中对应的属性

    • 在视图控制器中将字典通过KVC为Model赋值

    • 将Model对象添加到数组中并刷新TableView

    判断多种Cell一

    Model *model = [self.tableArray

    objectAtIndex:indexPath.row];

    //根据model属性划分

    if (model.type == 0) {

    FirstTableViewCell *cell = [tableView

    dequeueReusableCellWithIdentifier:firstIdentify];

    return cell;

    }

    if (model.type == 1) {

    SecondTableViewCell *cell = [tableView

    dequeueReusableCellWithIdentifier:secondIdentify];

    return cell;

    }

    判断多种Cell二

    //第一行显示第一种Cell

    if (indexPath.row == 0) {

    FirstTableViewCell *cell = [tableView

    dequeueReusableCellWithIdentifier:firstIdentify];

    return cell;

    }

    //第二行显示第二种Cell

    if (indexPath.row == 1) {

    SecondTableViewCell *cell = [tableView

    dequeueReusableCellWithIdentifier:secondIdentify];

    return cell;

    }

    图片自适应高度

    UIImage *aImage = [UIImageimageNamed:@"1.png"];

    //获得图片真实高度和宽度

    CGFloat height = aImage.size.height;

    CGFloat width = aImage.size.width;

    //缩放后宽度固定为200

    CGFloat scale = width / 200;

    CGFloat realHeight = height / scale;

    [self.myImageView setFrame:CGRectMake(0, 0,

    200,realHeight)];

    总结

    • 自定义Cell

    •Model类的创建和使用

    • 多种Cell混合使用

    •Cell的自适应高度

    第十三节

    视图控制器独有初始化方法:

    - (instancetype)initWithNibName:(NSString*)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    •nibNameOrNil:当前控制器相关联的nib文件,如果写nil默认为同名文件

    •nibBundleOrNil:当前应用程序包所在文件,如果写nil默认为mainBundle

    •在我们使⽤用init初始化(或者new直接创建)控制器的时候,会自动执行

    控制器的此方法,参数均以默认值执行,所以可不写。

    自动布局

    自动布局:autoLayout,不给View固定的位置,通过某些规则让View自己适应自己的位置。

    iOS6.0之后推出,在iOS8.0自动布局被大幅度优化,iOS9中新增了许多功能。

    总结

    1.xib可视化编程方式。

    2.基础控件的属性操作以及与代码的关联方式。

    3.自定义单元格的创建和使用。

    4.自动布局的使用。

    第十四节

    StoryBoard注意事项

    • 在AppDelegate的

    -application: didFinishLaunchingWithOptions:

    方法中不要再用代码初始化一个window。

    • 将创建好的Storyboard在应⽤用程序配置General中设置为MainInterface。

    • 视图添加与控制和IB开发一样。

    利用StoryBoard绘制⾃自定义单元格

    StoryBoard绘制单元格的时候要注意以下几点:

    1.创建⾃自定义cell时选中左侧TableViewCell。

    2.绘制自定义UI界⾯面。

    3.设置重用标识符。

    4.将StoryBoard文件关联至对应的UITableViewController和

    UITableViewCell子类(自己创建的类)。

    5.在UITableViewController中完成代码书写:设置section和row数量,

    设置cell,根据实际情况调整cell的高度。

    注意:cell不再需要注册。

    StoryBoard进行页面跳转

    StoryBoard页面跳转分为两种。

    •1、代码方式:使用代码通过控制器标识来跳转。比如在当前页

    面的某一个事件中跳转到一个标识为“customVC”的控制器页面

    中:[self performSegueWithIdentifier:@"customVC"sender:nil];

    •2、连线方式:直接使用拖拽可以给按钮连线关联两个页面:选中按钮,按住control,从按钮向下一级页面连线。按钮不需要添加响应方法。

    自定义segue

    •步骤一:新建一个类继承自UIStoryboardSegue。

    •步骤二:选中前一个控制器,按住control鼠标辅助完成连线,选择custom。

    •步骤三:选中自定义segue,设置segue的identifier以及关联类。

    •步骤四:在segue类里面重写perform方法(界面间跳转默认执行的方法),自定义跳转效果。

    @implementation CustomSegue

    //页面跳转时,自定义segue会自动触发此方法(重写的系统方法)

    -(void)perform

    {

    //获取源控制器

    UIViewController *v1 = (UIViewController

    *)self.sourceViewController;

    //获取目标控制器

    UIViewController *v2 = (UIViewController

    *)self.destinationViewController;

    //自定义页面切换效果

    [UIView transitionFromView:v1.view toView:v2.viewduration:

    10 options:UIViewAnimationOptionTransitionCurlDown

    completion:^(BOOL finished) {

    //动画完成后执行的部分

    }];

    }

    sizeClasses

    •设备对应关系如下:

    •iPhone4S,iPhone5/5s,iPhone6,iPhone6s

    • 竖屏:(w:Compact h:Regular)

    • 横屏:(w:Compact h:Compact)

    •iPhone6 Plus/iPhone6s Plus

    • 竖屏:(w:Compact h:Regular)

    • 横屏:(w:Regular h:Compact)

    •iPad

    • 竖屏:(w:Regular h:Regular)

    • 横屏:(w:Regular h:Regular)

    总结

    1.StoryBoard与xib在可视化编程中的对比。

    2.可视化编程中页⾯面传值的方式。

    3.自定义segue实现页面跳转动画。

    4.sizeClass适配。

    第十五节

    创建UICollectionViewFlowLayout

    UICollectionViewFlowLayout *flowLayout =[[UICollectionViewFlowLayout alloc] init];

    //设置每个item的大小

    flowLayout.itemSize = CGSizeMake(100, 100);

    //设置每个item的最小列间距(默认是10)

    flowLayout.minimumInteritemSpacing = 10;

    //设置每个item的最小行间距(默认是10)

    flowLayout.minimumLineSpacing = 10;

    //设置分区间隔 (上,左,下,右)

    flowLayout.sectionInset = UIEdgeInsetsMake(10, 10, 10,10);

    //设置UICollectionView的滑动方向

    flowLayout.scrollDirection =UICollectionViewScrollDirectionVertical;

    //头部引用的尺寸

    flowLayout.headerReferenceSize = CGSizeMake(100, 100);

    //尾部引⽤用的尺寸

    flowLayout.footerReferenceSize = CGSizeMake(100, 100);

    设置代理

    遵守代理协议:

    @interface ViewController()

    UICollectionViewDelegate>

    @end

    @implementation ViewController

    指定代理人:

    collectionView.delegate = self;

    collectionView.dataSource = self;

    创建item视图对象

    //创建item视图对象

    -(UICollectionViewCell *)collectionView: (UICollectionView*)collectionView

    cellForItemAtIndexPath:(NSIndexPath *)indexPath

    {

    UICollectionViewCell *cell = [collectionView

    dequeueReusableCellWithReuseIdentifier:@"collectionCELL"forIndexPath:indexPath];

    cell.backgroundColor = [UIColor redColor];

    return cell;

    }

    返回头部、尾部视图样式

    UICollectionView不能像UITableView一样直接指定头部和尾部视

    图,需要注册使用,最大的好处是添加了重用机制。

    //注册头部视图

    [collectionView registerClass:[UICollectionReusableViewclass]

    forSupplementaryViewOfKind:UICollectionElementKindSectionHeaderwithReuseIdentifier:@"headerView"];

    //注册尾部视图

    [collectionViewregisterClass:[UICollectionReusableView class]

    forSupplementaryViewOfKind:UICollectionElementKindSectionFooterwithReuseIdentifier:@"footerView"];

    第十六节

    单例模式

    • 单例模式是一种设计模式

    • 实现: 定义一个单例类,保证程序中这个类只能创建唯

    一的实例对象,实现资源共享

    单例代码展示

    static DataHandle *handle = nil;

    //单例类使用此方法,创建单例对象

    + (DataHandle *)shareInstance

    {

    if (nil == handle) {

    //如果还没有创建过对象,使用handle指向新创建的对象

    handle = [[DataHandle alloc] init];

    }

    //如果已经创建过对象,则直接返回已经创建的对象

    return handle;

    }

    注意事项

    •1)操作单例对象的变量存储在静态区程序关闭后由系统自动

    回收。

    •2)单例对象存储在堆区,不需要释放程序,关闭后由系统自

    动回收。

    •3)变量和单例对象的生命周期与程序同步。

    优势

    •1)在内存中只有一个对象,节省内存空间

    •2)避免频繁的创建销毁对象,可以提高性能

    •3)避免对共享资源的多重占用

    •4)可以全局访问

    •5)降低模块之间的耦合度,降低代码的复杂度

    框架设置

    项目页面框架步骤:

    1、根据项目的页面个数创建相同个数的视图控制器

    2、根据项目的页面逻辑创建每个视图控制器上的切换方法

    3、根据项目的页面功能创建每个视图控制器上的功能方法

    相关文章

      网友评论

        本文标题:iOS --- UI 简单总结

        本文链接:https://www.haomeiwen.com/subject/xlrjlttx.html