zoukankan      html  css  js  c++  java
  • UI:基础

    App的生命周期 参考 

    多态的使用

    //
    //  main.m
    
    #import <Foundation/Foundation.h>
    #import "SingleDog.h"
    #import "Cat.h"
    #import "Animal.h"
    #import "BigYellowDog.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
         /*
          多态:程序在运行的时候会有很多种表现形式;(不同的对象以自己的方式响应相同名称方法的能力称为多态)
          
          条件:
          必须要有继承,没有继承就没有多态。
          
          要有方法重写(子类重写父类的同名方法);
          
          在使用多态时,会进行动态检测,以调用真实的对象方法。
          
          多态在代码中的体现即父类指针指向子类对象。
          
          */
            
            
            Animal *ani = [[Animal alloc] init];
            [ani run];
            
            SingleDog *sd = [[SingleDog alloc]init];
            
            [sd run];
            
            Cat *cat = [[Cat alloc] init];
            [cat run];
            
             //多态实现;
            
            Animal *a1 = [[SingleDog alloc]init];//父类指针  指向子类的对象;
            //a1 指向内存堆区的SingleDog类的对象的地址 然后调用代码区中 SingleDog 的run方法;
            [a1 run];
            
            Animal *a2 = [[Cat alloc]init];
            
            [a2 run];//父类动物 调用猫;
            
            SingleDog *sd1 = [[BigYellowDog alloc]init];
            [sd1 run];//父类单身狗调用大黄狗;
            
            
            Animal *a3 = [[BigYellowDog alloc]init];
            
             [a3 run];//父父类(爷爷类)调用大黄狗
           
        // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            
            
            //刚才调用的是同名方法run方法,若调用非同名方法?
            Animal *a4 = [[SingleDog alloc]init];
            
    //        [a4 eat]; //此时编译会报错,系统默认的Animal 类没有eat方法;
            
            [(SingleDog *)a4 eat];//瞒过编译 。
            
            
            
            Animal *a5 =  [[Animal alloc]init];
          
            [(SingleDog *)a5 eat];// 这种方法能骗过编译器不会报错,但是因为Animal类对象没有eat 这种方法。程序crash;
    //
            
         
            
           /* 好处:简化了程序接口,容许在类与类之间重用一些习惯性的命名,不用为新加的函数命名一个新名字。如果函数方法参数中使用的是父类类型,则可以传入父类和子类对象,而不用再去定义多个函数来和相应的类进行匹配了。
            
            局限性:父类类型的变量不能直接调用子类特有的方法,如果必须要调用,则必须强制转换为子类特有的方法。
          */
     
            
        }
        return 0;
    }
    View Code  main.m
    //
    //  Animal.h
    
    #import <Foundation/Foundation.h>
    
    @interface Animal : NSObject //爷爷类
    -(void)run;
    @end
    View Code  person.h
    //
    //  Animal.m
    
    #import "Animal.h"
    
    @implementation Animal
    -(void)run{
        NSLog(@"Animal 在跑");
    }
    @end
    View Code  person.m
    //
    //  SingleDog.h
    //  duotai
    
    #import "Animal.h"
    
    @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
    -(void)eat;
    @end
    View Code  singleDog.h
    //
    //  SingleDog.h
    //  duotai
    
    #import "Animal.h"
    
    @interface SingleDog : Animal //儿子类 (动物 -》 单身狗)
    -(void)eat;
    @end
    View Code  singleDog.m
    //
    //  Cat.h
    //  duotai
    //
    //
    #import "Animal.h"
    
    @interface Cat : Animal //儿子类  (动物 -》猫)
    
    @end
    View Code  cat.h
    //
    //  Cat.m
    //  duotai
    
    #import "Cat.h"
    
    @implementation Cat
    -(void)run{
    
        NSLog(@"Cat 在跑");
    }
    @end
    View Code  cat.m
    //
    //  BigYellowDog.h
    //  duotai
    
    #import "SingleDog.h"
    
    @interface BigYellowDog : SingleDog //孙子类 (动物 -》 狗 -》 单身狗)
    
    @end
    View Code  bigYellowDog.h
    //
    //  BigYellowDog.m
    //  duotai
    
    #import "BigYellowDog.h"
    
    @implementation BigYellowDog
    -(void)run{
        NSLog(@"大黄狗在跑");
    
    }
    @end
    View Code  bigYellowDog.m 

    mian函数的作用有三个:

    1、创建应用程序的对象 UIApplication 类
    2、设置应用程序的代理
    3、创建事件循环  runloop (是一个死循环,实际上加了一个计时器)监视用户的交互

    使用NSlog可以打印出当前的方法的名字,以及所在的行数,这对于调试很有帮助,使用方法是

    NSLOG("%@",__FUNCTION__);//打印所在的方法

    NSLOG("%@",__LINE__);//打印所在的行数

    一个App的启动时候,在mian 函数所创的代理协议中要执行的函数如下:

    //应用程序加载时候触发的方法,加载需要显示的内容
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
        NSLog(@"应用程序加载 %s 方法 (应用程序加载时候触发的方法,加载需要显示的内容)所在行数 %d",__FUNCTION__,__LINE__);
    //    __FUNCTION__  当前调用的方法名字
    //    __LINE__     当前方法所在的行数
        
    //    cmd + k 清除控制台输出的内容
    //    cmd + shift + hh 显示所有的后台程序
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }
    
    
    //应用程序将要取消活跃的状态的时候要触发的方法
    - (void)applicationWillResignActive:(UIApplication *)application {
        NSLog(@"应用程序加载 %s 方法 (应用程序将要取消活跃的状态的时候要触发的方法)所在行数 %d",__FUNCTION__,__LINE__);
        //应用程序将要取消活跃的状态的时候要触发的方法(例如:突然有一个电话打过来,这里面可以有一个操作,保存一下数据 )   应用程序不再处于活跃的状态
        //使用该方法用来暂停正在运行的任务,然后让计时器失效,还可以让游戏暂停
    }
    
    
    //应用程序进入后台时候触发
    - (void)applicationDidEnterBackground:(UIApplication *)application {
        NSLog(@"应用程序加载 %s 方法 (应用程序进入后台时候触发)所在行数 %d",__FUNCTION__,__LINE__);
        //使用该方法释放共享资源,保存用户的数据,让计时器失效,存储当前的应用程序的状态(例如:用网页浏览新闻,当推出的时候,下次再打浏览器,就会回到我们当前浏览的页面)
        // 如果这个应用程序支持后台运行,这个方法将会替代 applicationWillTerminate ,这个方法就会被调用 (查阅:苹果手机 墓碑机制)
    }
    
    
    //应用程序将要进入前台
    - (void)applicationWillEnterForeground:(UIApplication *)application {
        NSLog(@"应用程序加载 %s 方法 (应用程序将要进入前台)所在行数 %d",__FUNCTION__,__LINE__);
        //该方法用来唤醒重新进入后台时的任务
        
    }
    
    
    //应用程序变成活跃状态
    - (void)applicationDidBecomeActive:(UIApplication *)application {
        NSLog(@"应用程序加载 %s 方法 (应用程序变成活跃状态) 所在行数 %d",__FUNCTION__,__LINE__);
        //应用程序变成活跃状态(当前正在使用应用程序被暂停后 又打开)打开之后
        //重启当应用程序不活跃的状态时暂停时的任务,或者开启没有启动的任务。
        //如果应用程序之前处于后台的状态,可以刷新一下用户的页面
        
    }
    
    
    
    - (void)applicationWillTerminate:(UIApplication *)application {
        NSLog(@"应用程序加载 %s 方法 所在行数 %d",__FUNCTION__,__LINE__);
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
    }
    App启动的时候Appdelegate的代理方法说明

    要能够会使用 :复合设计模式,就是将不同的控件组合在一个类中,然后在另一个类中可以加载这个组合在一起的组合控件,常用到登陆,注册页面的布局

    UI学习

    (UI控件很简单,主要是业务逻辑处理和算法要下功夫) cocaChina网站、推酷。

    //didFinishLaunchingWithOptions 确实加载了

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        //创建应用窗口的对象,呈现应用的内容

        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];//这里加了一个autorelease

        // Override point for customization after application launch. 在应用程序加载之后重写一些个性化的设置代码

       //设置颜色

        self.window.backgroundColor = [UIColor orangeColor];

        // makeKeyAndVisible 让窗口变成程序的主窗口,并且可视

        [self.window makeKeyAndVisible];//注释方法然后看UI变化,就知道这个方法了

        return YES;

    }

    //    UIView 视图类 所有在屏幕上能看到的都是他的子类或者控件

    //    总结 UIView 的属性  backgroundColor 视图背景颜色

    //    hidden     隐藏

    //     alpha     透明度  取值为(0-1)默认的是 1,完全不透明

    //     tag       唯一的标示

    //     subviews  子视图  NSArray(用数组存放)

    //     superview 父视图 用UIview

       

        view.hidden = YES;//隐藏中间的

        view.alpha = 0.6;

        view2.alpha = 0.3;

        view3.alpha = 0.3;

        view4.alpha = 0.3;

        view5.alpha = 0.3;

        //设置唯一的标示 通过 tag 可以用父视图的 viewWithTag 来找到这个被标示的视图  一般设为大于100

        view.tag = 101;

        UIView * aview = [self.window viewWithTag:101];

        NSLog(@"%@  %@",view,aview);//打印视图信息

        aview.hidden = NO;//不隐藏,就是显示

        //window 的子视图

        NSArray * views =  [self.window subviews];

        for (UIView * view in views) {

            NSLog(@"%@",view);

        }

        //子视图

        NSArray * viewArr =  self.window.subviews;

        NSLog(@"子视图有:%@",viewArr);

        // superview 找视图的父视图

        UIView * superView =  view.superview;

        NSLog(@"%@",superView);

    /**/------注释

    //创建一个绿色视图(50 50 100 50 )设置 tag 值,透明度为 0.6

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

        greenView.tag = 102;

        greenView.backgroundColor = [UIColor greenColor];

        greenView.alpha = 0.6;

    //    UIView * findGreen =  [self.window viewWithTag:102];//如果这里注释掉,运行后找不到此视图?????待解决

        [self.window addSubview:greenView];

        greenView.alpha = 0.6;

        [greenView autorelease];

        //Frame  相对于父视图的位置,大小。

        //bounds 一个视图的边界的大小 相对于自身的坐标的位置

        //获取 greenView frame

       NSString * frame = NSStringFromCGRect(greenView.frame);

        NSLog(@"%@",frame);

        NSString * point = NSStringFromCGPoint(greenView.frame.origin);

        NSLog(@"%@",point);

        CGFloat width = greenView.frame.size.width;

        CGFloat height = greenView.frame.size.height;

        NSLog(@"长度:%.f 宽度:%.f",width,height);

        [greenView autorelease];

     

    /**/

     //创建新视图 newView

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

        newView.backgroundColor = [UIColor redColor];

        //如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小

        //改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小

    //    newView.frame = CGRectMake(20, 20, 50, 50);

        //bounds 边界 相对于自身的坐标的位置 (也是一个结构体)

        //改变 bounds 影响他子视图的大小 位置

        //改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)<注意这里是重点,我觉得的的重点,多多的看几遍>

        newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小,只会改变(自身的坐标体系)自己的坐标原点

        //newView 上添加一个子视图(注意 子视图 坐标是相对于 newview)

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

        vie.backgroundColor = [UIColor greenColor];

        [newView addSubview:vie];

        [self.window addSubview:newView];

     

    //视图的属性 与视图的层级管理

     //创建新视图 newView

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

        newView.backgroundColor = [UIColor redColor];

        //如果改变一个视图的位置,影响的是一个视图相对于父视图的位置和大小,是参考于父视图的坐标体系去设置视图的 坐标和大小

        //改变视图的 frame (已经设置 有改变 就是相对于父视图的位置与大小

    //    newView.frame = CGRectMake(20, 20, 50, 50);

        //bounds 边界 相对于自身的坐标的位置 (也是一个结构体)

        //改变 bounds 影响他子视图的大小 位置

        //改变 bounds (后面的宽高,相当于对视图进行缩放、改变前面的 x y 影响自身的子视图)

        NSLog(@"改变 bounds 之前中心点坐标:%@",NSStringFromCGPoint(newView.center));

        newView.bounds = CGRectMake(50, 50, 150, 150);//他不会改变相对于父亲视图的大小(就是自身的中心点不会改变),只会改变(自身的坐标体系)自己的坐标原点,后面的两个值是管着自身的大小,就是缩放的效果

        //newView 上添加一个子视图(注意 子视图 坐标是相对于 newview)

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

        vie.backgroundColor = [UIColor greenColor];

        [newView addSubview:vie];

        [self.window addSubview:newView];

        [newView autorelease];

        [vie autorelease];

        //管理视图的层级关系

    //    [self.window bringSubviewToFront:uiView2];//uiView2 放到最上面

    //    [self.window sendSubviewToBack:uiView2];//uiView2 放到最下面

        

        //对于一个视图来说,他只有一个父视图,但是他可以有多个子视图,子视图永远在父视图的上面

        //对于一个子视图(subViews)中元素的位置和子视图添加的顺序一致,越晚放的视图就在数组的越后边,但是在显示的时候是先添加的最后显示,最后添加的先显示

        //晚添加的视图如果和之前的视图有重叠的部分,会覆盖掉之前的(有重叠的内容)

        //管理视图的层级关系,需要父视图(不管是添加视图:(addSubview 还是管理层级(bringSubviewToFront  sendSubviewToBack)

        //如果需要把一个视图从父亲的视图上移走的话。需要 用子视图调用 removeFromSuperview方法即可

        //如果想要交换两个视图的位置  exchangeSubviewAtIndex:  withSubviewAtIndex:

        [self.window exchangeSubviewAtIndex:0 withSubviewAtIndex:1];

        [uiView3 removeFromSuperview];

        //插入子视图在对应的下标的位置

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

        newV.backgroundColor = [UIColor redColor];

        [newV autorelease];

        //在创建了图层之后,我们释放了之后,还可以使用是因为在 addSubview 时候 会把他的引用计数器加1 self.window NSArray 的形式管理子视图

        //插入图层(insertSubview:newV atIndex:2 insertSubview:uiView2 aboveSubview:newV    insertSubview:uiView2 belowSubview:newV

        // window 子图层,在下标为 2 的地方 插入一个图层 newV

        [self.window insertSubview:newV atIndex:2];

        //在一个确定的视图上面插入一个视图

        //在视图 newV 上面插入 视图 uiView2

        [self.window insertSubview:uiView2 aboveSubview:newV];

        //在视图 newV 下面插入 视图 uiView2

        [self.window insertSubview:uiView2 belowSubview:newV];

  • 相关阅读:
    oracle数据库导出与导入
    Mysql导入表信息[Err] 1067
    Golang--不定参数类型
    (转)Docker容器的重启策略及docker run的--restart选项详解
    (转)Golang--使用iota(常量计数器)
    Golang--匿名变量
    Golang--Hello World
    Ubuntu Server16.04 配置网卡
    U盘安装ubuntu 16.04 遇到 gfxboot.c32:not a COM32R image boot 的解决方法
    ipfs私链服务
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/4759215.html
Copyright © 2011-2022 走看看